Oui aux rayures!

Nombreux sont les developpeurs qui sont encore confrontés à struts aujourd’hui en 2008, un peu moins de 8 ans après sa sortie! C’est une solution éprouvée qui apparait sans risques vue sa grande maturité et qui reste donc très implantée dans beacoup d’entreprises.

Les alternatives ne manquent pourtant pas avec l’émergence de nombreux frameworks tels que stripes, wicket, GWT, grails et j’en passe.

Aujourd’hui je vous présente stripes avec lequel j’ai eu l’occasion de travailler au cours de ma dernière mission.Commencons par le début, la mise en place. Stripes nécessite un filter et une servlet pour fonctionner. Il faut donc les configurer de manière classique dans le web.xml de sa webapp. Un exemple d’une telle configuration se trouve ici : http://www.stripesframework.org/display/stripes/Quick+Start+Guide. Ensuite ajoutez les jars stripes.jar, commons-logging.jar, log4j.jar et cos.jar puis mettez le fichier StripesResources.properties dans WEB-INF/classes et vous êtes parti. A partir de maintenant, la partie configuration se réduit au minimum puisque stripes ne contient aucun fichier xml de configuration!Et c’est là le grand point fort de stripes, tout est fait en annotations java 5. On a donc de manière très simple des jsps, des actionBeans et c’est tout. Pas de struts.xml, pas de validation.xml pas d’actionForms. En clair, moins d’artifacts donc moins d’erreurs.

Comment se fait le binding entre une url et une action me direz vous? En ne faisant rien 🙂

Stripes utilise le principe de “convention over configuration” sur ce point, et c’est donc le nom de votre actionBean qui determine le nom de votre action. Par exemple un action bean qui s’appelle fr.ippon.stripes.demo.TestActionBean sera accessible sur /demo/Test.action. Bien entendu il est quand même possible d’annoter votre classe pour donner une url spécifique au cas ou celle par défaut ne convient pas.

La relation entre les jsp et votre actionBean ne nécessite pas d’objet supplémentaire type ActionForm struts. En effet, stripes propose sa taglib html qui ira remplir les properties de l’actionBean automatiquement et fera les conversions de type qui vont bien. Les actions n’en deviennent que plus claires : on manipule les champs de la classe directement et il n’y a pas de cast de formulaire, de request.getParameter(“…”).

Autre chose très agréable, stripes instantie pour vous toutes les properties imbriquées nécessaires. Ainsi quelquechose comme <stripes:text name=”user.contact.street”/> instanciera un objet contact dans l’object user de l’actionBean si c’est nécessaire pour pouvoir remplir le champ ‘street’.

Les listes et les maps sont gérées de manières intuitives et efficaces. Déclarez une property private List persons; dans votre actionBean puis ecrivez tout simplement une boucle <c:foreach dans la jsp et stripes s’occupera d’instancier la liste, d’instancier l’objet de la liste (Person ici) et de remplir les champs, toujours avec les conversions de type qui vont bien.

En terme de validation, stripes passe par des annotations également. Ajoutez @Required sur un champ et il devient obligatoire dans votre formulaire. D’autres validation sont bien sur présentes de base. Concernant les validations de type, le simple fait de dire qu’une property est un integer force l’utilisateur à rentrer un int. Donc la encore, des solutions simples qui peuvent facilement être étendus.

Autre point agréable. Comment transmettre des listes de valeurs à afficher dans des select box avec struts? Passer par une action avant qui prépare la liste et la met en request puis la récuperer de l’autre coté. Pour stripes faire tout ca représente trop de travail. Dans ce cas il suffit juste d’appeler la jsp directement, de placer le tag <stripes:useActionBean bean/> et d’avoir un getter intelligent dans l’action. Le tag instancie alors l’actionBean et le getter doit juste renvoyer une liste qu’on passe en paramètre d’un tag stripes:options. Sympathique non?

Bien sûr il y a des tonnes d’autres petites choses qui facilitent la vie du développeur et réduise les erreurs et le temps de developpement d’une manière considérable. Parmi elle, l’intégration spring de base qui permet d’injecter ses services dans ses actionBean sans avoir à rajouter de plugins ou de réinventer une solution à chaque fois, le support d’ajax dans les actions grâce au StreamingResolution qui permet de renvoyer un bout de html par exemple.

Le but de ce post n’est pas de faire une liste exhaustive de tous ces petits trucs mais juste de vous mettre l’eau à la bouche pour que vous alliez voir par vous même.

En terme de points négatifs, pas grand chose à signaler. Il faut quand même avouer que même si la documentation fournie par stripes est très bien faite et complète, on ne trouve pas grand chose ailleurs. Les best practices ne sont pas évidentes à prendre en main puisque personne ne parle vraiment de ce framework… Il manque aussi de la validation coté client.

Bon assez parlé, allez jeter un coup d’oeil. Pour quelqu’un qui connait struts, prendre stripes en main n’est qu’une question d’heures donc pas d’excuse. Au boulot messieurs.