2010-03-04 4 views
4

Je dois convertir une date en une chaîne dans une page (je ne veux pas ajouter de charges de toStrings à mon modèle de domaine, donc l'ajout au haricot est pas une option).Facelettes et JSTL (conversion d'une date en chaîne pour utilisation dans un champ)

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

Le code ci-dessus fonctionne mais formate la date dans le format par défaut ... Je voudrais changer le format.

J'ai essayé d'utiliser JSTL fmt mais cela ne semble pas être compatible avec Facelets JSF Convert dates for title attribute. Y at-il une solution de contournement pour cela (ne doit pas utiliser JSTL)?

Merci.

+0

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

+0

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. –

+0

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

Répondre

6

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.

+0

Pour quelles versions de Facelets cela fonctionne-t-il? – Drew

+0

@Drew: La réponse était ciblée sur JSF 1.2 + Facelets 1.x, mais devrait également fonctionner pour JSF 2.0. Le 'param-name' de' facelets.LIBRARIES' est obsolète dans 2.0 (mais devrait toujours fonctionner) et doit être remplacé par 'javax.faces.FACELETS_LIBRARIES'. Si vous avez des problèmes, posez une nouvelle question et incluez les erreurs. – BalusC

+0

Fera, merci. – Drew

1

Vous pouvez utiliser une méthode de conversion dans votre haricot, comme:

public class Bean{ 
    ... 
     public String formatDate(Date fecha, String pattern) { 
      return (new SimpleDateFormat(pattern)).format(fecha); 
     } 
    ... 
} 

Et, dans votre page:

<ice:graphicImage value="bean.image" title="#{bean.formatDate(bean.date,'yyyy-MM-dd')}"/> 
+0

Pas vraiment une réponse à la question, mais ça m'a aidé. J'ai été bloqué en essayant de faire des ajax mises à jour sur un h: outputText avec un f: convertDateTime qui ne serait pas actualisé, recouru à la méthode backing bean comme indiqué. –