Wednesday, 14 March 2007

Comment créer un composant JSF (première partie)

Ça ne prend pas beaucoup de temps pour être séduit par JSF, et sa façon de simplifier le développement grâce aux composants (au lieu de coder du html, JavaScript, et css à la main, et réinventer la roue à chaque fois—car même en créant ses propres taglibs, on ne peut pas toujours encapsuler facilement les dépendances html et client-serveur de ceux-ci).

Mais pour un grand projet, avec des besoins plus poussées, on peut vite s'interroger sur la facilité de créer ses propres composants JSF. Car même si on peut puiser dans les ressources très larges des composants proposés par Sun, Oracle ADF Faces, JBoss RichFaces, Apache Tobago, Woodstock, et tant d'autres, il y aura toujours le besoin de créer des composants vraiment propres à son site ou entreprise. Alors, dans cette série d'articles, je donnerai un survol de la création d'un composant JSF, pour en expliquer ce que cela implique. Il faut souligner que les développeurs qui utiliseront vos composants ignoreront tous ces détails ; c'est là toute la beauté de JSF.

Le composant qu'on va développer ici est très simple, car on ne veut pas se perdre dans les détails. D'ailleurs j'assume que vous possédez déjà les connaissances JSF et JSP, notamment la création des taglibs il existe déjà beaucoup de bons tutoriaux sur ces sujets ailleurs, alors ce n'est pas la peine que je les rexplique ici. Il s'agira pour notre composant d'un simple tableau, dont on peut spécifier la classe CSS et le contenu, un value binding vers un List<Object[]>. Dans le JSP on pourra donc écrire
<craven:tableau contenu="#{SessionBean1.contenu}" styleClass="cool"/>, et à l'écran on aura  (avec les valeurs de notre List en session) :

Vous pouvez visualiser le produit final en direct ici.

Au minimum, il va falloir écrire deux classes Java pour faire un composant. Par convention, le nom de la premiére classe finira avec Tag, par exemple TableauTag (car notre composant s'appelle "Tableau"). Celle-ci gère les attributs de la balise. La seconde commencera par UI pour "User Interface" (IHM), comme UITableau, et sert à gérer l'état du composant, rendre sa répresentation visuelle, et digérer la saisie. C'est donc cette seconde classe qui est la plus complexe, alors on commencera par la très simple classe Tag.

  • D'abord, il faut que la classe qui va définir votre composant étend javax.faces.webapp.UIComponentTag. Ainsi il supportera d'office les attributs standards binding, id, et rendered.
  • Ensuite, il faut ajouter les getters et setters pour les autres attributs du tag que vous voulez définir (du genre max, min, value, etc.).
  • En plus de ça, il faut définir les méthodes public String getComponentType() (qui donne un identifiant pour votre composant, comme, pour notre exemple, "fr.craven.test.jsf.Tableau"), et public String getRendererType() (qui donne un Renderer, s'il n'y en a pas on retourne null.)
  • Aussi, il faut réimplementer void setProperties(UIComponent uic), en commençant systematiquement avec super.setProperties(uic);. Ensuite, on ajoute dans cette méthode le code pour ajouter vos propres propriétés dans l'objet UI que vous allez créer. Il faut prendre en compte que les propriétés peuvent être des value bindings, la méthode privée setProperty() dans le fichier exemple est une façon facile d'encapsuler tout ça.
  • Dernier étape, il faut implementer public void release(), qui commence systematiquement par super.release();, et qui remettra l'état de l'objet à l'état originel (en mettant tous vos propriétés à null).

Pour en voir l'exemple complet, regarder TableauTag.java.

Créez un fichier .tld comme pour n'importe lequel taglib, et on a fini pour ce qui est la partie JSP de notre composant ! Pour la deuxième partie du boulot (la classe UI qui rendra tout ça sur la page) voir la prochaine article dans cette série. (N'hésitez pas à laisser vos questions ou commentaires ci-dessous pour tout ce qui n'est pas clair ; je m'efforce d'être bref dans ces tutoriaux, mais il faut quand même que ce soit clair.)

Posted by jon at 11:33 PM in Java 
 
« March »
SunMonTueWedThuFriSat
    123
45678910
11121314151617
18192021222324
25262728293031
       
 
Non enim id agimus ut exerceatur vox, sed ut exerceat.