Bien qu'appréciant beaucoup wicket, il n'en est pas moins que ce framework présente des limites. C'est d'ailleurs l'intitulé d'un post sur "Tom's Quest" : les limites de Wicket.
Les points évoqués sont (le détail sur le blog):
- Le markup n’est pas toujours prévisualisable
- Wicket ne tient pas la charge
- Tester une application Wicket est difficile
- Les URLs générées sont moches
- Spring Security s’intègre mal à Wicket
- Wicket n’est pas un framework managé
- Wicket n’est pas outillé
- L’intégrable avec des frameworks JavaScript est difficile
A noter que l'auteur ne fait pas que lister d'éventuelles limites, il en discute et les commente, allant parfois au final jusqu'à les rejeter. Toutefois, j'ai parfois des avis divergents, aussi je vais discuter ces points un à un.
Nous disions donc :
- Le markup n’est pas toujours prévisualisable
certes, un Panel comprend une portion limitée d'html. Par conséquent, pas de vue d'ensemble avec un seul panel.
Toutefois, de mon expérience sur le sujet, le problème ne se pose pas ainsi.
En général, il y a d'abord une phase de maquettage, dans un format technologique assez simple afin que tout le monde puisse aisément communiquer sur le sujet (entre "product owner", designers et équipe IT). Une fois la maquette acceptée de part et d'autres, on passe alors à la partie implémentation dans la technologie cible.
Dans le cas de wicket, cela donne :
- html très proche de celui rendu : pas de tag lib complexe où l'html résulte d'une part d'un tag, éventuellement dans un langage intermédiaire genre xml webxfform assez loin de l'html, d'une autre part du code "serveur" (Java,.Net...) et enfin de la page html elle même. De même, pas/peu besoin de modifier du code applicatif pour gérer les aspects de style et mise en forme : on est toujours dans l'html/CSS pur, très proche donc de la maquette et du langage des designer. De quoi simplifier grandement les échanges.
- D'autres part, wicket permet de découper les différents éléments htmls ainsi que de les composer et/ou de les hériter. On compose donc vraiment une page structurée en différentes parties plus ou moins réutilisables. On peut donc etre au plus proche du principe "DRY/Don't Repeat Yourself", un peu de réflexion permettant d'éviter des copier/coller généralisés.
- Enfin, et dans une certaine mesure en contradiction du premier point, les Behavior permettent de réaliser des décorateurs de composant. Tous vos buttons doivent avoir la classe CSS "btn" ? Facile, appliquez un SimpleAttributeModifier si le composant est de type Button. Actuellement, dans le projet sur lequel je suis, nous appliquons un Decorator générique qui est en fait une composition de différents décorateurs, chacun s'appliquant que lorsqu'il se doit. Bien sûr, ce décorateur générique est projet spécifique, permettant de varier le tout suivant les besoins. Et si jamais on se lance de l'ajouter à chaque composant, rien d'empêche d'étendre les composants utilisés, d'y faire l'addition du décorateur de façon systématique puis de les utiliser. En gros, le "server side" n'entre en action que pour éviter les répétitions et les risques d'erreurs.
Bref, pour conclure, une souplesse rare pour un framework web, permettant de gérer l'html comme il se doit : un problème de designer, navigateur et CSS, et aucunement une lutte contre des limitations arbitraires imposées par le framework "server side".
A noter que ces avantagent s'appliquent aussi au cas inverse d'utilisation d'un framework, lors de la maintenance. Modifier du html d'un projet dont on hérite la maintenance ne relève donc pas du travail d'hercule, du moins pour le coté serveur...
- Wicket ne tient pas la charge
Sur ce point là, je renvoie toujours à la comparaison réalisée par Peter Thomas. Que peut on y constater ? Que wicket est parmi les mieux placés, même par rapport à un Tapestry 5 dont l'auteur dit s'être concentré sur les performances.
Wicket doit cela en grande partie, je pense, à la logique des IModel, et notamment du LoadableDetachableModel : ainsi, on peut gérer au mieux les objets, entre ceux récupérés de la DB qu'il ne vaut mieux pas persister dans la session (sauf pour l'id bien sur) et ceux qui doivent l'être (genre l'information d'état du moment).
Ceci dit, le "session bloat" existe. Malgré que les outils soient là (pour une fois aurai je envie de dire), on peut toujours mal s'en servir voir carrément s'en servir à contre sens. Mais cela relève plus de la compétence du développeur que du framework : aucun framework ne pourra se prévenir contre un mauvais usage.
- Tester une application Wicket est difficile
Sur ce point là, j'aurai envie de répondre... oui, mais le problème est, je pense, général aux applications web, qui sont toutes tiraillées entre html, css, javascript, navigateur et l'oeil de l'utilisateur. Pas facile de s'assurer que tout ce petit monde fonctionne qui il devrait.
Wicket propose le WicketTester pour tester les pages en isolation, sans avoir besoin de recourir à un automate. Toutefois cela semble limité avec Wicket 1.4 (mais devrait évoluer avec 1.5). Combien même, toute la partie interactive, notamment via javascript, est sévèrement limitée.
D'autres approches, via selenium par exemple, ont toutefois émergées, comme celle proposée par Kent Tong dans Wicket Page Test : pour peu que vous injectez vos éléments "métier" comme il se doit, il propose un framework à même de fournir des données de test et de tester leur rendu via selenium.
Pour ma part, je dois dire qu'il s'agit d'un problème ardu : les pages web sont les composants les plus visibles d'une pile applicative, mais aussi les éléments que l'on touche souvent le moins (surtout quand on a un fort recours à la composition). Enfin, les pages web sont également difficiles à tester correctement (pas d'API et de contrat clairement défini à respecter).
La solution que nous appliquons actuellement se veut pragmatique. Vu que nous avons fortement recours à la composition via des composants dédiés à des fonctionnalités précises, nous joignions de façon quasi systématique des pages de test mettant en œuvre ces composants. Ces pages sont à chaque fois dédiées à une fonctionnalité précise et présentent les différents cas d'utilisation.
Elles permettent à la fois de montrer des exemples que de vérifier que des modifications ne viennent pas tout casser : elles sont vraiment un apport important à la rapidité et sureté de développement (plutôt que de devoir cliquer sur 15 liens de son appli pour enfin atteindre le composant XY sur lequel on travaille, le tout dans un contexte bien limité).
Lorsqu'un composant est particulièrement important (pour le login par exemple) ou fréquemment cassé/changé, on met alors en place des tests via selenium, afin de tester du coté utilisateur. Ces tests sont en fait intégrés via des tests unitaires, ils tournent donc ensuite sur le serveur d'intégration : la solidité des composants ainsi testés est impressionnante. Toutefois, cela implique une certaine charge de mise en place puis de maintenance (les tests doivent évoluer avec le composant) : nous n'appliquons cette solution qu'avec parcimonie.
- Les URLs générées sont moches
Réponse facile : oui par défaut, mais ensuite on a énormément de choix pour avoir une stratégie qui correspond au plus près de nos besoins. Le wiki de wicket étant down suite à l'attaque récente d'Apache, voici une page du blog xebia introduisant les alternatives :
Readable url’s in Wicket – An introduction to wicketstuff-annotation.
De façon plus générale, le processus d'encodages/décodages des url est assez bien conçu pour permettre toutes les envies, si jamais les possibilités de wicket stuff ne sont pas suffisantes. L'HybridUrlEncodingStrategy, que nous utilisons, me semble d'ailleurs un excellent compromis en la matière de construction d'url A noter également, Wicket 1.5 a parmi ses objectifs une réécriture du code dédié à l'encodage/décodage des url afin de le rendre plus simple et plus souple. Bref, cela va encore s'améliorer !
- Spring Security s’intègre mal à Wicket
Je n'utilise pas Spring Security, je ne peux donc pas commenter
- Wicket n’est pas un framework managé
wicket n'a pas cédé à la mode (passée) du tout XML ou du tout "injection". Et comme le dit l'auteur du blog "c'est tant mieux" : wicket n'impose pas, il permet ! En effet, si vous voulez de l'injection de dépendance, wicket est ouvert à de nombreuses options et fait cela très bien. Perso, j'ai toujours été plus guice que spring, et l'intégration s'est faite sans soucis. En somme, plutot que de décider que vous devez utiliser tel framework d'injection de dépendances, tel format XML et tel technologie de persistence de données, wicket se contente de faire (très) bien la partie présentation et vous laisse libre champ pour le reste. Que du bonheur donc
- Wicket n’est pas outillé
Oui, mais le besoin d'outillage n'est pas criant. Le fait d'être très proche de l'html puis que du java permet déjà de reprendre une bonne partie de l'existant. Au demeurant, le plugin eclipse wicket bench vient d'être repris par Laughing Panda. Qui sait, l'outillage serait peut etre plus complet un de ces jours ?
- L’intégrable avec des frameworks JavaScript est difficile
De mon côté, nous utilisons beaucoup JQuery, et l'intégration se fait comme un charme. Seule précaution essentielle : laisser la partie Ajax à wicket. Pour le reste, intégrer des templates dans des composants wicket permet d'intégrer puis de réutiliser des composants JQuery de façon transparente en dehors du composant considéré. Simple et efficace. Là encore, au demeurant, la proximité de l'html avec celui qui est généré et utilisé côté client permet réellement une intégration simple et aisée.
A noter également que nous avons dû réaliser notre propre "framework" de gestion des dépendances vers les librairies javascript, s'appuyant sur un projet wicket stuff (ma mémoire me fait défaut pour le nom) afin d'utiliser des Content Delivery Network. Là encore, nous avons codé que peu de choses pour tirer le meilleur de ce qui est proposé actuellement
Voila pour ma réaction un poil exhaustive à cet article... J'espère ne pas m'être trop étalé...
Et, une autre fois, si le courage me revient, je me pencherai sur ma perception des forces (réutilisation via les composants, puissance de réalisation d'éléments web via la proximité avec le browser, l'html, le css et lejavascript, puissance de l'approche des IModel...) et faiblesses (quelques composants sont un cran en dessous des standards wicket, par exemple la modal window et le LinkTree, verbosité de Wicket, propertymodel non refactorisables...).
Au plaisir de vous lire !
++
joseph