Конвертировать даты в JSF для атрибута title в таблицу - PullRequest
5 голосов
/ 28 сентября 2011

Возможно ли в JSF преобразовать значение даты и поместить его в атрибут title? В аналогичном вопросе JSF Convert date для атрибута title был получен ответ, что это можно сделать с помощью 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>

1 Ответ

9 голосов
/ 28 сентября 2011

<f:convertDateTime> преобразует только атрибут value, но не другие атрибуты.В этом конкретном случае вам лучше всего создать собственную EL-функцию для этого.

Сначала создайте класс final с методом public static, который принимает необходимые аргументы и делегирует 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; для примера см. этот ответ )

Зарегистрируйте его как новый taglib в/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вместо этого контекстный параметр)

Объявите его в XHTML-файле Facelets как новое пространство имен 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()}.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...