Après plusieurs années de développement, Tapestry 5 pointe tout doucement le bout de son nez : la version 5.0.16 sera en effet marquée comme Release Candidate. C’est le moment oppportun pour faire une présentation rapide de ce framekwork, trop méconnu à mon goût.
Mais c’est quoi Tapestry?
Tapestry est un framework open-source pour le développement d’applications Web en Java au même titre que ses confrères les plus connus: Struts et JSF. Comme ce dernier, il s’agit d’un framework de type component-centric (à opposer à action-centric).
Là où un framework veillissant comme Struts (il existe quand même depuis 2001!) décompose vos développements Web en une succession d’opérations – saisie de l’utilisateur, soumission du formulaire, validation, traitement, redirection, affichage –, Tapestry propose au développeur de raisonner en terme de pages et de composants en occultant autant que possible les détails des couches inférieures : API Servlet, protocole HTTP, mais surtout le contexte stateless (session HTTP, requête, cookie). Un développeur Tapestry raisonne à la manière du développeur Java : il construit des objets et les décrits en terme de méthodes et de propriétés. Il n’a pas, sauf cas particulier, à se préoccuper de l’environnement HTTP sous-jacent.
Il s’agit là de caractéristiques que l’on retrouve de plus en plus dans les frameworks Web moderne, spécialement ceux de type component-centric. Mais avec Tapestry, ce n’est pas tant les fonctionnalités proposées qui compte mais la manière de procéder. Tapestry se veut être un framework de développement Web simple, élégant et efficace :
- Un framework léger, …
Tapestry 5 est un framework léger et peu intrusif. Ainsi, contrairement à Tapestry 4 et à d’autres frameworks de la place, les composants Tapestry 5 sont de simple POJOs. Ni contrainte (interface) ni héritage à assumer, le développeur est complètement libre dans son développement. C’est Tapestry 5 qui s’adaptera au code via son jeu d’annotation. Tout cela est possible grâce à une instrumentation massive des classes de composants via Javassist. - évènementiel, …
À l’instar de ce que l’on retrouve dans les frameworks d’IHM comme SWING, Tapestry est un framework évènementiel. Les composants définissent des gestionnaires d’évènements (event-handlers methods) qui seront déclenchés par le dispatcher lorsque l’évènement correspondant sera lancé. - *** Web 2.0 ready, …***
Un support AJAX est fournit par défaut avec l’inclusion des librairies Prototype et Scriptaculous. À cela, le framework ajoute des mécanismes sophistiqués d’injection de Javascript directement depuis vos classes de composants. Le framework produit également des URL RESTFul out-ot-the-box. - developer-friendly, …
Les composants et les pages sont rechargeables à chaud, sans outillage particulier, grâce à l’utilisation d’un classloader spécifique au framework. Il s’agit là d’un critère important pendant les phases de développement et, une fois qu’on y a gouté, on se demande pourquoi ce n’est pas une pratique généralisée. Couplons cela avec le plugin maven jetty:run (ou run-jetty-run pour son équivalent Eclipse) et l’on se retrouve avec un environnement de développement d’une légèreté rarement égalée dans ce domaine.
Le framework est fondé également sur le principe Convention plutot que Configuration que l’on retrouve souvent depuis l’avènement de RoR. - productif …
Quand tout va mal, Tapestry se place en compagnion idéal du développeur en proposant un rapport détaillé de la situation. En plus de la traditionnelle trace d’exécution, Tapestry 5 fournit dans la plupart des cas un message d’erreur intelligible suivi d’indice (hints) pour la correction. Ajoutons à cela la localisation précise de l’erreur au niveau du template ainsi que le liste des paramètres de requêtes, des headers, et des variables d’environnements. - et singulier.
Tapestry est un framework singulier dans la jungle des frameworks Web : le framework est en effet construit autour du conteneur IOC maison, tapestry-ioc, développé pour l’occasion. Il s’agit d’ailleurs là d’une récidive pour son développeur, Howard Lewis Ship, la version 4 du framework introduisant le conteneur léger Hivemind. Il se démarque de ses concurrents – Spring mais aussi Hivemind – par sa légèreté, son mécanisme de configuration distribuée et son absence complète de XML, le langage Java se suffisant à lui même pour décrire les relations entre les objets.