<f:convertDateTime>
преобразует только атрибут value
, но не другие атрибуты.В этом конкретном случае вам лучше всего создать собственную EL-функцию для этого.
Сначала создайте класс final
с методом public static
, который принимает необходимые аргументы и делегирует JSF DateTimeConverter
(имя пакета / класса / метода свободно на ваш выбор):
package com.example.util;
import java.util.Date;
import java.util.TimeZone;
import javax.faces.component.UIOutput;
import javax.faces.context.FacesContext;
import javax.faces.convert.DateTimeConverter;
public final class Functions {
private Functions() {
// Hide constructor.
}
public static String convertDateTime(Date date, String type, String dateStyle, String timeStyle, TimeZone timeZone) {
DateTimeConverter converter = new DateTimeConverter();
converter.setType(type);
converter.setDateStyle(dateStyle);
converter.setTimeStyle(timeStyle);
converter.setTimeZone(timeZone);
return converter.getAsString(FacesContext.getCurrentInstance(), new UIOutput(), date);
}
}
Определите его как facelet-taglib
в /META-INF/functions.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/util/functions</namespace>
<function>
<function-name>convertDateTime</function-name>
<function-class>com.example.util.Functions</function-class>
<function-signature>java.lang.String convertDateTime(java.util.Date, java.lang.String, java.lang.String, java.lang.String, java.util.TimeZone)</function-signature>
</function>
</facelet-taglib>
(примечание: для Facelets 2.x вам нужен XSD вместо DTD; для примера см. этот ответ )
Зарегистрируйте его как новый taglib в/WEB-INF/web.xml
:
<context-param>
<param-name>facelets.LIBRARIES</param-name>
<param-value>/META-INF/functions.taglib.xml</param-value>
</context-param>
(примечание: если вы уже определили facelets.LIBRARIES
, то вы можете просто добавить новый путь, разделенный запятыми; для Facelets 2.x вам потребуется javax.faces.FACELETS_LIBRARIES
вместо этого контекстный параметр)
Объявите его в XHTML-файле Facelets как новое пространство имен XML:
<html lang="en"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:uf="http://example.com/util/functions"
...
>
Наконец, вы можете использовать его по назначению:
<h:outputText
value="foo"
title="#{uf:convertDateTime(bean.date, 'both', 'medium', 'short', bean.timeZone)}" />
При необходимости вы можете жестко закодировать тип и стили в функции и присвоить методу другое имя, обозначающее эти значения по умолчанию.
Если вам случится использовать служебную библиотеку JSF OmniFaces , тогда вы также можете использовать вместо нее функцию #{of:formatDate()}
.