2011-09-28 62 views
4

JSF中可以將日期值轉換爲「title」屬性嗎?在類似的問題JSF Convert dates for title attribute中,有一個答案,它可以用JSTL的fmt:formatDate完成,但不能用於重複組件,如UIData。我需要在一個表內部擴展(擴展HtmlDataTable)。將JSF中的「標題」屬性轉換爲表中的日期

例如,下面的代碼正確顯示日期作爲文本值,而不是在標題屬性:

<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

您使用的是JSF 1.x還是2.x?你在使用JSP還是Facelets? – BalusC

+0

我正在使用JSF 1.2(或1.1)和Facelets。 – pkalinow

+0

謝謝。我發佈了一個答案。對於JSP而不是Facelets,你需要'/ WEB-INF'中的'.tld'文件而不是'.taglib.xml'。對於JSF 2.x而不是JSF 1.x,您需要以不同的方式重新聲明'.taglib.xml'的根元素(沒有文檔類型)。 – BalusC

回答

8

<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()}函數代替。

+0

非常感謝!我會試試看。 – pkalinow

+0

它按預期工作。謝謝! – pkalinow

+0

不客氣。 – BalusC