Posts tagged: JSTL

Cycle de vie Facelets et la JSTL

By , 28/09/2010

J’ai souvent lu dans des forums et des blogs que la JSTL ne s’intègre pas du tout avec Facelets et qu’il faut absolument éviter d’utiliser les deux technologies ensemble. C’est faux à condition de bien connaître Facelets :

Cycle de vie d’une requêtes Facelets

Rappelons d’abord le cycle de vie d’une requête JSF. Lorsque l’utilisateur demande une page JSF, sa requête provoque coté serveur l’exécution suivante :

  1. Restore view
  2. Apply request values
  3. Process validation
  4. Update model value
  5. Invoque application
  6. Render request

Avec Facelets, il y a un cycle de vie en deux phases :

  1. Compile : création d’un “component tree” dans une “UIViewRoot”
  2. Run (exécution du cycle de vie JSF)

On peut remarquer que Facelets fonctionne de la même façon que les JSP (compilation de la JSP puis exécution de cette dernière). Pourquoi ces deux phases existent-elles ? Facelets est composé des TagHandlers (compile-time) et des ComponentHandlers (invocation JSF). Voici la liste triée de ces composants :

Pour information, voici deux bons article sur le sujet pour aller plus loin dans les détails : http://www.ilikespam.com/blog/c:foreach-vs-ui:repeat-in-facelets et http://www.znetdevelopment.com/blogs/tag/facelets/.

Tag de la JSTL

Facelets n’implémente que certaines fonctions de la JSTL  :

  • <c:if/>
  • <c:forEach/>
  • <c:catch/>
  • <c:set/> (utilisation déconseillée)

Les autres tag de la JSTL ne fonctionnent pas car ils ne sont pas implémentés. C’est l’occasion de remarquer qu’en utilisant les tags JSTL dans une application Facelets, on ne se base pas sur la version standard des composants mais sur une version re-développée par Facelets.

Il faut donc se méfier car certains tag ne fonctionnent pas exactement de le même façon. Par exemple, l’attribut varStatus du tag <c:forEach/> pointe sur l’instance d’un objet de type com.sun.facelets.tag.jstl.core.IterationStatus et non de type javax.servlet.jsp.jstl.core.LoopTagStatus comme décrit dans la documentation de la JSTL. Certaines méthodes ne sont pas implémentées. Dans ce cas il est donc préférable de se fier qu’a la documentation de référence de Facelets et non celle de la JSTL. Pour la javadoc, je ne l’ai trouvé qu’en téléchargements Facelets ici.

Pour information, visiblement, dans JSF2.0, Facelets utilise désormais la version standardisée de la JSTL.

Workaround sur l’utilisation de <c:set/>

Lorsque l’on commence à utiliser la JSTL on est vite tenté d’utiliser des variables dans les boucles <c:forEach/> d’où l’utilisation du tag déconseillé <c:set/>. Il est cependant possible de contourner le problème en utilisant une autre fonctionnalité de Facelets. En effet, il est possible d’utiliser le tag <ui:include/> avec des paramètres pour contourner l’utilisation de la fonctionnalité déconseillée de la JSTL. Sans compter que cela permet de découper les pages XHTML en petits fragments ce qui peut rentre le code plus facile à lire et à maintenir.

Utiliser les fonctions JSTL avec l’EL de JSF

By , 09/09/2010

La JSTL est très utile dans le développements des pages JSP et JSF. Elle permet d’avoir à disposition une multitude de fonctionnalités sans avoir à repasser par une classe Java (opérations sur les dates, les chaines de caractères, etc.) voici un lien vers la javadoc : http://download.oracle.com/docs/cd/E17802_01/products/products/jsp/jstl/1.1/docs/tlddocs/index.html. Pour utiliser ces fonctions dans une page JSF avec du JSP :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<%@ page contentType="text/html" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<html>
     <h:outputText value="${fn:toLowerCase('CALIFORNIA')}"/>
</html>

Pour utiliser ces mêmes fonctions dans une page avec Facelets :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:z="http://www.qualcomm.com/jsf/core"
      xmlns:c="http://java.sun.com/jstl/core"
      xmlns:fn="http://java.sun.com/jsp/jstl/functions">
          <h:outputText value="#{fn:toLowerCase('CALIFORNIA')}"/>
</html>

Facelets et JSTL

By , 06/06/2010

Il est important de savoir que l’utilisation de Facelets est compatible avec l’utilisation de certaines fonctionnalités de la JSTL.

En lisant la documentation de Facelets, j’ai découvert que seulement cinq fonctions sont implémentées :

  • c:if
  • c:forEach
  • c:catch
  • c:set

J’ai aussi remarqué que leurs utilisations n’est pas toujours possible. Par exemple, il n’est pas possible de demander un c:if dans un ui:repeat. Dans ce cas, j’ai du remplacé le ui:repeat par un c:forEach pour que mon instruction conditionnelle soit prise en compte.

OfficeFolders theme by Themocracy