的<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;對於爲例e見this answer)
註冊爲新的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
definied,那麼你可以添加逗號分隔的新路徑;對於Facelets的2.x中,你需要javax.faces.FACELETS_LIBRARIES
方面PARAM代替)
聲明它自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()}
函數代替。
您使用的是JSF 1.x還是2.x?你在使用JSP還是Facelets? – BalusC
我正在使用JSF 1.2(或1.1)和Facelets。 – pkalinow
謝謝。我發佈了一個答案。對於JSP而不是Facelets,你需要'/ WEB-INF'中的'.tld'文件而不是'.taglib.xml'。對於JSF 2.x而不是JSF 1.x,您需要以不同的方式重新聲明'.taglib.xml'的根元素(沒有文檔類型)。 – BalusC