En effet, vous ne pouvez plus utiliser le "bon vieux" JSTL dans Facelets comme vous le feriez dans JSP. Facelets ne supporte qu'un sous-ensemble limited de JSTL (et l'a déjà intégré, le fichier JST JL est en fait superflu).
Vous êtes obligé d'écrire une étiquette personnalisée ou mieux, une fonction EL personnalisée, à cette fin.
Supposons que nous voulons être en mesure de le faire:
<ice:graphicImage ... title="#{fmt:formatDate(bean.date, 'yyyy-MM-dd')}" />
grossière approximation donc la même que la balise JSTL <fmt:formatDate>
peut faire, mais la saveur d'une fonction EL afin que vous puissiez l'utiliser partout sans la nécessité d'une étiquette "intermédiaire". Nous voulons qu'il prenne 2 arguments, un Date
et un motif SimpleDateFormat
. Nous voulons qu'il renvoie la date formatée en fonction du modèle donné.
d'abord créer une classe final
avec une méthode public static
qui fait exactement cela:
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);
}
}
Définissez ensuite comme un facelet-taglib
dans /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>
Puis familarize Facelets avec le nouveau taglib dans la existant :
<context-param>
<param-name>facelets.LIBRARIES</param-name>
<param-value>/META-INF/formatter.taglib.xml</param-value>
</context-param>
(note: si vous avez déjà le facelets.LIBRARIES
DÉFINIES, alors vous pouvez simplement ajouter le nouveau chemin commaseparated)
Définissez ensuite dans le Facelets fichier XHTML comme nouvel espace de noms 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"
...
>
Enfin, vous peut l'utiliser comme prévu:
<ice:graphicImage ... title="#{fmt:formatDate(bean.date, 'yyyy-MM-dd')}" />
Espérons que cela aide.
donc l'autre option était pas une option? (Faire le formatage juste dans getter). Si oui, pourquoi pas?Par exemple, ne voulez-vous pas coder en dur le motif dans le modèle mais plutôt dans la vue? S'il vous plaît élaborer, il peut y avoir des façons de contourner le nouveau problème lorsque vous faites juste le formatage dans le getter. – BalusC
Le formatage de date change partout sur chaque page Web (par exemple en-tête différent du titre etc) et notre modèle de domaine est grand et a des dates partout ... Je ne veux pas vraiment commencer à ajouter des charges de méthodes getDateString comme ceci n'appartient pas au domaine et devrait être séparé dans le modèle MVC. Ce serait idéal de pouvoir le faire sur la page JSF. –
OK. Pour résumer, le problème est plus que JSTL fmt taglib ne semble pas fonctionner dans Facelets. Quel JSF impl/version? Quel serveur impl/version? (edit: nevermind, vous avez déjà mentionné que dans l'autre sujet http://stackoverflow.com/questions/2373592/how-do-you-use-jstl JSF 2.1 avec Facelets sur Tomcat) – BalusC