Действительно, вы не можете использовать «старый добрый» JSTL в Facelets так, как вы это делаете в JSP. Facelets поддерживает только ограниченное подмножество JSTL (и оно уже встроено, JAR-файл JSTL фактически является излишним).
Для этой цели вы вынуждены написать пользовательский тег или, что лучше, пользовательскую функцию 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
в /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 с новым taglib в существующем /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
, вы можете просто добавить новый путь через запятую)
Затем определите его в XHTML-файле Facelets как новое пространство имен 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')}" />
Надеюсь, это поможет.