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 <fmt:formatDate>
标记可以做的事情是一样的,但是它具有 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.LIBRARIES
的 param-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(将日期转换为字符串以在字段中使用)的主要内容,如果未能解决你的问题,请参考以下文章