实际上,您不能再像在 JSP 中那样在 Facelets 中使用“旧的”JSTL。Facelets 仅支持有限的 JSTL 子集(并且已经内置,JSTL JAR 文件实际上是多余的)。
为此,您不得不编写自定义标签或更好的自定义 EL 函数。
假设我们希望能够做到这一点:
<ice:graphicImage ... title="#{fmt:formatDate(bean.date, 'yyyy-MM-dd')}" />
粗略地说,JSTL<fmt:formatDate>
标记可以做的事情是一样的,但是它具有 EL 函数的风格,这样您就可以在任何地方使用它,而无需“中间”标记。我们希望它接受 2 个参数,一个Date
和一个SimpleDateFormat
模式。我们希望它根据给定的模式返回格式化的日期。
首先final
使用一个方法创建一个类,该public static
方法正是这样做的:
package com.example.el;
import java.text.SimpleDateFormat;
import java.util.Date;
public final class Formatter {
private Formatter() {
// Hide constructor.
}
public static String formatDate(Date date, String pattern) {
return new SimpleDateFormat(pattern).format(date);
}
}
然后将其定义为facelet-taglib
in /META-INF/formatter.taglib.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE facelet-taglib PUBLIC
"-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN"
"http://java.sun.com/dtd/facelet-taglib_1_0.dtd">
<facelet-taglib>
<namespace>http://example.com/el/formatter</namespace>
<function>
<function-name>formatDate</function-name>
<function-class>com.example.el.Formatter</function-class>
<function-signature>String formatDate(java.util.Date, java.lang.String)</function-signature>
</function>
</facelet-taglib>
然后用现有的新标签库熟悉 Facelets /WEB-INF/web.xml
:
<context-param>
<param-name>facelets.LIBRARIES</param-name>
<param-value>/META-INF/formatter.taglib.xml</param-value>
</context-param>
(注意:如果您已经facelets.LIBRARIES
定义了,那么您可以添加新路径以逗号分隔)
然后在 Facelets XHTML 文件中将其定义为新的 XML 命名空间:
<html
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:fmt="http://example.com/el/formatter"
...
>
最后,您可以按预期使用它:
<ice:graphicImage ... title="#{fmt:formatDate(bean.date, 'yyyy-MM-dd')}" />
希望这可以帮助。