在JSF中为表中的"title"属性转换日期

pka*_*now 5 jsf date converter

在JSF中是否可以转换日期值并将其置于"title"属性中?在类似的问题中,JSF转换为title属性的日期,有一个答案,它可以用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>
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 9

<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);
    }

}
Run Code Online (Sandbox Code Playgroud)

将其定义为facelet-taglibin /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>
Run Code Online (Sandbox Code Playgroud)

(注意:对于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>
Run Code Online (Sandbox Code Playgroud)

(注意:如果你已经有了facelets.LIBRARIESdefinied,那么你可以添加新的路径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"
    ...
>
Run Code Online (Sandbox Code Playgroud)

最后,您可以按预期使用它:

<h:outputText 
    value="foo"
    title="#{uf:convertDateTime(bean.date, 'both', 'medium', 'short', bean.timeZone)}" />
Run Code Online (Sandbox Code Playgroud)

如有必要,您可以对函数中的类型和样式进行硬编码,并为方法指定一个不同的名称,以指示这些默认值.

如果您碰巧使用JSF实用程序库OmniFaces,那么您也可以使用其#{of:formatDate()}功能.