JSF中是否可以转换日期值并将其置于“title”属性中?在类似的问题JSF Convert dates for title attribute中,有一个答案,可以使用JSTL的fmt:formatDate
来完成,但不能在重复的组件中完成,例如UIData
。我需要在一个表(扩展的HtmlDataTable)中完成它。
例如,以下代码正确地将日期显示为文本值,但不会在title属性中显示:
<h:outputText class="yui-tip" title="#{task[col.attributeName]}" value="#{task[col.attributeName]}">
<f:convertDateTime type="both" dateStyle="medium" timeStyle="short" timeZone="#{userProfileBean.clientTimeZone}" />
</h:outputText>
答案 0 :(得分:9)
<f:convertDateTime>
仅转换value
属性,而不转换其他属性。在这种特殊情况下,最好的办法是为此创建自定义EL函数。
首先使用final
方法创建一个public static
类,该方法接受必要的参数并委托给JSF DateTimeConverter
(包/类/方法名称可以自由选择):< / p>
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;有关示例,请参阅this answer)
在/WEB-INF/web.xml
注册为新的taglib:
<context-param>
<param-name>facelets.LIBRARIES</param-name>
<param-value>/META-INF/functions.taglib.xml</param-value>
</context-param>
(注意:如果您已经定义了facelets.LIBRARIES
,那么您只需添加新路径commaseparated;对于Facelets 2.x,您需要javax.faces.FACELETS_LIBRARIES
上下文参数)
在Facelets XHTML文件中将其声明为新的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()}
函数。