gpt4 book ai didi

jsf - 将 JSF 中的日期转换为表中的 "title"属性

转载 作者:行者123 更新时间:2023-12-04 17:39:29 26 4
gpt4 key购买 nike

在 JSF 中是否可以转换日期值并将其放入“标题”属性中?在一个类似的问题中,JSF Convert dates for title attribute ,有一个答案,可以用 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>

最佳答案

<f:convertDateTime>只转换 value属性,而不是其他属性。在这种特殊情况下,最好的办法是为此创建一个自定义 EL 函数。

首先创建一个final带有 public static 的类接受必要参数并委托(delegate)给 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);
}

}

将其定义为 facelet-taglib/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>

(注意:对于 Facelets 2.x,您需要 XSD 而不是 DTD;示例参见 this answer)

将其注册为 /WEB-INF/web.xml 中的新标签库:
<context-param>
<param-name>facelets.LIBRARIES</param-name>
<param-value>/META-INF/functions.taglib.xml</param-value>
</context-param>

(注意:如果您已经定义了 facelets.LIBRARIES,那么您只需添加以逗号分隔的新路径;对于 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"
...
>

最后,您可以按预期使用它:
<h:outputText 
value="foo"
title="#{uf:convertDateTime(bean.date, 'both', 'medium', 'short', bean.timeZone)}" />

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

如果你碰巧使用 JSF 实用程序库 OmniFaces ,那么你也可以使用它的 #{of:formatDate()} 代替功能。

关于jsf - 将 JSF 中的日期转换为表中的 "title"属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7584583/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com