BT
x Votre opinion compte ! Merci de bien vouloir répondre au sondage InfoQ concernant vos habitudes de lecture !

JSF 2.2 et HTML5

par Charles Humble , traduit par Nicolas Frankel le 14 août 2013 |

Bien qu'il ne s'agisse que d'une version mineure, les mises à jour de JSF 2.2, en particulier la faculté de passer des attributs HTML sans que les composants JSF n'aient besoin de les connaître, sont importants pour les développeurs souhaitant utiliser les technologies HTML5 dans une application JSF.

Parmi les nombreuses fonctionnalités de HTML5 figure une série de nouveaux attributs pour les éléments existants. Ces attributs incluent l'attribut type pour les éléments input, et supporte des valeurs comme text, search, email, url, tel, range, number et date. De plus, il existe une plage d'attributs informatifs dont le but est d'attacher de petits lots de données aux éléments HTML. Ceux-là ne sont pas affichés, mais peuvent être récupérés via JavaScript.

Pour une bibliothèque basée sur les composants comme JSF, cela pose un problème car les composants JSF existants doivent être mis à jour pour reconnaître ces nouveaux attributs. Pour les composants qui doivent les supporter explicitement, cela fait du sens, mais dans bien des cas, un composant n'a pas besoin de faire plus qu'inclure ce nouvel attribut dans le balisage qu'il produit au final. Les attributs passants réalisent exactement cela.

Un attribut passant peut être utilisé de 3 manières depuis un Facelet :

  • Via un attribut d'un espace de nom sur la balise de composant :
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:p="http://java.sun.com/jsf/passthrough">
    <h:form>
        <h:inputText value="#{bean.value}" p:placeholder="Enter text"/>
    </h:form>
</html>
  • En utilisant un TagHandler enfant f:passThroughAttribute pour un unique attribut :
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core">
    <h:form>
        <h:inputText value="#{bean.value}" >
            <f:passThroughAttribute name="placeholder" value="Enter text" />
        </h:outputText>
    </h:form> 
</html>
  • En utilisant un TagHandler enfant f:passThroughAttributes pour plusieurs attributs :
<h:outputText value="Something" >
    <f:passThroughAttributes value="#{bean.multipleAttributes}" />
</h:outputText>

#{bean.multipleAttributes} se réfère à une Map. Ses valeurs peuvent être indifféremment des valeurs littérales ou des expressions.

En utilisation l'Expression Language 3 (qui fait également partie de Java EE 7), plusieurs attributs peuvent être valorisés directement en utilisant une expression EL :

<h:outputText value="Something" >
    <f:passThroughAttributes value="{"one":1, "two":2, "three":3}" />
</h:outputText>

L'intérêt de ces modification est qu'il est maintenant possible pour un développeur d'écrire une vue JSF en utilisant du HTML pur, un avantage souvent cité par les frameworks concurrents comme Wicket.

Depuis le serveur, les attributs peuvent être valorisés en Java avec les nouvelles méthodes getPassThroughAttributes()et getPassThroughAttributes(boolean create)de UIComponent :

UIComponent component = new SomeComponent();
Map passThrough = component.getPassThroughAttributes();
passThrough.put("placeholder", "Enter text");

Aux côtés de cette capacité, JSF 2.2 introduit un certain nombre d'améliorations importantes dont Faces Flow et les Vues sans Etat.

Faces Flow

Faces Flow est inspiré par Task Flows d'ADF et Web Flow de Spring. Il apporte un support direct pour une navigation qui transporte l'utilisateur à travers un jeu de pages et un certain nombre de cas d'utilisation liés. Un flux est défini comme la navigation entre des "noeuds", où un noeud peut être :

  • Une Vue : N'importe quelle page JSF de l'application
  • Un Appel de Méthode : invoque de la logique applicative depuis un graphe de navigation via une EL
  • Un Aiguillage : Décisions de navigation dans le flux du graphe basé sur un booléen EL
  • Un Appel de Flux : Appel un autre flux avec des paramètres et reçoit des valeurs de retour
  • Un Retour de Flux : Retour vers le flux appelant

Les noeuds définissent les points d'entrée et de sortie d'un flux.

Deux nouvelles annotations sont introduites :

  • @FlowScoped est un périmètre CDI qui limite le périmètre d'un bean au flux spécifié. Il permet l'activation/passivation automatique du bean lorsque l'on pénètre/sort du périmètre.
  • @FlowDefinition est une annotation de classe qui permet à la définition du flux d'être défini à l'aide de l'API FlowBuilder.

En dernier lieu, un nouvel objet EL - #{flowScope} pour le stockage local au flux est introduit. Il correspond à facesContext.getApplication().getFlowHandler().getCurrentFlowScope().

Vues sans Etat

Beaucoup de frameworks, en particulier les frameworks de composant sont avec état. Il existe des avantages liés au fait de ne pas avoir besoin d'un maintenir un état. Peut-être le plus important est d'éviter d'avoir à répliquer l'état sur tous les noeuds d'un cluster, ou à utiliser l'affinité de session pour s'assurer que les requêtes soient bien traitées par leur noeud d'origine. D'autres avantages souvent cités sont moins pertinents. La Performance et la consommation Mémoire peuvent être une problématique pour les frameworks web à état, bien qu'en pratique elles soient triviales pour une majorité d'applications d'entreprise. Il existe un impact pour la valorisation et le stockage de l'état, mais la Sauvegarde Partielle d'Etat de JSF 2.x où seules les modifications de l'état sont sauvegardées est plutôt efficace et de la même manière, la mémoire utilisée pour stocker l'état est assez réduite.

L'implémentation sans état de JSF est simple. Le TagHandler pour a maintenant un attribut booléen transientet il le passe à UIViewRoot#setTransient. Si la page est transiente, le StateManager JSF ne stocke aucune donnée relative à cette vue, et pendant la phase de restauration de la vue, aucun état ne lui est appliqué.

Il existe un grand nombre d'autres changements plus mineurs. L'article d'Arjan Tijm sur J-Development en donne une vision plus exhaustive.

Bonjour étranger!

Vous devez créer un compte InfoQ ou cliquez sur pour déposer des commentaires. Mais il y a bien d'autres avantages à s'enregistrer.

Tirez le meilleur d'InfoQ

Donnez-nous votre avis

Html autorisé: a,b,br,blockquote,i,li,pre,u,ul,p

M'envoyer un email pour toute réponse à l'un de mes messages dans ce sujet
Commentaires de la Communauté

Html autorisé: a,b,br,blockquote,i,li,pre,u,ul,p

M'envoyer un email pour toute réponse à l'un de mes messages dans ce sujet

Html autorisé: a,b,br,blockquote,i,li,pre,u,ul,p

M'envoyer un email pour toute réponse à l'un de mes messages dans ce sujet

Discuter

Contenu Éducatif

Rien ne serait possible sans le soutien et la confiance de nos Sponsors Fondateurs:

AppDynamics   CloudBees   Microsoft   Zenika
Feedback Général
Bugs
Publicité
Éditorial
InfoQ.com et tous les contenus sont copyright © 2006-2014 C4Media Inc. InfoQ.com est hébergé chez Contegix, le meilleur ISP avec lequel nous ayons travaillé.
Politique de confidentialité
BT