Entre Struts et JSF mon coeur balance… En fait pas du tout. Après avoir mis le nez dans le code, je pense que les 2 ne sont pas antagonistes. Il est d’ailleurs possible d’intégrer Struts et JSF au sein d’une même application. Cependant ces 2 Frameworks se recoupent et il n’est pas évident de choisir l’un ou l’autre lorsque l’on commence à développer une application Web J2EE. Avant de vous donner mon avis, j’ai traduit et adapté un article de Roland Barcia dispo en anglais ici
Quelles sont les différences entre JSF et Struts ?
Tout d’abord JSF est jeune. Par rapport à Struts, la première version de JSF est sortie en main 2004. Struts au contraire est maintenant un framework mature. En cours de dévelopement, il est plus facile de trouver de l’aide pour Struts que pour JSF.
Au niveau du design, je pense que JSF est plus puissant que Struts, surtout pour la partie View.
Struts se base sur un FrontController et le pattern Command. JSF est basé sur le pattern Page Controller. Pour Struts, une servlet recupere la requête HTTP et transforme en ActionForm les paramètres avant de déléguer le tout à une Action class. Cela permet de coder simplement et rapidement des actions. L’inconvénient est qu’une seule Action est executée par appel. Le Model et les Actions (Controller) sont parfois mélangés.
JSF est basé sur le pattern Page Controller. Chaque requête passe par une seule servlet comme Struts à la différence que cette servlet recupère une Page complète avec ses composants (Input type, label, table…) et ensuite va déclencher des évenements pour chacun d’eux. En plus du contexte de la page il existe donc un contexte de vue (FacesContext). La partie rendu est ensuite déléguée à une couche de présentation qui se charge de rendre du HTML, du WAP ou autre. Les objets de votre modèle peuvent être cablé avec des componsants JSF (label, text, table) directement dans la page JSP en utilisant la syntaxe JSF EL (Expression Language). Lorsque l’utilisateur modifie et retourne la page vers le serveur, JSF peut mettre à jour le modèle de données automatiquement. C’est le principe du Backed Beans. JSF d’un point de vue évenement peut gérer le changement d’état de plusieurs composants sur une seule page et donc, par la gestion d’event inspirée de Swing, effectuer plusieurs tâches par requêtes. Côté Struts on ne gère qu’um seul évenement par requête. Enfin les ActionForms doivent étendre les class de Struts, ce qui force votre model à dépendre de Struts alors que JSF gére des POJO (Plain Old Java Object) ou Bean sans aucunes dépendances. La partie modèle de votre application avec JSF n’a aucunes dépendances sur JSF. D’ailleurs dans notre application de monitoring, nous nous contentons d’envoyer des simples POJO pour décrire une machine, une application et un processus.
Côté navigation les deux frameworks sont similaires. Cependant JSF ajoute en plus la possibilité de déclarer sur un élément de la page le nom de la vue suivante à afficher et à déléguer la partie « action » à une méthode.
Pour la mise en page et l’intégration, JSF permet d’écrire ses propres composants. MyFaces propose des composants vraiment puissant comme Tree2 que nous utilisons dans notre application.
Est-ce que JSF est mieux que Struts ? Il est bien trop tôt pour y répondre. Tout d’abord historiquement, Craig McClanahan l’un des auteurs de Struts a participé aux spécifications de JSF. Il est donc clair que l’un n’est pas le concurent de l’autre. Lisez ce post de Craig où il donne son point de vue sur JSF et Struts. Sa conclusion est que JSF est plus puissant que Struts sur la partie View, et que Struts dans le future devra se concentrer sur la partie Model-Controller. Il y a d’ailleurs une librairie Struts-Faces qui permet de faciliter l’intégration de JSF sur une appli utilisant Struts.
Le problème: Struts est un framework 100% MVC, alors que JSF est un framework basé sur la page que voit l’utilisateur. Avec Struts vous devez coder l’action doLogin et la câbler pour qu’elle soit déclencher lorsque l’utilisateur effectue une action précise.
Avec JSF vous pouvez:
- – déclarer que doLogin est appelé si l’utilisateur clique sur le bouton Submit
- – appeler la fonction doLogin parce que le champ Login et le champ Password ont été rempli
- – valider que le champ « Login » n’est pas vide et fait au moins 8 caractères grâce à un Validator
- – afficher en anglais, en japonais ou autre les labels « Login: » et « Password: »
- – ne pas afficher par exemple le bouton Submit si l’utilisateur est déjà authentifié
- – etc…
La différence est assez énorme: Struts est basé sur des Actions définies, JSF est basé sur un GUI représenté dans un navigateur sur lequel l’utilisateur a la possibilité de tout faire. Vous voyez pourquoi JSF gére plusieurs événement à la fois ? JSF est donc adapté lorsque ce que vous représentez à l’utilisateur est un GUI complexe composé de plusieurs actionneurs. Sinon pour la petite histoire, JSF est fortement inspiré des WebForms du framework Microsoft ASP.NET.
Voici donc les liens que j’ai le plus visité sur mon Bookmark JSF avec Firefox:
- JSF Tutorial très complet, avec des tutoriaux.
- JSF QuickStart est un tutorial qui explique les grands principes de JSF.
- MyFaces est une implémentation open-source de JavaServer(tm) Faces
- La page de SUN sur JSF donne accès à des articles, des FAQ et la possibilité de télécharger l’implémentation de référence.
- JavaServerFaces sur Java.Net est le site de la communauté open-source Java.Net sur JSF. C’est ici que l’on peut suivre le boulot des développeurs de l’implémentation de référence.