JSTL格式:混淆IllegalargumentException

时间:2013-05-21 15:48:11

标签: jsp jstl

我在会话范围内有一个 formatobject 对象,其成员类型为SimpleDateFormat sdf,基于模式“dd.MM.yyyy HH:mm:ss”。

我想使用JSTL格式化标记库来格式化输出:

<fmt:formatDate value="${dataobject.date}" pattern="${formatobject.sdf}"/>

这给了我以下例外:

org.apache.jasper.JasperException: java.lang.IllegalArgumentException: Illegal pattern character 'j'

当我尝试以下操作时,它按预期工作:

<fmt:formatDate value="${dataobject.date} pattern="dd.MM.yyyy HH:mm:ss"/>

令人困惑......你有什么想法吗?

1 个答案:

答案 0 :(得分:2)

pattern属性必须引用代表模式的String,而不是围绕模式构建的具体SimpleDateFormat实例。


对具体问题

无关SimpleDateFormat 线程安全,但您的尝试意味着它已在formatobject的构造函数中创建并重用会话/应用程序。这个不对。必须在线程本地(即方法块内)声明和创建SimpleDateFormat。模式是唯一可以成为常数的部分。

所以,总而言之,这是对的:

public class Formatter {

    private static final String PATTERN = "dd.MM.yyyy HH:mm:ss";

    public String format(Date date) { // Just an example. No idea how you're further using it.
        return new SimpleDateFormat(PATTERN).format(date); // Always create SimpleDateFormat in method local scope. Never create it as instance variable.
    }

    public String getPattern() {
        return PATTERN;
    }

}

<fmt:formatDate ... pattern="#{formatter.pattern}" />