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

Posted

技术标签:

【中文标题】Facelets 和 JSTL(将日期转换为字符串以在字段中使用)【英文标题】:Facelets and JSTL (Converting a Date to a String for use in a field) 【发布时间】:2011-01-23 15:27:00 【问题描述】:

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

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

上面的代码可以工作,但将日期格式化为默认格式...我想更改格式。

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

谢谢。

【问题讨论】:

所以其他选项不是一个选项? (在 getter 中进行格式化)。如果是这样,为什么不呢?例如,您是否不想在模型中硬编码模式,而是在视图中?请详细说明,在 getter 中直接进行格式化时,可能有办法解决新问题。 每个网页上的日期格式都在变化(例如标题与标题等不同),我们的域模型很大并且到处都有日期......我真的不想开始添加 getDateString 方法的负载,因为这不属于域,应该在 MVC 模型中分开。最好能在 JSF 页面上执行此操作。 好的。总而言之,问题更多在于 JSTL fmt taglib 似乎在 Facelets 中不起作用。哪个 JSF 实现/版本?哪个服务器实现/版本? (编辑:没关系,你已经在另一个主题 ***.com/questions/2373592/how-do-you-use-jstl JSF 2.1 with Facelets on Tomcat 中提到过) 我正在使用 Icefaces,如果这有什么不同的话 另一个例子是,如果我想与文本的超链接字符串+双精度的组合,我想格式化双精度...例如value="#currency price" 【参考方案1】:

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

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

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

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

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

首先使用public static 方法创建一个final 类,该方法正是这样做的:

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


然后在/META-INF/formatter.taglib.xml中定义为facelet-taglib

<?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 中的新标记库熟悉 Facelets:

<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')" />

希望这会有所帮助。

【讨论】:

@Drew:答案是针对 JSF 1.2 + Facelets 1.x,但也应该适用于 JSF 2.0。 facelets.LIBRARIESparam-name 在 2.0 中已弃用(但仍应有效),需要替换为 javax.faces.FACELETS_LIBRARIES。如果您有任何问题,请提出一个新问题并包含错误。【参考方案2】:

您可以在 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')"/>

【讨论】:

不是这个问题的真正答案,但它帮助了我。尝试使用不会刷新的 f:convertDateTime 对 h:outputText 进行 ajax 更新时卡住了,如图所示,求助于支持 bean 方法。

以上是关于Facelets 和 JSTL(将日期转换为字符串以在字段中使用)的主要内容,如果未能解决你的问题,请参考以下文章

如何创建自定义 Facelets 标签?

Facelets

无法将字符串转换为日期和日期转换为字符串 Swift 5.2

翩翩。将字符串转换为日期和日期转换为整数。

将字符串转换为日期和日期时间

jstl-日期格式化-jsp页面需引入fmt标签