4

我需要在页面中将日期转换为字符串(我不想将大量 toStrings 添加到我的域模型中,因此添加到 bean 不是一种选择)。

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

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

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

谢谢。

4

2 回答 2

6

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

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

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

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

粗略地说,JSTL<fmt:formatDate>标记可以做的事情是一样的,但是它具有 EL 函数的风格,这样您就可以在任何地方使用它,而无需“中间”标记。我们希望它接受 2 个参数,一个Date和一个SimpleDateFormat模式。我们希望它根据给定的模式返回格式化的日期。

首先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-taglibin /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>

然后用现有的新标签库熟悉 Facelets /WEB-INF/web.xml

<context-param>
    <param-name>facelets.LIBRARIES</param-name>
    <param-value>/META-INF/formatter.taglib.xml</param-value>
</context-param>

(注意:如果您已经facelets.LIBRARIES定义了,那么您可以添加新路径以逗号分隔)

然后在 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')}" />

希望这可以帮助。

于 2010-03-04T17:39:00.920 回答
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')}"/>
于 2015-06-23T14:10:02.063 回答