我在会话范围内有一个 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"/>
令人困惑......你有什么想法吗?
答案 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}" />