Facelets和JSTL(将日期转换为字符串以在字段中使用)

时间:2010-03-04 11:25:41

标签: jsf jstl facelets

我需要将一个Date转换为一个页面内的字符串(我不想将toStrings的负载添加到我的域模型中,因此添加到bean不是一个选项。)

<ice:graphicImage value="bean.image" title="#{bean.date}"/>

以上代码有效,但以默认格式格式化日期...我想更改格式。

我尝试过使用JSTL fmt,但这似乎与Facelets JSF Convert dates for title attribute不兼容。是否有解决方法(不必使用JSTL)?

感谢。

2 个答案:

答案 0 :(得分:6)

实际上,你不能像在JSP中那样在Facelets中使用“老旧的”JSTL。 Facelets仅支持JSTL的limited子集(并且已经内置,JSTL JAR文件实际上是多余的)。

为此,您不得不编写自定义标签或更好的自定义EL功能。

我们假设我们希望能够做到这一点:

<ice:graphicImage ... title="#{fmt:formatDate(bean.date, 'yyyy-MM-dd')}" />

粗略地说JSTL <fmt:formatDate>标签可以做什么,但后来就是EL功能的味道,这样你就可以在任何地方使用它而不需要“中间”标签。我们希望它采用2个参数,DateSimpleDateFormat模式。我们希望它根据给定的模式返回格式化的日期。

首先使用final方法创建一个public static类,该方法完全符合以下条件:

package com.example.el;

import java.text.SimpleDateFormat;
import java.util.Date;

public final class Formatter {

    private Formatter() {
        // Hide constructor.
    }

    public static String formatDate(Date date, String pattern) {
        return new SimpleDateFormat(pattern).format(date);
    }

}

然后在facelet-taglib中将其定义为/META-INF/formatter.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/el/formatter</namespace>
    <function>
        <function-name>formatDate</function-name>
        <function-class>com.example.el.Formatter</function-class>
        <function-signature>String formatDate(java.util.Date, java.lang.String)</function-signature>
    </function>    
</facelet-taglib>

然后在现有的/WEB-INF/web.xml

中使用新的taglib熟悉Facelets
<context-param>
    <param-name>facelets.LIBRARIES</param-name>
    <param-value>/META-INF/formatter.taglib.xml</param-value>
</context-param>

(注意:如果你已经确定facelets.LIBRARIES,那么你可以添加新的路径commaseparated)

然后在Facelets XHTML文件中将其定义为新的XML命名空间:

<html 
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:fmt="http://example.com/el/formatter"
    ...
>

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

<ice:graphicImage ... title="#{fmt:formatDate(bean.date, 'yyyy-MM-dd')}" />

希望这有帮助。

答案 1 :(得分:1)

您可以在bean中使用转换器方法,如:

public class Bean{
    ...
        public String formatDate(Date fecha, String pattern) {
            return (new SimpleDateFormat(pattern)).format(fecha);
        }
    ...
}

并且,在您的页面中:

<ice:graphicImage value="bean.image" title="#{bean.formatDate(bean.date,'yyyy-MM-dd')}"/>