Facelets и JSTL (преобразование даты в строку для использования в поле) - PullRequest
4 голосов
/ 04 марта 2010

Мне нужно преобразовать Date в строку на странице (я не хочу добавлять множество toStrings в мою модель домена, поэтому добавление в bean-компонент не является опцией).

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

Приведенный выше код работает, но форматирует дату в формате по умолчанию ... Я хотел бы изменить формат.

Я пытался использовать JSTL fmt, но это не похоже на Facelets JSF Конвертировать даты для атрибута title Есть ли обходной путь для этого (не должен использовать JSTL)?

Спасибо.

Ответы [ 2 ]

6 голосов
/ 04 марта 2010

Действительно, вы не можете использовать «старый добрый» JSTL в Facelets так, как вы это делаете в JSP. Facelets поддерживает только ограниченное подмножество JSTL (и оно уже встроено, JAR-файл JSTL фактически является излишним).

Для этой цели вы вынуждены написать пользовательский тег или, что лучше, пользовательскую функцию 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-taglib в /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 с новым taglib в существующем /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, вы можете просто добавить новый путь через запятую)

Затем определите его в XHTML-файле Facelets как новое пространство имен 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')}" />

Надеюсь, это поможет.

1 голос
/ 23 июня 2015

Вы можете использовать метод преобразования в вашем 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')}"/>
...