<?xml version="1.0" encoding="UTF-8"?> <rss
version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
xmlns:media="http://search.yahoo.com/mrss/"
> <channel><title>Blog Xebia France &#187; Wicket</title> <atom:link href="http://blog.xebia.fr/tag/wicket/feed/" rel="self" type="application/rss+xml" /><link>http://blog.xebia.fr</link> <description>J2EE, Agilité et SOA</description> <lastBuildDate>Wed, 08 Feb 2012 09:23:16 +0000</lastBuildDate> <language>fr</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=</generator> <copyright>CC BY-NC-ND 2.0 http://creativecommons.org/licenses/by-nc-nd/2.0/fr/</copyright> <managingEditor>blog-france@xebia.com (Xebia France)</managingEditor> <webMaster>blog-france@xebia.com (Xebia France)</webMaster> <ttl>1440</ttl> <image> <url>http://blog.xebia.fr/videos/xebia-podcast.png</url><title>Blog Xebia France</title><link>http://blog.xebia.fr</link> <width>144</width> <height>144</height> </image> <itunes:new-feed-url>http://blog.xebia.fr/feed/podcast/</itunes:new-feed-url> <itunes:subtitle>Les podcasts de Xebia France vous permettent de suivre l&#039;actualité autour de Java, de l&#039;agilité, des technologies Web et bien d&#039;autres. Xebia France est une entreprise spécialisée dans les technologies Java et JEE en environnement agi[...]</itunes:subtitle> <itunes:summary>Les podcasts de Xebia France vous permettent de suivre l&#039;actualité autour de Java, de l&#039;agilité, des technologies Web et bien d&#039;autres. Xebia France est une entreprise spécialisée dans les technologies Java et JEE en environnement agile.</itunes:summary> <itunes:keywords>Xebia, Java, JEE, SOA, Agile, Méthodes, Agiles</itunes:keywords> <itunes:category text="Technology" /> <itunes:category text="Technology"> <itunes:category text="Software How-To" /> </itunes:category> <itunes:category text="Technology"> <itunes:category text="Tech News" /> </itunes:category> <itunes:author>Xebia France</itunes:author> <itunes:owner> <itunes:name>Xebia France</itunes:name> <itunes:email>blog-france@xebia.com</itunes:email> </itunes:owner> <itunes:block>no</itunes:block> <itunes:explicit>no</itunes:explicit> <itunes:image href="http://blog.xebia.fr/videos/xebia-podcast.png" /> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2011/06/07/revue-de-presse-xebia-214/</link> <comments>http://blog.xebia.fr/2011/06/07/revue-de-presse-xebia-214/#comments</comments> <pubDate>Tue, 07 Jun 2011 11:19:43 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[DeployIt]]></category> <category><![CDATA[Grails]]></category> <category><![CDATA[JRebel]]></category> <category><![CDATA[octo]]></category> <category><![CDATA[Selenium]]></category> <category><![CDATA[USI]]></category> <category><![CDATA[USI 2011]]></category> <category><![CDATA[Wicket]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=7979</guid> <description><![CDATA[La revue de presse de l’actualité Java/JEE hebdomadaire proposée par Xebia. Le coin de la technique Sortie de Grails 1.4M1 JRebel &#171;&#160;reloaded&#160;&#187; en V4 Selenium 2.0 RC1 Evénements de notre communauté en France et à l&#8217;étranger Xebia poursuit l&#8217;aventure au challenge Octo 2011 Le coin de la technique Sortie de Grails 1.4M1 La première Milestone [...]]]></description> <content:encoded><![CDATA[<p><img
style="margin: 1em 1em 1em 1em; float: right;" src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" /></p><p><em>La revue de presse de l’actualité Java/JEE hebdomadaire proposée par Xebia.</em></p><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2011/06/07/revue-de-presse-xebia-214#SortiedeGrailsM">Sortie de Grails 1.4M1</a></li><li><a
href="http://blog.xebia.fr/2011/06/07/revue-de-presse-xebia-214#JRebelreloadedenV">JRebel &laquo;&nbsp;reloaded&nbsp;&raquo; en V4</a></li><li><a
href="http://blog.xebia.fr/2011/06/07/revue-de-presse-xebia-214#SeleniumRC">Selenium 2.0 RC1</a></li></ul><p><strong>Evénements de notre communauté en France et à l&#8217;étranger</strong></p><ul><li><a
href="http://blog.xebia.fr/2011/06/07/revue-de-presse-xebia-214#Xebiapoursuitlaventureauchalle">Xebia poursuit l&#8217;aventure au challenge Octo 2011</a></li></ul><h3><a
name="Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="SortiedeGrailsM"></a>Sortie de Grails 1.4M1</h4><p>La première Milestone de Grails 1.4 vient de pointer le bout de son nez ! Au programme :</p><ul><li>Mise à jour de la stack par défaut : Spring 3.1 M1, Groovy 1.8, Hibernate 3.6, Servlet 3.0 et Tomcat 7.0</li><li>Remplacement de HSQLDB par H2 pour la base de données de développement</li><li>Amélioration du rechargement à chaud pour plus de confort du développeur</li><li>Intégration par défaut du <a
title="plugin resources " href="http://grails.org/plugin/resources">plugin resources </a>pour gérer les header HTTP expires, les packages  de ressources statiques et autres joyeusetés</li></ul><p>Pour tous les détails, allez voir les <a
title="releases notes" href="http://grails.org/1.4.0.M1+Release+Notes">releases notes</a>. Maintenant il va falloir tester tout ça et remonter un maximum d&#8217;informations chez SpringSource. A vos marques, prêts ? Testez !</p><h4><a
name="JRebelreloadedenV"></a>JRebel &laquo;&nbsp;reloaded&nbsp;&raquo; en V4</h4><p>Le fort sympathique <a
title="JRebel" href="http://www.zeroturnaround.com/jrebel/">JRebel</a> vient de <a
title="sortir en V4.0" href="http://www.zeroturnaround.com/blog/jrebel-4-0-released-redeploys-beware">sortir en V4.0</a>. Cette librairie, qui s&#8217;intégre dans vos IDE préférés, vous permet de modifier <em>à chaud</em> le code pour observer directement le résultat. Bien sûr, vous modifiez sans doutes déjà votre code grâce <a
title="au hotswap" href="http://java.dzone.com/articles/reloading-java-classes-401">au hotswap</a> de Java 1.4, mais JRebel permet bien plus. Avec lui, vous n’êtes plus limité au changement de code dans le corps des méthodes: presque tout vous est permis ! De plus, son système de plugins, disponibles pour la plupart des <em>frameworks</em> connus, permet de recharger toutes les ressources qu&#8217;une simple modification de bytecode ne pourrait prendre en compte. Vous rajoutez un <em>bean</em> dans l&#8217;applicationContext.xml ? Pas de problème, il est déjà en mémoire.<br
/> Parmi <a
title="les nombreuses nouveauts" href="http://www.zeroturnaround.com/4-x-changelog/">les nombreuses nouveautés</a>, les plus marquantes sont:</p><ul><li>le support complet des EJB 3 et de Seam 2</li><li>utilisation des API standard Instrumentation/Hotswap pour de meilleures performances</li><li>un meilleur support du rechargement des classes anonymes</li></ul><p>Cette dernière nous a particulièrement marqué. Pour du développement sur <a
title="Wicket" href="http://wicket.apache.org/">Wicket</a> par exemple, où l&#8217;on a généralement beaucoup de classes anonymes, c&#8217;est une amélioration bienvenue: adieu les SuperClassChangedException ! C&#8217;est donc une bonne nouvelle pour tous les chanceux utilisateurs de l&#8217;outil qui n&#8217;est, rappelons le, <a
title="pas gratuit" href="http://sales.zeroturnaround.com/">pas gratuit</a> mais dispose d&#8217;une période d&#8217;essai de 30 jours.<br
/> Rappelons aussi que tester et modifier son code <em>en live</em>, c&#8217;est bien, mais que faire des tests unitaires permettant de &laquo;&nbsp;blinder&nbsp;&raquo; toute modification, rapidement et en se passant de serveur, c&#8217;est encore mieux !</p><p>Toujours chez Zeroturnaroud, notons aussi cette semaine <a
title="les résultat de leur sondage" href="http://www.zeroturnaround.com/blog/updating-java-ee-in-production-a-report-in-three-acts-including-a-foreword-and-an-afterword">les résultat de leur sondage</a> sur la façon dont sont mises à jour les applications en production. Le sondage est fait sur un petit nombre de personnes (607) et le panel représentatif ne doit pas être si représentatif que ça (tous les sondés connaissaient sans doute déjà JRebel). Néanmoins, il fait ressortir le manque de standardisation et de confiance envers cette étape pourtant cruciale de la vie d&#8217;une application. L&#8217;un des futurs chantiers auxquels devra s&#8217;attaquer Oracle ? En tout cas, l&#8217;article note que <a
title="notre DeployIt" href="http://www.xebialabs.com/">notre DeployIt</a> va dans le bon sens, c&#8217;est toujours ça.</p><h4><a
name="SeleniumRC"></a>Selenium 2.0 RC1</h4><p>Ce projet lancé en août 2009, réalise la fusion des API de WebDriver et Selenium. Les deux projets proposent une solution d’automatisation des tests d’applications web, avec à chacun leurs avantages et leurs inconvénients. Selenium de son côté repose sur un moteur JavaScript exécuté dans le navigateur avec les limitations que cela implique. Tandis que WebDriver propose une solution reposant sur des extensions du navigateur ce qui lui donne accès à toutes les fonctionnalités natives sans les limitations de la sandbox JavaScript. Selenium 2.0 ou Selenium WebDriver est donc une réécriture profonde de l’outil qui intégre maintenant WebDriver. Le nouveau framework peut utiliser alternativement le moteur JavaScript ou l’extension native pour supporter un maximum de navigateur. L’API selenium 2.0 est maintenant considérée comme stable, c’est donc le bon moment pour tester cette nouvelle branche.<br
/> Parmi les nouveautés de cette version :</p><ul><li><a
title="Grid 2" href="http://code.google.com/p/selenium/wiki/Grid2">Grid 2</a>, permet de distribuer les tests WebDriver dans une grille Selenium.</li><li><a
title="Chrome Driver" href="http://code.google.com/p/selenium/wiki/ChromeDriver">Chrome Driver</a>, ce  nouveau driver pour Chrome repose sur une extension native du navigateur.</li><li><a
title="Opera" href="http://www.opera.com/developer/tools/operadriver/">Opera</a>, cette version embarque un driver pour le navigateur Opera.</li><li><a
title="Advanced user interactions" href="http://code.google.com/p/selenium/wiki/AdvancedUserInteractions">Advanced user interactions</a>, cette nouvelle API permet de composer et de chainer des actions complexes à exécuter dans le navigateur.</li></ul><p>La RC1 fût très rapidement suivie d’une RC2 corrigeant un problème de lancement sur IE.<br
/> Pour plus d’information:</p><ul><li><a
title="Lannonce sur le blog Selenium" href="http://seleniumhq.wordpress.com/2011/06/01/selenium-2-0rc1-the-grid-release/">L’annonce sur le blog Selenium</a></li><li><a
title="La documentation Selenium 20 et WebDriver" href="http://seleniumhq.org/docs/03_webdriver.html">La documentation Selenium 2.0 et WebDriver</a></li></ul><h3><a
name="EvnementsdenotrecommunautenFra"></a>Evénements de notre communauté en France et à l&#8217;étranger</h3><h4><a
name="Xebiapoursuitlaventureauchalle"></a>Xebia poursuit l&#8217;aventure au challenge Octo 2011</h4><p>Il y a quelques mois, la société Octo lançait <a
title="un challenge un peu fou" href="https://sites.google.com/a/octo.com/challengeusi2011/">un challenge un peu fou</a> : &laquo;&nbsp;Et si vous codiez une application qui supporte 1 milliard d’utilisateurs ?&nbsp;&raquo;. Nous ne sommes jamais en reste lorsqu&#8217;il s&#8217;agit de relever ce genre de pari. Portée par Julien Buret et Seven le Mesle, l&#8217;équipe Xebia a donc planché sur ce sujet, qui a déjà donné lieu à quelques débats enflammés lors de nos Xkes. Après une phase de qualification sur 5 VMs, le jury d&#8217;Octo a annoncé les 3 équipes sélectionnées pour aller encore plus loin sur une infrastructure comprenant 20 VMs. Et nous avons l&#8217;honneur d&#8217;en faire partie. Nous ne dévoilerons donc pas (encore) sur ces pages l&#8217;architecture mise en place. Mais nos lecteurs les plus assidus se doutent qu&#8217;elle tourne intégralement autour de l&#8217;écosystème JEE.<br
/> Par ailleurs, ce challenge nous a permis de défricher des thématiques peu communes dans les applications d&#8217;entreprise actuelles, et nous aurons l&#8217;occasion de revenir en détail sur quelques points particuliers de l&#8217;architecture de cette application massivement multijoueurs.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/06/07/revue-de-presse-xebia-214/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Devoxx &#8211; Comparaison des Frameworks Web sur JVM</title><link>http://blog.xebia.fr/2010/11/19/devoxx-comparaison-des-frameworks-web-sur-jvm/</link> <comments>http://blog.xebia.fr/2010/11/19/devoxx-comparaison-des-frameworks-web-sur-jvm/#comments</comments> <pubDate>Fri, 19 Nov 2010 14:12:34 +0000</pubDate> <dc:creator>Romain Maton</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Devoxx]]></category> <category><![CDATA[Grails]]></category> <category><![CDATA[GWT]]></category> <category><![CDATA[Ruby on Rails]]></category> <category><![CDATA[Spring MVC]]></category> <category><![CDATA[Web]]></category> <category><![CDATA[Wicket]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=5938</guid> <description><![CDATA[Nouvelle journée de Devoxx et cela commence plutôt bien avec une comparaison des Frameworks Web sur JVM par Matt Raible. Avec un accent Américain trés prononcé, et aprés une présentation &#171;&#160;lessig style&#160;&#187; trés appréciée, il présente le programme de la session : les candidats, les points de comparaison, la matrice et quelques graphiques. Comment choisir [...]]]></description> <content:encoded><![CDATA[<p> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/11/devoxx_matt_raible.png" border="0" alt="" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> Nouvelle journée de Devoxx et cela commence plutôt bien avec une <a
href="http://www.devoxx.com/display/Devoxx2K10/Comparing+JVM+Web+Frameworks" title="comparaison des Frameworks Web sur JVM" >comparaison des Frameworks Web sur JVM</a> par <a
href="http://raibledesigns.com/" title="Matt Raible" >Matt Raible</a>. Avec un accent Américain trés prononcé, et aprés une présentation &laquo;&nbsp;<a
href="http://www.presentationzen.com/presentationzen/2005/10/the_lessig_meth.html" title="lessig style" >lessig style</a>&nbsp;&raquo; trés appréciée, il présente le programme de la session : les candidats, les points de comparaison, la <em>matrice</em> et quelques graphiques.</p><p>Comment choisir ces fameux Frameworks Web qui sont, et c&#8217;est le moins que l&#8217;on puisse dire, assez nombreux. Et bien tout d&#8217;abord, il va falloir restreindre cette liste à quelques Frameworks et, pour chacun d&#8217;entre eux, prototyper une application. A partir de ces prototypes, il sera alors possible de créer une <em>matrice</em> comprenant différents critères qui seront notés pour chaque Frameworks. De là, on pourra faire ressortir les meilleurs prétendants, un petit document et faire nos recommandations. C&#8217;est ce qu&#8217;a fait Matt Raible durant cette présentation et voici ses résultats !</p><p>&nbsp;<br
/> &nbsp;</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/11/devoxx_web_frameworks.png" border="0" alt="" /></div><p>Matt fait un petit rappel sur les facteurs clés qui nous permettaient de choisir un Framework Web en 2007 <em>(de son expérience)</em> :</p><ul><li>composant, requête ou RIA,</li><li>facilité de développement,</li><li>communauté autour du Framework,</li><li>roadmap et futur du Framework,</li><li>maintenance,</li><li>fonctionnalités.</li></ul><p>Aujourd&#8217;hui, nous en demandons beaucoup plus à nos Frameworks Web et, pour Matt, nous passons de 6 à 20 ! Avec un peu d&#8217;exagération sur cette fulgurante croissance car certains points faisaient déjà parti de nos préoccupations en 2007 ; de là à dire que ce sont de nouveaux points&#8230; En tout cas, les voici au complet :</p><ul><li>productivité du développeur,</li><li>perception du développeur,</li><li>courbe d&#8217;apprentissage,</li><li>santé du Framework,</li><li>disponibilité des développeurs <em>(sur le marché)</em>,</li><li>offres d&#8217;emploi,</li><li>templating,</li><li>composants,</li><li>ajax,</li><li>plugins ou add-ons,</li><li>scalabilité,</li><li>support pour les tests,</li><li>i18n et l10n,</li><li>validation,</li><li>support du multi-langage (groovy, scala&#8230;),</li><li>qualité de la documentation / tutoriaux,</li><li>publications,</li><li>support de REST,</li><li>support mobile,</li><li>et degré de risque.</li></ul><p>Bien sûr, nous pouvons remettre en cause certains points de cette liste et passer plusieurs journées à en débattre mais le débat n&#8217;est pas là. Matt assume que les choix qui sont fait sont les siens et il nous invite à participer pour ajouter des éléments à la liste ou lui indiquer pourquoi il se trompe sur telle ou telle appréciation. L&#8217;idée est ici de donner une base solide afin de pouvoir comparer sur plusieurs points importants de nos projets d&#8217;entreprise ces fameux innombrables Frameworks Web.</p><p>Roulement de tambour&#8230; voici la matrice ! (<a
href="http://spreadsheets.google.com/pub?key=0AtkkDCT2WDMXdC1HOEtnUHpCejJMbUhGeGJWUmh5dVE&#038;hl=en&#038;output=html" title="google spreadsheet" >google spreadsheet</a>)</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/11/devoxx_matrice.png" border="0" alt="" /></div><p>Les gagnants de ce &laquo;&nbsp;concours&nbsp;&raquo; sont :</p><ul><li>Spring MVC,</li><li>GWT,</li><li>Ruby on Rails <em>(non JVM mais non exclu car très présent sur le marché)</em>,</li><li>Grails,</li><li>Wicket.</li></ul><p>Vient ensuite une partie avantages / inconvénients pour chacun d&#8217;eux. Cette partie est à prendre avec des pincettes car les inconvénients relevés sont souvent surmontables <em>(certains sont même juste des comportements par défaut modifiable par configuration !)</em> mais encore une fois cela donne un overview de ce que font ou ne font pas ces Frameworks :</p><ul><li><strong>Spring MVC :</strong> configuration simple par conventions et annotations, intégration de plusieurs formats d&#8217;affichage <em>(JSP, JSTL, FreeMarker, JSON, PDF&#8230;)</em> et excellent support de REST <u>mais</u> pas de rechargement à chaud par défaut <em>(toutefois possible avec JRebel ou Spring Roo)</em>, projet non ouvert à la communauté pour contribution <em>(SpringSource mandatory)</em> et pas de librairie ajax en bundle <em>(ce qui peut aussi être vu comme un point positif car mise à jour des librairies Javascript non bloquée par le Framework)</em> ;</li><li><strong>GWT :</strong> code Java traduit en un Javascript extrêmement optimisé, apprentissage facile et rapide <em>(petit bémol car sur ce point les développeurs Web n&#8217;ont pas forcément cette compétence du code Swing-like)</em> et une communauté vibrante <u>mais</u> il faut connaître Java <em>(alors que l&#8217;on produit du Javascript)</em>, compilation très lente et code difficile à tester ;</li><li><strong>Ruby on Rails :</strong> apprentissage rapide pour tout développeur Web, documentation abondante et  communauté de passionnés <u>mais</u> moins performant que les autres langages, langage dynamique = plus de tests pour éviter les cast exceptions au runtime et  un manque d&#8217;outils de développement et de débugger comme dans le monde Java ;</li><li><strong>Grails :</strong> transition facile depuis le monde Java, utlise Groovy et nombreux plugins <u>mais</u> Groovy vise directement les développeurs Java <em>(ce qui peut bloquer d&#8217;autres développeurs)</em>, stack traces <em>affreuses</em> <em>(dans le slide</em> <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> <em>)</em> et connaissances des sous-modules non nécessaires mais peut aider ;</li><li><strong>Wicket :</strong> parfait pour les développeurs Java, binding des pages et des vues et communauté active <u>mais</u> pas ou peu d&#8217;offres d&#8217;emploi, stateful par défaut et templates HTML juste à côté des classes Java <em>(ce qui ne va pas aider le graphiste)</em>.</li></ul><p>Pour finir, nous avons droit à quelques <em>jolis</em> graphiques qui nous montre à quelle point Ruby On Rails est très présent au niveau de la communauté mais ainsi en terme d&#8217;offres d&#8217;emploi.</p><div
align="center"> <a
href="http://blog.xebia.fr/wp-content/uploads/2010/11/devoxx_stack_overflow.png"><img
src="http://blog.xebia.fr/wp-content/uploads/2010/11/devoxx_stack_overflow-300x225.png" alt="devoxx_stack_overflow" title="devoxx_stack_overflow" width="300" height="225" class="alignnone size-medium wp-image-5941" /></a></div><div
align="center"> <a
href="http://blog.xebia.fr/wp-content/uploads/2010/11/devoxx_charts.png"><img
src="http://blog.xebia.fr/wp-content/uploads/2010/11/devoxx_charts-300x225.png" alt="devoxx_charts" title="devoxx_charts" width="300" height="225" class="alignnone size-medium wp-image-5939" /></a></div><p>Matt a insisté sur deux points importants tout d&#8217;abord sur le fait que ce sont les développeurs qui devraient choisir leur framework web, plus les développeurs sont heureux, plus ils seront productifs. D&#8217;autre part, javascript n&#8217;est pas si difficile comme on l&#8217;entend souvent de la part des développeurs java, plus on le pratique, plus on l&#8217;apprécie, et c&#8217;est vital si l&#8217;on veut être sérieux pour le développement d&#8217;application web.</p><p>Cette méthode peut être appliqué dans votre entreprise pour choisir votre framework web :</p><ol><li>priorisez les fonctionnalités importantes de votre application</li><li>sélectionnez ensuite 3 ou 4 Frameworks pour prototyper une application <em>(1 semaine chacun)</em>, documentez</li><li>calculez votre <em>matrice</em> et choisissez !</li></ol> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/11/19/devoxx-comparaison-des-frameworks-web-sur-jvm/feed/</wfw:commentRss> <slash:comments>7</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2009/08/03/revue-de-presse-xebia-120/</link> <comments>http://blog.xebia.fr/2009/08/03/revue-de-presse-xebia-120/#comments</comments> <pubDate>Mon, 03 Aug 2009 16:17:11 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Ext-GWT]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[JEE 6]]></category> <category><![CDATA[JRuby]]></category> <category><![CDATA[junit]]></category> <category><![CDATA[RIA]]></category> <category><![CDATA[Sun]]></category> <category><![CDATA[Wicket]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=2602</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII Avancement des spécifications et implémentations JEE 6 RIA Des nouvelles d&#8217;Ext-GWT Le coin de la technique Nouveau concept dans JUnit 4.7 : Rule Attention à votre mémoire avec String.substring() Sortie de Wicket 1.4 Chouchoutez vos tests unitaires. Evènements de notre [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Actualité éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/08/03/revue-de-presse-xebia-120/#Avancementdesspcificationsetim">Avancement des spécifications et implémentations JEE 6</a></li></ul><p><strong>RIA</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/08/03/revue-de-presse-xebia-120/#DesnouvellesdExtGWT">Des nouvelles d&#8217;Ext-GWT</a></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/08/03/revue-de-presse-xebia-120/#NouveauconceptdansJUnitRule">Nouveau concept dans JUnit 4.7 : Rule</a></li><li><a
href="http://blog.xebia.fr/2009/08/03/revue-de-presse-xebia-120/#AttentionvotremmoireavecString">Attention à votre mémoire avec String.substring()</a></li><li><a
href="http://blog.xebia.fr/2009/08/03/revue-de-presse-xebia-120/#SortiedeWicket">Sortie de Wicket 1.4</a></li><li><a
href="http://blog.xebia.fr/2009/08/03/revue-de-presse-xebia-120/#Chouchoutezvostestsunitaires">Chouchoutez vos tests unitaires.</a></li></ul><p><strong>Evènements de notre communauté en France et à l&#8217;étranger</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/08/03/revue-de-presse-xebia-120/#SunperdJRuby">Sun perd JRuby</a></li></ul><h3><a
name="ActualitditeursSSII"></a>Actualité éditeurs / SSII</h3><h4><a
name="Avancementdesspcificationsetim"></a>Avancement des spécifications et implémentations JEE 6</h4><p>Le <a
href="http://lescastcodeurs.com/2009/08/les-cast-codeurs-podcast-episode-7-le-dsl-et-ses-amantes/" title="dernier podcast des Cast Codeurs" >dernier <em>podcast</em> des Cast Codeurs</a> a été l&#8217;occasion de faire un tour de table des informations que chacun des <em>speakers</em> possédait sur JEE 6. Même s&#8217;il ne s&#8217;agit pas d&#8217;informations officielles, elles offrent un aperçu intéressant sur ce que pourrait être JEE 6 lors de sa finalisation ainsi que sur son calendrier :</p><ul><li>Antonio Goncalves, membre de l&#8217;<em>Expert Group</em> JEE 6, explique que la bataille entre les <a
href="http://www.jcp.org/en/jsr/detail?id=330" title="JSR-330 (Dependency Injection for Java)" >JSR-330 (Dependency Injection for Java)</a> et <a
href="http://www.jcp.org/en/jsr/detail?id=299" title="JSR-299 (Java Contexts and Dependency Injection)" >JSR-299 (Java Contexts and Dependency Injection)</a> sur le terrain de l&#8217;injection de dépendances semble partie pour se terminer de manière constructive. En effet la JSR-330 ne présentant pas d&#8217;incompatibilité particulière avec le modèle très évolué proposé par la JSR-299, les deux spécifications devraient se compléter harmonieusement. La JSR-330 définirait un ensemble d&#8217;interfaces de base que la JSR-299 viendrait étendre pour ajouter ses concepts plus élaborés. Afin de permettre cet ajustement de dernière minute, la finalisation de la spécification JEE 6 serait légèrement repoussée, la portant ainsi autour d&#8217;octobre / novembre 2009.</li><li>Emmanuel Bernard, travaillant sur les problématiques de persistance chez JBoss, nous apprend quant à lui que l&#8217;implémentation des <em>drafts</em> des spécifications JEE 6 est en cours chez JBoss et devrait aboutir en version 5.2 du serveur d&#8217;application de l&#8217;éditeur avec une première implémentation non conforme au TCK, la conformité viendrait dans un deuxième temps, lors d&#8217;une version ultérieure. Il évoque la possibilité d&#8217;une présentation de ce travail lors du <a
href="http://www.jbossworld.com/" title="JBoss World" >JBoss World</a> de début septembre. D&#8217;autre part, la <a
href="http://www.jcp.org/en/jsr/detail?id=303" title="JSR-303 (Bean Validation)" >JSR-303 (Bean Validation)</a> dont il est responsable est proche de la finalisation mais un conflit avec le JCP sur une problématique de licence complexifie l&#8217;avancement.</li></ul><p>On ne peut que se réjouir de cette éventuelle harmonie entre les deux JSR d&#8217;injections de dépendances puisque les développeurs seraient ainsi libres de choisir la spécification sur laquelle ils se basent, en fonction de leur besoins plus ou moins complexes.</p><h3><a
name="RIA"></a>RIA</h3><h4><a
name="DesnouvellesdExtGWT"></a>Des nouvelles d&#8217;Ext-GWT</h4><p>Ext-GWT, la librairie Javascript <a
href="http://extjs.com/" title="ExtJS" >ExtJS</a> portée en GWT (cf. article sur la <a
href="http://blog.xebia.fr/2009/01/23/gwt-galaxy/#ahrefhttpextjscomproductsgxtti" title="galaxie GWT" >galaxie GWT</a>), sort en version <a
href="http://extjs.com/deploy/gxt-2.0.1/release_notes.html#Release_2.0.1" title="201" >2.0.1</a>.<br
/> Profitons de cette sortie pour parler plus globalement du projet et de la <a
href="http://extjs.com/blog/2009/07/09/ext-gwt-20-released/" title="release majeure 20 sortie il y a maintenant un mois" >release majeure 2.0 sortie il y a maintenant un mois</a>.</p><p>Celle-ci apporte en effet son lot de nouveaux composants et nouvelles fonctionnalités. Ces ajouts réduisent ainsi l&#8217;écart entre les 2 projets. On trouve ainsi :</p><ul><li>le <code>Tree Panel</code> et le <code>Tree Grid</code> (<a
href="http://extjs.com/examples/explorer.html#roweditortreegrid" title="dmo" >démo</a>), ce dernier (qui étend directement le composant <code>Grid</code> donc plus de binder) bénéficiant de toutes les fonctionnalités du tableau</li><li>le <code>row editor</code> (<a
href="http://extjs.com/examples/explorer.html#roweditorgrid" title="dmo" >démo</a>) qui permet de modifier une ligne complète du tableau, toutes les cellules de la ligne passant en mode <em>édition</em> (alors qu&#8217;avant il fallait éditer toutes les cellules une par une)</li><li>le <code>HTML editor / Rich Text Editor</code> (<a
href="http://extjs.com/examples/explorer.html#advancedforms" title="dmo" >démo</a>)</li><li>le <code>Live Charting</code> (<a
href="http://extjs.com/examples/explorer.html#chartgallery" title="démo" >démo</a>) qui rejoint ainsi <a
href="http://blog.xebia.fr/2009/07/13/revue-de-presse-xebia-117/#GChartpourGWT" title="GChart" >GChart</a> (évoquée lors d&#8217;une précédente revue de presse) et <a
href="http://blog.xebia.fr/2009/07/13/revue-de-presse-xebia-117/#comment-13822" title="OFCGWT" >OFCGWT</a></li><li>le <code>ButtonGroup</code> (<a
href="http://extjs.com/examples/explorer.html#advancedtoolbar" title="dmo" >démo</a>) et le <code>Status</code> (<a
href="http://extjs.com/examples/explorer.html#statustoolbar" title="dmo" >démo</a>)</li></ul><p>Un travail important a été apporté sur les boutons, la barre d&#8217;outil, la gestion de l&#8217;overflow dans cette barre&#8230;</p><p>Les nouveautés étant très nombreuses, un détour par le fameux <a
href="http://extjs.com/examples/explorer.html" title="showcase" >showcase</a> permettra de les parcourir/tester.</p><p>S&#8217;agissant d&#8217;une mise à jour majeure, un guide de migration présent dans le produit décrira les changements dans l&#8217;API.</p><p>Téléchargement par <a
href="http://extjs.com/products/gxt/download.php" title="ici" >ici</a> et si (comme moi <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ) vous attendez déjà la suite avec la 2.1, vous trouverez la nouvelle roadmap par <a
href="http://extjs.com/products/gxt/roadmap.php" title="l" >là</a>.</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="NouveauconceptdansJUnitRule"></a>Nouveau concept dans JUnit 4.7 : Rule</h4><p>La version 4.7 du célèbre framework de test unitaire, JUnit, est en cours de préparation. Un nouveau concept a été dévoilé : <a
href="http://greenbar.saff.net/?p=18" title="Rule" ><em>Rule</em></a>.</p><p>Ce concept va réjouir les accrocs du test automatisé par JUnit. En effet, cette fonctionnalité permettra de modifier l&#8217;exécution de vos tests, afin de les préparer à un contexte d&#8217;exécution.</p><p>Un des exemples les plus significatifs est le suivant :</p><pre class="brush: java; title: ; notranslate">
 public static class HasTempFolder {
   @Rule
   public TemporaryFolder folder= new TemporaryFolder();
   @Test
   public void testUsingTempFolder() throws IOException {
     File createdFile= folder.newFile(&quot;myfile.txt&quot;);
     File createdFolder= folder.newFolder(&quot;subfolder&quot;);
     // ...
   }
 }
</pre><p>Grâce à cette déclaration <code>@Rule public TemporaryFolder folder= new TemporaryFolder();</code>, avant le test il n&#8217;y a pas besoin de créer de répertoire temporaire, après le test il n&#8217; y a pas besoin de supprimer les répertoires et fichiers créés pendant le test. Cela permet donc plus facilement de faire des tests automatisables, répétables, et portables d&#8217;environnement à environnement.</p><p>Il existe d&#8217;autres <em>Rules</em> comme par exemple :</p><ul><li><code>ExternalResource</code>: utilisable d&#8217;un fichier externe (accessible par système de fichier)</li><li><code>Timeout</code>: le test doit répondre avant un <em>timeout</em></li><li><code>ExpectedException</code>: le test doit jeter des exceptions bien déterminés</li><li>Et bien d&#8217;autres</li></ul><p>Il y aura donc un ensemble de <em>Rules</em> qui permettront d&#8217;éviter de refaire des petits bouts de code personnel pour faire la même chose en une annotation.</p><h4><a
name="AttentionvotremmoireavecString"></a>Attention à votre mémoire avec String.substring()</h4><p>Voici un article intéressant qui permet de comprendre ce qui se trouve sous le capot de la classe du JDK String : <a
href="http://www.javablogging.com/string-and-memory-leaks/" title="String and memory leaks" >String and memory leaks</a> ; il pourrait même vous donner une petite goutte de sueur sur le front. Même si le titre de l&#8217;article n&#8217;est pas forcement bien choisi (&#8216;fuite mémoire&#8217; alors qu&#8217;il s&#8217;agit plus de rétention mémoire), il nous montre simplement comment une méthode de la classe, <code>substring</code>, peut cacher un loup.</p><p>En effet, à des fins d&#8217;optimisation, on fait tourner le code suivant :</p><pre class="brush: java; title: ; notranslate">
public static void sendEmail(String emailUrl) {
    String email = emailUrl.substring(7); // 'mailto:' prefix has 7 letters
    String userName = email.substring(0, email.indexOf(&quot;@&quot;));
    String domainName = email.substring(email.indexOf(&quot;@&quot;));
}
public static void main(String[] args) {
    sendEmail(&quot;mailto:user_name@domain_name.com&quot;);
}
</pre><p>A première vue, on a trois instances de la classes String :</p><ul><li><code>String email = "mailto:"</code></li><li><code>String userName = "user_name@"</code></li><li><code>String domainName = "domain_name.com"</code></li></ul><p>Cependant, concrètement, en mémoire il n&#8217;y a qu&#8217;un tableau de <code>char<a
href="" title="" ></a></code> qui est stocké : <code>"mailto:user_name@domain_name.com"</code>, les instances des classes <code>String</code> enregistrent seulement les intervalles utilisés du tableau de <code>char<a
href="" title="" ></a></code>.</p><p>Le piège est de manipuler une grosse chaine de caractères (qui vient d&#8217;un fichier batch par exemple) et d&#8217;utiliser <code>substring</code> afin de limiter la taille de la chaine et donc l&#8217;utilisation mémoire. Faux ! La chaine initiale sera toujours stockée en mémoire.</p><p>Assez déroutant !</p><h4><a
name="SortiedeWicket"></a>Sortie de Wicket 1.4</h4><p>Le projet Wicket continue d&#8217;évoluer et, alors que nous vous parlions d&#8217;une version 1.3.6 en <a
href="http://blog.xebia.fr/2009/05/11/revue-de-presse-xebia-108/#SortiedeWicket" title="mai dernier" >mai dernier</a> (qui a d&#8217;ailleurs fait l&#8217;objet d&#8217;une <a
href="http://refcardz.dzone.com/refcardz/getting-started-apache-wicket" title="Refcard DZone" >Refcard DZone</a>), c&#8217;est la <a
href="http://yeswicket.com/index.php?post/2009/07/30/Wicket-1.4-officiellement-disponible-!" title="version 1.4" >version 1.4</a> après un an de travail  qui nous arrive dans la mains (par <a
href="http://yeswicket.com/" title="Yes Wicket" >Yes Wicket !</a> et <a
href="http://wicket.apache.org/apache-wicket-14-takes-type-safety-to-the-next-level.html" title="Apache Wicket" >Apache Wicket</a>).</p><p>Au menu des nouveautés : un nouveau packaging des jars Wicket (qui les rend compatibles OSGi), un seul jar pour les modules Spring et plusieurs modifications d&#8217;IModel, de ses implémentations et plus globalement des APIs pour tirer avantage de Java 5 (Generics&#8230;). L&#8217;utilisation des Generics dans le code de Wicket a commencé il y a environs un an par un <a
href="http://www.nabble.com/users%2C-please-give-us-your-opinion%3A-what-is-your-take-on-generics-with-Wicket-td17589984.html" title="sondage passionné " >sondage passionné </a> sur la <a
href="http://www.nabble.com/generics-to18083910.html" title="mailing-list" >mailing-list</a>, pour arriver seulement dans la milestone 3 de Wicket 1.4 avec autant de partisans que de détracteurs &#8211; défenseurs du support du JDK1.4- et ceci jusqu&#8217;à la release final. Le thread sur <a
href="http://www.theserverside.com/news/thread.tss?thread_id=49473" title="The Server Side" >The Server Side</a> est également impressionnant ! Pour le détail complet, rendez-vous sur le <a
href="https://issues.apache.org/jira/secure/IssueNavigator.jspa?mode=hide&#038;requestId=12313364" title="Jira du projet" >Jira du projet</a>.</p><p>Tout comme pour Ext-GWT 2.0 (ci-dessus), une guide de migration de 1.3 vers 1.4 est <a
href="http://cwiki.apache.org/WICKET/migrate-14.html" title="disponible" >disponible</a>. Un petit <a
href="http://www.apache.org/dyn/closer.cgi/wicket/1.4.0" title="tlchargement" >téléchargement</a> ?</p><h4><a
name="Chouchoutezvostestsunitaires"></a>Chouchoutez vos tests unitaires.</h4><p>InfoQ publie un intéressant florilège : <a
href="http://www.infoq.com/news/2009/07/Better-Unit-Tests" title="Ralisez de meilleurs tests unitaire" >&laquo;&nbsp;Réalisez de meilleurs tests unitaire&nbsp;&raquo;</a>.<br
/> Certains trouveront que, de nouveau, on enfonce des portes ouvertes. D&#8217;autres (comme nous), apprécierons les nombreuses réactions qui découlent de ce genre d&#8217;article, et penserons qu&#8217;il n&#8217;est jamais inutile de rappeler ces grands principes de base afin d&#8217;arrêter de voir des tests unitaires martyrisés (et inutiles) sur certains projets.<br
/> Bref, en un mot comme en mille, vos tests unitaires sont des classes de code java, qui sont vitales pour vos projet, il est donc urgent d&#8217;en prendre grand soin (nommage, documentation, refactoring&#8230;)</p><h3><a
name="EvnementsdenotrecommunautenFra"></a>Evènements de notre communauté en France et à l&#8217;étranger</h3><h4><a
name="SunperdJRuby"></a>Sun perd JRuby</h4><p>Trois développeurs clés de JRuby, à savoir Charles Nutter, Thomas Enebo et Nick Sieger, ont choisi de quitter Sun MicroSystems. Suite au rachat récent par Oracle et à l&#8217;incertitude concernant le support de <a
href="http://jruby.codehaus.org/" title="JRuby" >JRuby</a> par le nouveau propriétaire, ils ont décidé de rejoindre la société <a
href="http://www.engineyard.com/" title="Engine Yard" >Engine Yard</a>, spécialisée dans l&#8217;hébergement d&#8217;applications Ruby On Rails. Engine Yard a l&#8217;air enthousiaste à l&#8217;idée de pouvoir être le support du développement de l&#8217;offre JRuby et de la communauté qui va avec. (<a
href="http://www.pcworld.com/article/169145/suns_jruby_team_jumps_ship_to_engine_yard.html" title="Source" >Source</a>)</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/08/03/revue-de-presse-xebia-120/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Tapestry 5 vs. Wicket</title><link>http://blog.xebia.fr/2009/07/03/tapestry-5-vs-wicket/</link> <comments>http://blog.xebia.fr/2009/07/03/tapestry-5-vs-wicket/#comments</comments> <pubDate>Fri, 03 Jul 2009 14:06:07 +0000</pubDate> <dc:creator>Séven Le Mesle</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Tapestry]]></category> <category><![CDATA[Wicket]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=2468</guid> <description><![CDATA[Mettre au grenier la configuration XML et l&#8217;API J2EE, voilà le pari que tentent de relever les frameworks orientés composants. Pour atteindre ce but louable : simplifier la vie stressée du développeur et par là même sauver quelques-uns de ses cheveux, le XML est remplacé par du code Java et l&#8217;API J2EE est cachée dans [...]]]></description> <content:encoded><![CDATA[<p>Mettre au grenier la configuration XML et l&#8217;API J2EE, voilà le pari que tentent de relever les frameworks orientés composants. Pour atteindre ce but louable : simplifier la vie stressée du développeur et par là même sauver quelques-uns de ses cheveux, le XML est remplacé par du code Java et l&#8217;API J2EE est cachée dans les entrailles du framework. Les pages deviennent des objets Java liés à des templates, auxquels sont ajoutés des composants réutilisables (si, si). Les composants sont ni plus ni moins que d&#8217;autres objets Java liés à des templates. Les requêtes, quant à elles, deviennent des événements traités par les pages et les composants.</p><p>Voilà pour le principe de cette approche qui semble avoir de beaux jours devant elle. Emergence naturelle ou stratégie voulue, la fondation Apache, jamais avare de solutions, nous propose deux frameworks composants : Tapestry 5 et Wicket. Alors comment choisir ? Le mieux est encore de se faire sa propre idée en les testant tous les deux. Nous sommes bien d&#8217;accord, rien ne remplacera jamais l&#8217;efficacité du prototypage. Cela n&#8217;empêche pourtant pas de faire une pré-sélection basée sur quelques points de comparaisons stratégiques. Voici donc un article pour vous aider à faire le meilleur choix ; à savoir le choix qui répondra le mieux aux besoins et à l&#8217;environnement de votre projet.<br
/> Bien qu&#8217;adoptant tous deux la programmation web orientée composant, les deux projets sont imprégnés d&#8217;une philosophie et d&#8217;un objectif différents. Les buts principaux de Wicket sont :</p><ul><li>Pages et composant statefull</li><li>Programmation à la Swing</li><li>Séparation stricte entre code et template</li></ul><p>Pour Tapestry 5, les objectifs sont différents :</p><ul><li>Optimiser l&#8217;utilisation CPU et mémoire</li><li>Simplifier la création de composants</li></ul><p>Attention ! Ce sont là les objectifs sur lesquels les deux projets sont focalisés. Ce qui ne signifie pas qu&#8217;ils s&#8217;y intéressent exclusivement. Wicket supporte bien les composants sans état, ce n&#8217;est juste pas son but principal. De même que Tapestry supporte le développement web entièrement en objet Java.</p><p>Ils affichent, aussi, des buts communs, comme d&#8217;être orientés Pojo et d&#8217;éliminer la configuration XML avec le pattern Convention Over Configuration.</p><h3><a
name="Configuration"></a>Configuration</h3><p>Pas de XML ne veut pas dire pas de configuration. La différence consiste à configurer l&#8217;application avec du code Java. Dans le cas de Wicket, il s&#8217;agit de construire une classe héritant de <strong><em>WebApplication</em></strong> et, de la fournir en paramètre du contexte web. Dans la <strong><em>WebApplication</em></strong>, il faut fournir la classe correspondant à la page d&#8217;accueil en surchargeant la méthode <strong><em>getHomePage()</em></strong>. Pour définir les paramètres globaux de l&#8217;application, il faudra utiliser les getters et setters de la classe mère.</p><p>De la même façon, avec Tapestry, il faut d&#8217;abord ajouter le <strong><em>TapestryFilter,</em></strong> puis déclarer le package principal de l&#8217;application en <strong><em>context-param</em></strong>. Par défaut, Tapestry va considérer que le package <strong><em>myapp.services</em></strong> contient des services Tapestry IoC, que le package <strong><em>myapp.components</em></strong> contient des composants, et que le package <strong><em>myapp.pages</em></strong> contient des pages. L&#8217;application est configurée à partir d&#8217;une classe Pojo <strong><em>myapp.services.AppModule</em></strong>. Il s&#8217;agit en fait d&#8217;un module Tapestry-IoC qui, <em>via</em> des noms de méthodes conventionnels, va permettre d&#8217;affiner la configuration du framework et de monter nos propre services. En ce qui concerne la page d&#8217;accueil, par défaut, Tapestry chargera la page nommée <strong></em>Index</em></strong>.</p><h3><a
name="Pagesetcomposants"></a>Pages et composants</h3><p>Dans Tapestry 5, les pages comme les composants sont des pojo décorés par des annotations et/ou utilisant des noms de méthodes conventionnels. Les annotations permettent d&#8217;injecter avec Tapestry IoC des services ou des composants. Elles sont aussi utilisées pour écouter des événements via des méthodes annotées. Certains noms de méthodes sont reconnus et utilisés par Tapestry pour recevoir les événements (<strong><em>onActionFromComponentId()</em></strong> par exemple). Souvenez vous, la configuration exige de fournir des nom de package pour les pages et les composants. Tapestry lie toutes les classes contenues dans les packages <strong><em>pages</em></strong> et <strong><em>composants</em></strong> à ses annotations et, cerise sur le gâteau, les recharge à chaud.</p><p>Avec Wicket, pages et composants sont des classes construites par héritage qui fournissent un constructeur chargé de les composer.  Dans le constructeur, il faut créer les composants, les lier aux template et les ajouter à la page comme on le ferait avec un conteneur Swing. Les modèles permettent de lier les données des beans aux composants, et de les maintenir. Parfois, il sera utile de surcharger quelques méthodes comme <strong><em>onSubmit()</em></strong> pour un formulaire.</p><table><tbody><tr
style="text-align:center"><th>&nbsp;</th><th><img
src="http://blog.xebia.fr/wp-content/uploads/2009/07/add.gif" alt="add" title="add" width="16" height="16" class="alignnone size-full wp-image-2488" /></th><th><img
src="http://blog.xebia.fr/wp-content/uploads/2009/07/forbidden.gif" alt="forbidden" title="forbidden" width="16" height="16" class="alignnone size-full wp-image-2489" /></th></tr><tr><th> Wicket</th><td ><ul><li>Cadre imposé par l&#8217;héritage</li></ul></td><td><ul><li>Nécessite un minimum de connaissances de l&#8217;API</li></ul></td></tr><tr><th>Tapestry&nbsp;5</th><td ><ul><li>Re-chargement à chaud</li><li>Syntaxe légère</li></ul></td><td ><ul><li> Instrumentation du code source</li></ul></td></tr></tbody></table><p>En clair, avec Wicket on développe une application web comme on le ferait avec un toolkit graphique. La transition pour les habitués du MVC sera plus difficile. Tapestry est plus modéré de ce point de vue avec ses Pojo qui ne manquent pas de rappeler les actions ou contrôleurs d&#8217;usage en MVC. La possibilité de créer des composants réutilisables est bien au rendez-vous, par contre il faudra faire très attention au choix des identifiants qui doivent être uniques pour le couple page &#8211; composant. Impossible d&#8217;échapper au piège des identifiants uniques, quand il s&#8217;agit d&#8217;ajouter plusieurs fois le même composant dans une page par exemple.</p><h3><a
name="Lestemplates"></a>Les templates</h3><p>Dans les deux cas, les templates sont des fichiers XML composés de tags HTML et de quelques ajouts dans un espace de nom spécifique aux frameworks. Ils proposent tous deux de décorer le HTML avec des attributs spécifiques ou bien de directement ajouter des tags qui représentent les points d&#8217;ancrage des différents composants. Pour établir la liaison entre le code Java et le template, chaque composant est ajouté dans le template avec un identifiant unique qui est utilisé plus tard dans le code. Par défaut, les templates doivent porter le même nom que la classe auxquels ils se rapportent, ce qui inclut bien sûr le nom du package.</p><p>Wicket impose une séparation stricte entre code et template. Des attributs spécifiques Wicket (<strong><em>wicket:id=&nbsp;&raquo;monId&nbsp;&raquo;</em></strong>) sont ajoutés au template pour définir l&#8217;identifiant des composants. Dans le code, les composants sont liés au template en fournissant leur identifiant comme paramètre du constructeur.  En opposition au JSP et autre Freemarker, il n&#8217;y a plus de code ou de pseudo-code dans le template, toute la partie dynamique est développée en Java pur. Pour gérer la mise en forme des pages (menu, en-tête et pied de page), Wicket propose l&#8217;héritage de template sur le même principe que sitemesh. Un tag est ajouté dans le template de la page mère, pour indiquer le lieu ou sera intégré le contenu surchargé par les template fils. Les templates fils, doivent, de leur côté , contenir une balise <strong><em>wicket:extend</em></strong> encadrant le HTML et les composants à injecter dans le template hérité.</p><p>La différence réside encore une fois dans le côté un peu plus laxiste de Tapestry qui favorise l&#8217;utilisation de pseudo-code dans le template.  En définitive, les composants Tapestry fonctionnent un peu comme des Taglibs sans la configuration XML qui va autour. Ici, en plus de l&#8217;identifiant, les balises spécifiques supportent un nombre illimité de paramètres transmis sous la forme d&#8217;attributs XML ou de blocs de code HTML entourés du tag <strong><em>t:parameter</em></strong>. Les attributs peuvent être définis dans différents scope comme <strong><em>literal</em></strong> pour du texte, <strong><em>propertie</em></strong> pour des propriétés de la classe et bien d&#8217;autres. Tapestry fournit aussi un moyen d&#8217;injecter directement du texte ou du code HTML avec &laquo;&nbsp;des extensions&nbsp;&raquo;. Il suffit de placer entre <strong><em>${&#8230;}</em></strong> le nom d&#8217;une propriété du composant pour que sa valeur soit injectée dans le rendu HTML. La mise en forme se fait par composition. Le template des pages est entouré par la balise d&#8217;un composant. Celui-ci doit alors définir un élément <strong><em>&lt;t:body/&gt;</em></strong> qui sera remplacé par le corps de la page.</p><table><tbody><tr
style="text-align:center"><th>&nbsp;</th><th><img
src="http://blog.xebia.fr/wp-content/uploads/2009/07/add.gif" alt="add" title="add" width="16" height="16" class="alignnone size-full wp-image-2488" /></th><th><img
src="http://blog.xebia.fr/wp-content/uploads/2009/07/forbidden.gif" alt="forbidden" title="forbidden" width="16" height="16" class="alignnone size-full wp-image-2489" /></th></tr><tr><th> Wicket</th><td ><ul><li>Séparation des rôles</li><li>Clarté du code HTML</li></ul></td><td><ul><li>Syntaxe déclarative très verbeuse dans le code Java</li></ul></td></tr><tr><th>Tapestry&nbsp;5</th><td ><ul><li>Très proches des JSP et autres Freemarker</li><li>Instanciation implicite des composants</li></ul></td><td ><ul><li>Layout par composition, moins intuitif que l&#8217;héritage</li></ul></td></tr></tbody></table><p>Force est de constater le côté plus laxiste de Tapestry 5, qui donne une plus grande liberté pour la rédaction des templates HTML, et qui surtout dépayse moins du J2EE traditionnel. Cette liberté a bien sûr un coût car elle permet au développeur de faire à peu près tout et surtout n&#8217;importe quoi. Il faudra garder un œil attentif à ce que font les développeurs, pour éviter de se retrouver avec un code illisible.</p><h3>Principe de navigation</h3><p>Dans les deux cas, la navigation est assurée par des composants de type <strong><em>Link</em></strong> ou <strong><em>Form</em></strong> qui lèvent des évènements en relation avec les requêtes de l&#8217;utilisateur. C&#8217;est la méthode captant l&#8217;évènement qui va définir la Page à retourner au client.</p><p>Pour Wicket, il faut appeler explicitement <strong><em>setResponsePage(&#8230;)</em></strong> dans la méthode du composant captant l&#8217;évènement. Ici, Il est possible de fournir une classe, ou une instance de Page.  Par défaut, les URL sont générées pour la durée de vie de la session; mais il existe une alternative basée sur des <strong><em>BoorkmarkableLink</em></strong> permettant de créer des liens persistants. A chaque appel, les objets composants et pages sont instanciés puis stockés en session, seuls les templates sont stockés dans un cache qui permet d&#8217;accélérer le rendu et de recharger les templates à chaud pour le même prix.</p><p>Chez Tapestry, c&#8217;est le retour de la méthode captant l&#8217;évènement qui détermine la page ou le contenu de la réponse HTTP. Au développeur de choisir le type de retour, une chaîne pour le nom de la page, la classe de la page, la page instanciée, ou d&#8217;autres type de retour comme les objets JSON et les <strong><em>Stream</em></strong>. Les URL sont générées en REST de manière à assurer leurs persistance côté client. Notez que les pages sont instanciées une fois, puis conservée dans un pool pour être réutilisées par n&#8217;importe quelle session. Les pages passent donc par une phase de nettoyage après chaque utilisation. Il faut définir des méthodes <strong><em>onActivate</em></strong> et <strong><em>onPassivate</em></strong> pour récupérer le ou les paramètres stockés dans l&#8217;URL et charger les données en conséquence. Une annotation permet aussi de stocker des données en session pour les inconditionnels du genre.</p><table><tbody><tr
style="text-align:center"><th>&nbsp;</th><th><img
src="http://blog.xebia.fr/wp-content/uploads/2009/07/add.gif" alt="add" title="add" width="16" height="16" class="alignnone size-full wp-image-2488" /></th><th><img
src="http://blog.xebia.fr/wp-content/uploads/2009/07/forbidden.gif" alt="forbidden" title="forbidden" width="16" height="16" class="alignnone size-full wp-image-2489" /></th></tr><tr><th > Wicket</th><td ><ul><li>Contrôle des objets Pages</li><li>Pas de code injecté au runtime</li></ul></td><td ><ul><li>Force l&#8217;instanciation de nombreux objets</li></ul></td></tr><tr><th> Tapestry&nbsp;5</th><td><ul><li>URL Rest</li><li>Econome en mémoire</li></ul></td><td ><ul><li>Force à gérer attentivement l&#8217;état des composants</li></ul></td></tr></tbody></table><p>Il faut retenir tout de même, pour l&#8217;un comme pour l&#8217;autre, qu&#8217;aucune configuration XML n&#8217;est nécessaire.</p><h3><a
name="Validation"></a>Validation</h3><p>Inutile de dire que la validation fait partie des conditions <em>sine qua non</em> à l&#8217;utilisation d&#8217;un framework web. Ici encore, le principe est le même. Il s&#8217;agit d&#8217;ajouter des validateurs prédéfinis aux composants du formulaire. Les deux projets fournissent sensiblement la même liste de validateurs natifs, avec une légère avance pour Wicket. Reste une différence importante. Tapestry est le seul à fournir une validation serveur et client. Mais il le fait au prix d&#8217;une grande restriction, sur l&#8217;initialisation des validateurs, qui ne peut traiter qu&#8217;un seul paramètre de type chaine (JavaScript ?). Pour ce qui est des validations un peu plus avancées, il faut se tourner vers l&#8217;évènement Tapestry <strong><em>onValidate</em></strong> qui permet d&#8217;ajouter des erreurs à la validation du formulaire. De l&#8217;autre côté,  Wicket propose de créer et d&#8217;ajouter au formulaire des <strong><em>IFormValidator</em></strong> qui permettront de faire de la validation sur plusieurs champs. Au final, Wicket a l&#8217;avantage de configurer la validation entièrement en Java. Dans Tapestry il faut plutôt la définir directement dans le template via un attribut <strong><em>validate</em></strong>.</p><p>Ici, pas de miracle, les solutions proposées sont assez simplistes et ne répondront sans doute pas d&#8217;emblée aux logiques de validations compliquées. Elles fournissent tout de même un cadre propre pour la validation qui permettra, avec un peu de développement, de répondre à peu près à tous les besoins.</p><table
class="confluenceTable"><tbody><tr
style="text-align:center"><th>&nbsp;</th><th><img
src="http://blog.xebia.fr/wp-content/uploads/2009/07/add.gif" alt="add" title="add" width="16" height="16" class="alignnone size-full wp-image-2488" /></th><th><img
src="http://blog.xebia.fr/wp-content/uploads/2009/07/forbidden.gif" alt="forbidden" title="forbidden" width="16" height="16" class="alignnone size-full wp-image-2489" /></th></tr><tr><th
class="confluenceTh"> Tapestry&nbsp;5</th><td
class="confluenceTd"><ul><li>Validation côté client</li></ul></td><td
class="confluenceTd"><ul><li>API restrictive en terme d&#8217;ajout de validateurs</li><li>Déclaration des vallidateurs dans le template trop verbeuse</li></ul></td></tr><tr><th
class="confluenceTh"> Wicket</th><td
class="confluenceTd"><ul><li>API pensée pour la personnalisation des validateurs</li></ul></td><td
class="confluenceTd"><ul><li>Pas de notion de validation métier</li></ul></td></tr></tbody></table><h3><a
name="IntgrationdautresFramework"></a>Intégration d&#8217;autres Framework</h3><p>Spring est évidement de la partie, chacun y allant de son annotation pour injecter des beans. Après un peu de plomberie, pour monter la <strong><em>WicketApplication</em></strong> en singleton Spring et lui ajouter la fabrique Spring en tant que <strong><em>ComponentInstanciationListener</em></strong>, il devient possible d&#8217;utiliser <strong><em>@SpringBean(<a
href="name="..."" title="name="..."" >name=&nbsp;&raquo;&#8230;&nbsp;&raquo;</a>)</em></strong> pour injecter ses services dans les composants.</p><p>Dans Tapestry, il suffit de remplacer le <strong><em>TapestryFilter</em></strong>, précédemment utilisé, par le <strong><em>TapestrySpringFilter</em></strong> puis d&#8217;ajouter toujours dans le web.xml la configuration standard de Spring, à savoir un <strong><em>ContextLoaderListener</em></strong> responsable du chargement des différents <strong><em>applicationContext.xml</em></strong>. A partir de là, Tapestry-IoC inclut les beans Spring et les rend disponibles <em>via</em> l&#8217;annotation standard <strong><em>@Inject</em></strong>.</p><p>En plus de Spring, Tapestry fournit une extension pour Hibernate qui permet de le configurer rapidement et de gérer les transactions avec une annotation <strong><em>@CommitAfter</em></strong>. Cela manque un peu d&#8217;intérêt à mon goût, dès lors que Spring est utilisé dans le projet, mais cela peut permettre de s&#8217;en passer plus facilement.</p><p>Pour le JavaScript, Wicket a choisi de camper sur le serveur et de ne rien embarquer en terme de script client. Est-ce un bien ? Est-ce un mal ? En tout cas, Tapestry voit les choses différemment et embarque nativement la librairie PrototypeJS, ainsi que Scriptaculous. Grâce à cela, il fournit out-of-the-box des composants Ajax et la validation client. L&#8217;API JSON.org est utilisé pour les requêtes asynchrones et pour l&#8217;initialisation des composants JavaScript. Pas d&#8217;inquiétude à avoir, si Wicket n&#8217;intègre rien au départ, il est très simple d&#8217;embarquer JQuery par exemple.</p><p>Pour pouvoir bénéficier de composants Web 2.0 avancés et intégrer d&#8217;autres librairies comme GWT, Seam ou que sais-je encore, il faut se tourner vers les contributions. Les deux projets listent un certain nombre de sites de contributions, mais il faut un peu de chance pour tomber sur des composants maintenus.  De ce point de vue, la communauté Wicket semble plus active.</p><h3>Conclusion</h3><p>A la fin, je suis bien forcé de constater que les deux frameworks se valent. La différence se joue un peu sur la performance et beaucoup sur le goût. En clair, si le cahier des charges prévoit une charge importante avec haute disponibilité et scalabilité, Tapestry sera un meilleur choix. Mais ce sera au prix d&#8217;un effort sur la gestion des données persistantes par rapport à Wicket. Pour le reste, il faudra choisir : le développement à la Swing et les composants par héritage de Wicket, ou les template par composition et les composants annotés de Tapestry. J&#8217;ai quant à moi une préférence pour Tapestry 5 qui propose une approche plus naturelle pour les habitués du développement web MVC.  Ceci n&#8217;enlève rien à Wicket, qui est plus rigoureux et ne souffre d&#8217;aucune lenteur.</p><ul><li><a
href="http://blog.xebia.fr/2008/02/14/hands-on-wicket-partie-1/" title="Hands on Wicket" >Hands on Wicket</a></li><li><a
href="http://wicket.apache.org" title="Wicket" >Wicket</a></li><li><a
href="http://tapestry.apache.org/tapestry5/" title="Tapestry 5" >Tapestry 5</a></li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/07/03/tapestry-5-vs-wicket/feed/</wfw:commentRss> <slash:comments>9</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2009/05/11/revue-de-presse-xebia-108/</link> <comments>http://blog.xebia.fr/2009/05/11/revue-de-presse-xebia-108/#comments</comments> <pubDate>Mon, 11 May 2009 16:48:58 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[@Inject]]></category> <category><![CDATA[annotation]]></category> <category><![CDATA[Datagrid]]></category> <category><![CDATA[ESB]]></category> <category><![CDATA[Fuji]]></category> <category><![CDATA[Google]]></category> <category><![CDATA[Guice]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[JavaFX]]></category> <category><![CDATA[JSon]]></category> <category><![CDATA[JSR-299]]></category> <category><![CDATA[OpenESB]]></category> <category><![CDATA[Paris JUG]]></category> <category><![CDATA[RIA]]></category> <category><![CDATA[SOA]]></category> <category><![CDATA[Spring]]></category> <category><![CDATA[SpringSource]]></category> <category><![CDATA[Tapestry]]></category> <category><![CDATA[Wicket]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=1985</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. SOA Fuji, le futur d&#8217;OpenESB Le coin de la technique Concevoir des APIs efficaces JavaFX : informations et controverses Sortie de Wicket 1.3.6 @Inject standardisation de l’injection de dépendances Sortie de Tapestry 5.1 Trucs et astuces Json &#8211; Restfull Evènements de notre communauté en [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>SOA</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/05/11/revue-de-presse-xebia-108/#FujilefuturdOpenESB">Fuji, le futur d&#8217;OpenESB</a></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/05/11/revue-de-presse-xebia-108/#ConcevoirdesAPIsefficaces">Concevoir des APIs efficaces</a></li><li><a
href="http://blog.xebia.fr/2009/05/11/revue-de-presse-xebia-108/#JavaFXinformationsetcontrovers">JavaFX : informations et controverses</a></li><li><a
href="http://blog.xebia.fr/2009/05/11/revue-de-presse-xebia-108/#SortiedeWicket">Sortie de Wicket 1.3.6</a></li><li><a
href="http://blog.xebia.fr/2009/05/11/revue-de-presse-xebia-108/#Inject">@Inject standardisation de l’injection de dépendances</a></li><li><a
href="http://blog.xebia.fr/2009/05/11/revue-de-presse-xebia-108/#SortiedeTapestry">Sortie de Tapestry 5.1</a></li><li><a
href="http://blog.xebia.fr/2009/05/11/revue-de-presse-xebia-108/#TrucsetastucesJsonRestfull">Trucs et astuces Json &#8211; Restfull</a></li></ul><p><strong>Evènements de notre communauté en France et à l&#8217;étranger</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/05/11/revue-de-presse-xebia-108/#SoireDatagridauParisJug">Soirée Datagrid au Paris Jug</a></li></ul><h3><a
name="SOA"></a>SOA</h3><h4><a
name="FujilefuturdOpenESB"></a>Fuji, le futur d&#8217;OpenESB</h4><p>La prochaine version d&#8217;OpenESB, qui sera estampillée &#8216;v3&#8242;, est en cours de développement sous le nom de code &#8216;Project Fuji&#8217;. Ce projet a été récemment mis en avant par Andi Egloff, dans <a
href="http://www.java-tv.com/2009/05/07/fuji-the-next-generation-of-openesb/" title="un webcast" >un webcast</a> qui fait le tour des nombreuses nouveautés. Les principales d&#8217;entre elles sont :</p><ul><li><a
href="http://wiki.open-esb.java.net/Wiki.jsp?page=IntegrationFlowLanguageOverview" title="Integration Flow Language (IFL)" >Integration Flow Language (IFL)</a> : il s&#8217;agit d&#8217;un <a
href="http://martinfowler.com/bliki/DomainSpecificLanguage.html" title="DSL externe" >DSL externe</a> permettant de définir des flux d&#8217;intégrations. Le rôle de ce langage est donc le même que le DSL interne offert par Apache Camel.</li><li><a
href="http://wiki.open-esb.java.net/Wiki.jsp?page=FujiDJBI" title="Distributed JBI" >Distributed JBI</a> : La spécification JBI (<a
href="http://www.jcp.org/en/jsr/detail?id=208" title="JSR208" >JSR-208</a>) ne couvre pas la problématique de distribution des composants JBI sur plusieurs noeuds. Fuji apporte une extension propriétaire pour permettre cette distribution.</li><li><a
href="http://wiki.open-esb.java.net/Wiki.jsp?page=FujiRunningOJCComponentsOSGi" title="Utilisation de composants OpenJBI" >Utilisation de composants OpenJBI</a> : ces composants seront utilisables directement dans OpenESB v3. Le projet prévoit de mettre les composants dont la compatibilité aura été validée dans le <em>repository</em> Maven du projet.</li><li><a
href="http://wiki.open-esb.java.net/Wiki.jsp?page=FujiEIP" title="Enterprise Integration Patterns" >Enterprise Integration Patterns</a> : un certain nombre d&#8217;EIP sera supporté en standard et configurable via le langage IFL.</li></ul><p>La version finale d&#8217;OpenESB v3 est prévue pour le second semestre 2009, l&#8217;équipe du projet annonce une probable <em>preview</em> pour JavaOne en juin.</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="ConcevoirdesAPIsefficaces"></a>Concevoir des APIs efficaces</h4><p>John De Goes vient de publier une série de deux articles (<a
href="http://jdegoes.squarespace.com/journal/2009/5/2/good-api-design-part-1.html" title="première partie" >première partie</a> et <a
href="http://jdegoes.squarespace.com/journal/2009/5/6/good-api-design-part-2.html" title="deuxime partie" >deuxième partie</a>) portant sur les bonnes pratiques de conception d&#8217;APIs. Il s&#8217;appuie sur un exemple d&#8217;API de configuration pour illustrer son propos. Les points qu&#8217;il met particulièrement en avant sont :</p><ul><li>Il est important de sélectionner le niveau d&#8217;abstraction approprié et d&#8217;assurer l&#8217;uniformité de celui-ci sur l&#8217;ensemble de l&#8217;API, ainsi que de définir et respecter une responsabilité pour chaque classe. Ceci concerne la granularité des méthodes, le type d&#8217;objets manipulés en entrée et en sortie, ainsi que la présence et le type d&#8217;exception éventuellement renvoyée.</li><li>N&#8217;offrir qu&#8217;une seule possibilité pour chaque besoin, afin d&#8217;éviter la confusion chez l&#8217;utilisateur de cette API.</li><li>S&#8217;appuyer sur les possibilités offertes par le langage pour empêcher certaines mauvaises utilisations d&#8217;une API.</li><li>L&#8217;API doit être la plus intuitive possible afin de minimiser autant que possible le besoin pour l&#8217;utilisateur d&#8217;avoir à se plonger dans une documentation.</li></ul><p>Certaines de ces idées sont déjà partagées par de nombreux développeurs, mais comme c&#8217;est souvent le cas dans l&#8217;énonciation de bonnes pratiques ou de <em>patterns</em>, tout l&#8217;intérêt réside ici dans la formalisation apportée par l&#8217;auteur.</p><p>Les lecteurs intéressés par cette problématique pourront se tourner vers le livre de Jaroslav Tulach, <a
href="http://apress.com/book/view/1430209739" title="Practical API Design" >Practical API Design</a>, qui apporte l&#8217;intéressant retour d&#8217;expérience d&#8217;un architecte de NetBeans, ou encore <a
href="http://lcsd05.cs.tamu.edu/slides/keynote.pdf" title="How to Design a Good API and Why it Matters" >How to Design a Good API and Why it Matters</a> par Joshua Bloch (auteur de <a
href="http://java.sun.com/docs/books/effective/" title="Effective Java" >Effective Java</a>).</p><h4><a
name="JavaFXinformationsetcontrovers"></a>JavaFX : informations et controverses</h4><p>Depuis plusieurs mois, nous vous rapportons les différentes <a
href="http://blog.xebia.fr/2009/02/16/revue-de-presse-xebia-96/#JavaFxsurmobile" title="informations" >informations</a> et <a
href="http://blog.xebia.fr/2009/03/09/revue-de-presse-xebia-99/#LepositionnementdeJavaFXtoujou" title="controverses" >controverses</a> à propos de JavaFX. Cette technologie RIA, développée par Sun, et introduite en décembre 2008 fait beaucoup parler d&#8217;elle car personne ne sait dire aujourd&#8217;hui ce qu&#8217;il adviendra de JavaFX dans les mois et années à venir.</p><p>Les propos particulièrement négatifs dont JavaFX a été victime à ses débuts se font moins nombreux, non pas parce que cette technologie a convaincu, mais parce qu&#8217;elle n&#8217;est plus au centre des débats. En fait, ceci est bénéfique puisque cela permet d&#8217;observer plus sereinement les différents exemples postés régulièrement par la communauté JavaFX naissante. Il ressort de ce tour d&#8217;horizon que les capacités actuelles de JavaFX ne prêtent pas à critique : les fonctionnalités de graphisme et d&#8217;animations qui sont offertes <a
href="http://java.dzone.com/articles/javafx-im-starting-believe" title="semblent satisfaire" >semblent satisfaire</a> de nombreux développeurs. Le problème porte principalement sur les manques et les promesses non tenues à ce jour :</p><ul><li>la portabilité de JavaFX sur plusieurs environnements (_desktop_, web, mobile, et TV, le fameux &#8216;<em>All the screens of your life</em>&#8216;) n&#8217;est pas assuré puisque le déploiement est impossible sur mobile, faute de <em>device</em> compatible. Le fonctionnement sur téléviseur est lui toujours prévu dans une version ultérieure.</li><li>les composants graphiques de haut niveau sont absents. Il s&#8217;agit pourtant d&#8217;un élément indispensable pour le développement d&#8217;applications RIA.</li></ul><p>Joshua Marinacci, un des meneurs de JavaFX chez Sun, a été interviewé par Scott Hanselman <a
href="http://www.hanselminutes.com/default.aspx?showID=178" title="dans un podcast" >dans un podcast</a>. Il annonce que la démonstration de JavaFX sur TV <em>pourrait</em> être faite lors de JavaOne 2009, en juin. Il reconnaît par ailleurs le marketing excessif entourant cette technologie.</p><p>Outre ces réflexions d&#8217;ordre technique, le rachat de Sun par Oracle constitue une autre source de débats. Personne ne sait quelle décision Oracle prendra quant à JavaFX : soutenir ce projet qui nécessite encore un investissement lourd pour prétendre réellement concurrencer les autres acteurs RIA ou abandonner ce marché. Les différentes opinions sur ce sujet sont présentées et argumentées dans <a
href="http://lescastcodeurs.com/2009/05/les-cast-codeurs-podcast-episode-3/" title="le dernier podcast" >le dernier podcast</a> des Cast Codeurs.</p><h4><a
name="SortiedeWicket"></a>Sortie de Wicket 1.3.6</h4><p><a
href="http://wicket.apache.org/" title="Wicket" >Wicket</a>, le framework orienté composant de la <em>Fondation Apache</em>, sort en version <a
href="http://wicket.apache.org/news.html#News-wicket1.3.6" title="1.3.6" >1.3.6</a> (1.4 toujours en <a
href="http://www.apache.org/dyn/closer.cgi/wicket/1.4-rc2" title="release candidate 2" >release candidate 2</a>).</p><p>Malgré les 7 mois d&#8217;écart avec la version précédente, il ne faut pas s&#8217;attendre à une révolution pour cette nouvelle mouture. Il s&#8217;agit en effet d&#8217;une version de stabilisation et d&#8217;amélioration. On notera donc de nombreux <a
href="http://wicket.apache.org/news.html#News-Bug" title="correctifs de bugs" >correctifs de bugs</a> et <a
href="http://wicket.apache.org/news.html#News-Improvement" title="plusieurs amliorations" >plusieurs améliorations</a>.</p><p>Cette version est téléchargeable sur le <a
href="http://www.apache.org/dyn/closer.cgi/wicket/1.3.6" title="site dApache" >site d&#8217;Apache</a> ou en changeant votre version de <em>pom.xml</em> en 1.3.6.</p><p>A noter, toujours autour de Wicket, le retour critique de <a
href="http://www.tomsquest.com" title="Tom's Quest" >Tom&#8217;s Quest</a> sur <a
href="http://www.tomsquest.com/blog/les-limites-de-wicket/" title="Wicket et ses limites" >Wicket et ses limites</a> après la présentation, chez Zenika, de Martin Dashorst, un des committers principaux de Wicket et coauteur du livre <a
href="http://wicketinaction.com/" title="Wicket In Action" >Wicket In Action</a>.</p><h4><a
name="Inject"></a>@Inject standardisation de l’injection de dépendances</h4><p>Pas mal de bruit la semaine dernière dans la blogosphère Java avec l&#8217;annonce par Google et <a
href="http://www.springsource.com/" title="SpringSource" >SpringSource</a> d&#8217;une nouvelle proposition de JSR dédiée à l&#8217;injection de dépendances : <a
href="http://code.google.com/p/atinject/" title="@Inject ("Annotations for Dependency Injection")" >@Inject (&laquo;&nbsp;Annotations for Dependency Injection&nbsp;&raquo;)</a>.<br
/> Comme le <a
href="http://google-code-updates.blogspot.com/2009/05/javaxinjectinject.html" title="souligne 'Crazy' Bob Lee" >souligne &#8216;Crazy&#8217; Bob Lee</a>, l&#8217;auteur principal de <a
href="http://code.google.com/p/google-guice/" title="Google Guice" >Google Guice</a>, la sortie de Spring 1.0, il y a déjà 5 ans, a apporté l&#8217;injection de dépendances aux masses, via un fichier de configuration propriétaire. Il y a 3 ans, Google Guice a proposé la même chose via des annotations (et SpringSource propose la même chose depuis Spring 2.5).<br
/> Si le succès de Google Guice est assez limité face au raz de marée Spring, le constat est là : il manque un standard. Comme les deux librairies ne sont pas compatibles, si vous exposez à un autre projet/équipe une librairie contenant des dépendances injectées par Google Guice, et que l&#8217;autre équipe utilise Spring, elle devra redéfinir tous les beans et leurs dépendances dans un fichier de configuration Spring (ou des annotations Spring).<br
/> @Inject propose donc de standardiser les annotations, afin de rendre portables sur différents frameworks (<a
href="http://blog.xebia.fr/2009/04/15/google-guice-les-bases-de-linjection-de-dependances/" title="Guice" >Guice</a>, Spring, <a
href="http://blog.xebia.fr/2009/04/24/commencer-linjection-de-dependances-avec-tapestry-ioc" title="Tapestry IOC" >Tapestry IOC</a>, etc.) des classes injectables.</p><p><a
href="http://blog.xebia.fr/2009/05/11/inject-standardisation-de-linjection-de-dependances" title="@Inject standardisation de l’injection de dépendances" >Lire notre article à ce sujet : @Inject standardisation de l’injection de dépendances</a>.</p><h4><a
name="SortiedeTapestry"></a>Sortie de Tapestry 5.1</h4><p>Tapestry, dont on parlait récemment dans l&#8217;article <a
href="http://blog.xebia.fr/2009/04/24/commencer-linjection-de-dependances-avec-tapestry-ioc/" title="linjection de dpendances avec Tapestry IoC" >l&#8217;injection de dépendances avec Tapestry IoC</a>, passe en version 5.1 en respectant à la lettre son nouveau planning d&#8217;une version tout les 4 à 6 mois.<br
/> Outre les améliorations de performance et les nombreux bugs corrigés, la mise à jour embarque des nouveautés sur le support JavaScript, à la traîne par rapport au prédécesseur Tapestry 4.<br
/> Le rafraîchissement de plusieurs zones d&#8217;une page en une seule requête Ajax est maintenant supporté. Tapestry embarque maintenant la console JavaScript <a
href="http://www.gscottolson.com/blackbirdjs/" title="Blackbird" >Blackbird</a>.<br
/> Du côté des améliorations sur les templates, le chargement et le rendu des pages ont été optimisés, ce qui rend T5 plus rapide que jamais.<br
/> Vous pourrez aussi apprécier l&#8217;amélioration substantielle de l&#8217;archetype quickstart qui offre désormais une jolie interface, avec un design css intégré.<br
/> L&#8217;intégration de Spring est maintenant à double sens : on peut injecter des services Tapestry dans un Bean Spring.<br
/> Pour la prochaine version, qui sortira sans doute à la rentrée 2009, l&#8217;accent sera mis sur l&#8217;intégration de Spring Web Flow, et la possibilité d&#8217;utiliser une application Tapestry en tant que Portlet.</p><ul><li><a
href="http://tapestry.apache.org/tapestry5.1/release-notes.html" title="Release note" >Release note</a></li><li><a
href="http://tapestry.apache.org/tapestry5.1/" title="Site Maven du projet" >Site Maven du projet</a></li></ul><h4><a
name="TrucsetastucesJsonRestfull"></a>Trucs et astuces Json &#8211; Restfull</h4><p><a
href="http://www.linkedin.com/in/edwink" title="Edwin Khodabakchian" >Edwin Khodabakchian</a>, fondateur de Collaxa (aujourd&#8217;hui au coeur de la stratégie SOA d&#8217;Oracle), nous donne quelques <a
href="http://blog.feedly.com/2009/05/06/best-practices-for-building-json-rest-web-services/" title="bonnes pratiques pour crire des services web REST en utilisant Json" >bonnes pratiques pour écrire des services web REST en utilisant Json</a> (un couple qui a le vent en poupe). Actuellement lancé dans l&#8217;écriture de Feedly, une extension Firefox qui agrège des tweets et des entrés Google Reader, Edwin fera régulièrement profiter ses lecteurs de son expérience. Sans entrer dans les détails de ces bonnes pratiques, nous retiendrons l&#8217;astucieux découpage en 7 phases d&#8217;implémentation :</p><ul><li>Definir un service ou une ressource <strong>simple</strong> : définir le modèle Json et les 4 opérations REST et le servlet qui les fournit.</li><li>Ecrire un client : utiliser le service avec un javascript simple. Cette possibilité est offerte par de nombreux frameworks, dont JQuery.</li><li>Ajouter une étape de validation : modifier le service pour valider les ressources Json et utiliser les codes retour HTTP.</li><li>Complexifier les ressources : modifier la hiérarchie d&#8217;Url pour servir des ressources plus riches. Tester la pérennité des ressources simples (phase 2).</li><li>Ajouter un cache : améliorer les performances et la scalabilité de votre système.</li><li>Implémenter la sécurité : utiliser une authentification web.</li><li>Publier des événements business : pour découpler les processus REST des processus back-end. Les ressources REST sont traitées, un évènement business est lancé, qui déclenche le ou les traitements back-end.</li><li>Gérer un cycle de vie pour les ressources : coupler un état de la ressource avec la phase de validation et la phase de publication des évènements.</li></ul><h3><a
name="EvnementsdenotrecommunautenFra"></a>Evènements de notre communauté en France et à l&#8217;étranger</h3><h4><a
name="SoireDatagridauParisJug"></a>Soirée Datagrid au Paris Jug</h4><p>Le <a
href="http://blog.xebia.fr/2009/05/06/paris-jug-soiree-grid-computing-le-12-mai/" title="DataGrid au Paris Jug" >DataGrid au Paris Jug</a>, c&#8217;est demain.<br
/> <a
href="http://www.jugevents.org/jugevents/event/16041" title="Pensez  rserver" >Pensez à réserver</a> si ce n&#8217;est déjà fait.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/05/11/revue-de-presse-xebia-108/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2009/01/19/revue-de-presse-xebia-92/</link> <comments>http://blog.xebia.fr/2009/01/19/revue-de-presse-xebia-92/#comments</comments> <pubDate>Mon, 19 Jan 2009 17:39:35 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[FEST-Swing]]></category> <category><![CDATA[GraniteDS]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[jQuery]]></category> <category><![CDATA[JSF]]></category> <category><![CDATA[liquibase]]></category> <category><![CDATA[Maven]]></category> <category><![CDATA[Méthodes agiles]]></category> <category><![CDATA[RIA]]></category> <category><![CDATA[RichFaces]]></category> <category><![CDATA[Seam]]></category> <category><![CDATA[Servlet 3.0]]></category> <category><![CDATA[Wicket]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=1366</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. Agilité Brûlez des Stories, pas des Tâches RIA GraniteDS en version 1.2.0 GA Sortie du framework JavaScript JQuery 1.3 Solution ORM en Javascript : Active Record JS Servlet 3.0 : une API innovante et convergente ? Le coin de la technique Sortie de FEST-Swing [...]]]></description> <content:encoded><![CDATA[<p><img
style="margin: 1em 1em 1em 1em; float: right;" src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" /><br
/> <em>La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Agilité</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/01/19/revue-de-presse-xebia-92/#BrlezdesStoriespasdesTches">Brûlez des Stories, pas des Tâches</a></li></ul><p><strong>RIA</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/01/19/revue-de-presse-xebia-92/#GraniteDSenversionGA">GraniteDS en version 1.2.0 GA</a></li><li><a
href="http://blog.xebia.fr/2009/01/19/revue-de-presse-xebia-92/#SortieduframeworkJavaScriptJQu">Sortie du framework JavaScript JQuery 1.3</a></li><li><a
href="http://blog.xebia.fr/2009/01/19/revue-de-presse-xebia-92/#SolutionORMenJavascriptActiveR">Solution ORM en Javascript : Active Record JS</a></li><li><a
href="http://blog.xebia.fr/2009/01/19/revue-de-presse-xebia-92/#ServletuneAPIinnovanteetconver">Servlet 3.0 : une API innovante et convergente ?</a></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/01/19/revue-de-presse-xebia-92/#SortiedeFESTSwing">Sortie de FEST-Swing 1.0</a></li><li><a
href="http://blog.xebia.fr/2009/01/19/revue-de-presse-xebia-92/#IntgrationContinueavecMaven">Intégration Continue avec Maven</a></li><li><a
href="http://blog.xebia.fr/2009/01/19/revue-de-presse-xebia-92/#NouvelleversiondeRichFaceslaes">Nouvelle version de RichFaces: la 3.3.0 est sortie</a></li><li><a
href="http://blog.xebia.fr/2009/01/19/revue-de-presse-xebia-92/#LiquiBaseDesamliorationsbienut">LiquiBase 1.9 : Des améliorations bien utiles</a></li><li><a
href="http://blog.xebia.fr/2009/01/19/revue-de-presse-xebia-92/#ComparatifdeperformanceentreJS">Comparatif de performance entre JSF/Seam à Wicket</a></li></ul><h3><a
name="Agilit"></a>Agilité</h3><h4><a
name="BrlezdesStoriespasdesTches"></a>Brûlez des Stories, pas des Tâches</h4><p>Beaucoup d&#8217;équipes Scrum sont habituées à décomposer les <a
title="User Stories" href="http://en.wikipedia.org/wiki/User_story">User Stories</a> en tâches pour faciliter la répartition du travail dans l&#8217;équipe. Mais les problèmes arrivent dès lors qu&#8217;elles essaient d&#8217;estimer ces tâches (souvent en heures) et de les suivre.<br
/> <a
title="Ron Jeffries" href="http://en.wikipedia.org/wiki/Ron_Jeffries">Ron Jeffries</a> suggère de <a
title="ne pas utiliser de tches" href="http://xprogramming.com/blog/2008/09/02/tasks-are-teh-suck/">ne pas utiliser de tâches</a>. Il recommande d&#8217;utiliser les stories comme unité. Cela suppose que les stories soient suffisamment <strong>petites</strong>.</p><p>Chris Sims rappelle sur <a
title="InfoQ" href="http://www.infoq.com/news/2009/01/Burn-Stories-Not-Tasks">InfoQ</a> quelques critères pour définir une bonne user story, que l&#8217;on retrouve dans le modèle <a
title="INVEST" href="http://agilesoftwaredevelopment.com/blog/vaibhav/good-user-story-invest">INVEST</a> (<strong>Independant Negotiable Valuable Estimable Small Testable</strong>).<br
/> Une story peut donc être réalisée par un seul développeur à condition qu&#8217;il ait les compétences pour la réaliser de bout en bout. Si votre équipe est spécialisée, vous pouvez y remédier à coup de <strong>pair programming</strong>.</p><p><a
title="Kelly Waters" href="http://www.agile-software-development.com/2009/01/burndown-stories-rather-than-tasks.html">Kelly Waters</a> souligne que le sprint planning est allégé puisqu&#8217;il n&#8217;y a plus l&#8217;étape de décomposition en tâches.</p><p>Ron recommande également de suivre uniquement les stories sur le <strong>Burndown chart</strong>. Brûler les tâches donne l&#8217;impression d&#8217;avancer mais potentiellement aucune fonctionnalité ne sera livrable à la fin du sprint. Restez concentrés sur des fonctionnalités livrables, en vous aidant d&#8217;une bonne définition de <a
title="termin" href="http://www.infoq.com/news/2008/10/PowerOfDone">terminé</a>.</p><h3><a
name="RIA"></a>RIA</h3><h4><a
name="GraniteDSenversionGA"></a>GraniteDS en version 1.2.0 GA</h4><p>Une nouvelle version de Granite Data Services ou GraniteDS (solution serveur JEE pour le développement et le déploiement des applications Adobe Flex) est sortie avec de nouveaux supports pour :</p><ul><li>TopLink (Intégré dans GlassFish V2, Sun AS et Oracle AS).</li><li>EclipseLink (Implémentation de référence pour JPA 2.0, intégré dans GlassFish V3).</li><li>GlassFish (Un service de sécurité spécifique basé le service de sécurité de Tomcat).</li></ul><p>La prochaine version de GraniteDS fournira un support d&#8217;OpenJPA et de JPOX/DataNucleus. Elle fournira également un service de sécurité spécifique pour les serveurs d&#8217;applications WebLogic. Toutefois avec la prochaine version vous aurez la possibilité de déployer la totalité de vos applications Flex/GraniteDS sur les serveurs d&#8217;applications WebLogic.</p><p>Pour voir la liste complète des nouveautés, rendez-vous sur le <a
title="post suivant" href="http://tech.groups.yahoo.com/group/graniteds/message/2518">post suivant</a>.</p><p>Pour se procurer gratuitement GraniteDs 1.2.0 GA, cela se passe <a
title="ici" href="http://sourceforge.net/project/showfiles.php?group_id=183386">ici</a>.</p><h4><a
name="SortieduframeworkJavaScriptJQu"></a>Sortie du framework JavaScript JQuery 1.3</h4><p>L&#8217;équipe de jQuery, un des frameworks JavaScript le plus en vogue aujourd&#8217;hui, annonce la sortie d&#8217;une nouvelle version : <a
title="jQuery 13 and the jQuery Foundation" href="http://blog.jquery.com/2009/01/14/jquery-13-and-the-jquery-foundation/">jQuery 1.3 and the jQuery Foundation</a>.</p><p>JQuery est un framework JavaScript extensible. Il permet de manipuler plus simplement et de manière plus portable (d&#8217;un navigateur à un autre) le JavaScript. Il apporte une syntaxe élégante et légère pour la manipulation d&#8217;un document HTML d&#8217;un navigateur (arbre DOM et évènements).</p><p>Il apporte de base :</p><ul><li>un modèle d&#8217;événement (pression d&#8217;une touche du clavier, clic de souris, etc)</li><li>un sélectionneur de noeud dans l&#8217;arbre DOM</li><li>des routines pour le développement Ajax</li><li>des routines d&#8217;animation graphique</li></ul><p>La communauté jQuery est très active et elle développe de nombreux <a
title="plugins JQuery" href="http://plugins.jquery.com/">plugins JQuery</a>, de la fonction JavaScript utilitaire au composant graphique riche, comme par exemple :</p><ul><li>routine pour la manipulation de formulaire : <a
title="Form Plugin" href="http://plugins.jquery.com/project/form">Form Plugin</a></li><li>composant graphique pour la réalisation de graphe : <a
title="jQuery Google Charting" href="http://keith-wood.name/gChart.html">jQuery Google Charting</a></li></ul><p>La version 1.3 met à disposition différentes mises à jours:</p><ul><li><a
title="Performances amliores" href="http://docs.jquery.com/Release:jQuery_1.3#Performance">Performances améliorées</a> avec un nouveau moteur de sélection CSS, une nouvelle méthode de ré-injection HTML (cf ci dessous le deuxième exemple), etc.</li><li>Nouveau modèle d&#8217;événement : <a
title="objet JQueryEvent" href="http://docs.jquery.com/Events/jQuery.Event">objet JQuery.Event</a></li><li><a
title="Objet jQuerysupport" href="http://docs.jquery.com/Utilities/jQuery.browser">Objet jQuery.support</a> pour la détection de fonctionnalités spécifiques (ou de bugs) d&#8217;un navigateur.</li></ul><p>Voici quelques exemples qui illustrent les capacités de JQuery :</p><pre class="brush: java; title: ; notranslate">
// A la fin de chargement de l'arbre DOM par le navigateur
$(document).ready(function() {
// Attachement d'une fonction lors d'un clique à toutes les ancres
// (balise &lt;a&gt;) qui ont une classe CSS nommée &quot;external&quot;
$(&quot;a.external&quot;).click(function() {
alert(&quot;clic sur une ancre de style external&quot;);
});
});
</pre><p>Ainsi avec cet exemple tous les liens avec le style &laquo;&nbsp;external&nbsp;&raquo; dès qu&#8217;ils seront cliqués afficheront un message d&#8217;alerte.</a></p><p>Voici un exemple d&#8217;appel Ajax :</p><pre class="brush: java; title: ; notranslate">
$.ajax({
type: &quot;GET&quot;,
url: 'http://host.com/page.html',
success: function(content) {
// content est un parametre qui contient le code HTML de la page à l'url http://host.com/page.html
$(&quot;#content&quot;).html(content);
},
error: function() {
logInPage('Erreur de chargement Ajax de la page : http://host.com/page.html');
}
});
</pre><p>Le code <code>$("#content")</code> signifie que l&#8217;on sélectionne la balise avec l&#8217;identifiant content. La fonction html(&laquo;&nbsp;<code>&lt;a href...</code>&laquo;&nbsp;) signifie que l&#8217;on met dans la balise le code html en paramètre.</p><p>Ainsi si vous avez initialement dans votre page <code>&lt;div id="content"&gt;en cours de chargement ...&lt;/div&gt;</code>, après l&#8217;appel Ajax, le contenu de la page sera <code>&lt;div id="content"&gt;&lt;h1&gt;Titre1&lt;h1&gt;...&lt;/div&gt;</code> (où <code>&lt;h1&gt;Titre1&lt;h1&gt;...</code> est le contenu de la page à l&#8217;url <a
title="httphostcompagehtml" href="http://host.com/page.html">http://host.com/page.html</a>).</p><p>JQuery est un excellent framework, notamment grâce à une syntaxe bien pensée, mais qui exige quand même un certain coût d&#8217;entrée. Cependant, les exemples à disposition sont nombreux. De quoi réconcilier un certain nombre de développeurs Java avec le développement Web/Javascript.</p><h4><a
name="SolutionORMenJavascriptActiveR"></a>Solution ORM en Javascript : Active Record JS</h4><p>La société Aptana annonce la <a
title="premire version de Active Record" href="http://www.aptana.com/blog/rjohnson/activerecord_js_released_as_beta">première version de Active Record</a> qui permet d&#8217;utiliser une solution de mapping objet/relationnel (ORM) en Javascript en utilisant différents connecteurs :</p><ul><li>En mémoire, pour ne pas utiliser de base de données</li><li>Google Gears (solution de persistance côté client)</li><li><a
title="Adobe Air" href="http://www.adobe.com/fr/products/air/">Adobe Air</a></li><li><a
title="SQLite" href="http://www.sqlite.org/">SQLite</a> ou <a
title="MySQL" href="http://www.mysql.fr/">MySQL</a></li><li>Des environnements compatibles <a
title="HTML 5" href="http://dev.w3.org/html5/spec/Overview.html">HTML 5</a>. Cette nouvelle version de HTML propose une <a
title="spcification dAPI de stockage ct client" href="http://www.w3.org/TR/html5/structured.html#structured">spécification d&#8217;API de stockage côté client</a></li></ul><p>Ce framework met en œuvre le pattern du même nom. Le <a
title="pattern Active Record" href="http://fr.wikipedia.org/wiki/Active_record_(patron_de_conception)">pattern Active Record</a> est un pattern souvent utilisé dans les frameworks Rails comme <a
title="RubyOnRails" href="http://rubyonrails.org/">RubyOnRails</a>, <a
title="Django (Python)" href="http://www.djangoproject.com/">Django (Python)</a> ou <a
title="Grails (Groovy)" href="http://grails.org/">Grails (Groovy)</a>. C&#8217;est une approche pour lire les données d&#8217;une DB. Les attributs d&#8217;une table ou d&#8217;une vue sont encapsulés dans une classe.</p><p>Voici quelques opérations élémentaires qui peuvent être réalisées avec ActiveRecord JS :</p><pre class="brush: java; title: ; notranslate">
// Connection en memoire (sans base de donnees)
ActiveRecord.connect(ActiveRecord.Adapters.InMemory);
// Creation du schema
ActiveRecord.execute('CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, ...
// Creation d'une entite
var jessica = User.create({
username: 'Jessica',
password: 'rabbit'
});
// Sauvegarde
jessica.save(); // ou jessica.synchronize()
// Recherche
User.findByUsername('Jessica');
</pre><p>Cependant ce n&#8217;est qu&#8217;une version béta,  quelques problèmes d&#8217;implémentation subsistant, en particulier pour Internet Explorer.</p><p>Avec un tel framework, le client (navigateur) pourra fonctionner de manière plus détachée du serveur. D&#8217;une part, le client gèrera ses données propres indépendamment du serveur. D&#8217;autre part le client pourra sauvegarder et restaurer des informations dans le but de se re-synchroniser avec le serveur. Le client pourra gérer plus de traitement sans être lié au serveur, en quelque sorte en mode hors ligne (&laquo;&nbsp;offline&nbsp;&raquo;).</p><p>Pour plus d&#8217;informations vous pouvez consulter la page d&#8217;<a
title="Active Record JS" href="http://activerecordjs.org/">Active Record JS</a></p><h4><a
name="ServletuneAPIinnovanteetconver"></a>Servlet 3.0 : une API innovante et convergente ?</h4><p>L&#8217;API Servlet 3.0 vient de franchir le <em>Public Review Ballot</em> et nous pouvons aujourd&#8217;hui voir l&#8217;ampleur des innovations qu&#8217;apporte cette version. Les promesses de cette JSR concernaient principalement les applications RIA (introduction d&#8217;un mode asynchrone/comet) et l&#8217;intégration des frameworks web (accès programmatique à l&#8217;enregistrement des servlets et des filtres ou encore à la gestion des login et logout).<br
/> Si le manque de maturité des modes asynchrone et Comet pouvait rendre délicat leur standardisation, l&#8217;intégration des frameworks web semblait plus aisée étant donnée la longue expérience du monde Java sur ce sujet.</p><p>Hélas, on peut douter que Servlet 3.0 améliore réellement l&#8217;intégration de frameworks populaires comme SpringMVC, Struts2 ou encore Wicket. Cette <em>pluggability</em> passe d&#8217;abord par la possibilité de brancher un conteneur externe (comme Spring Framework ou Google Guice) pour instancier les composants de l&#8217;application (y compris les Servlet, les Filter et les ServletContextListener). Servlet 3.0 aurait pu mettre fin au monopole des conteneurs de servlets pour gérer le cycle de vie de ces composants, en introduisant une API de <a
title="Service Provider Interface" href="http://en.wikipedia.org/wiki/Service_provider_interface">Service Provider Interface</a>, qui permettrait d&#8217;utiliser un conteneur externe. Ces SPI sont fréquentes dans les API Java (cf <a
title="JSF FactoryFinder" href="http://java.sun.com/javaee/5/docs/api/index.html?javax/faces/FactoryFinder.html">JSF FactoryFinder</a>, <a
title="JAX-WS Provider" href="http://java.sun.com/javaee/5/docs/api/index.html?javax/xml/ws/spi/Provider.html">JAX-WS Provider</a>, etc) et ont fait leurs preuves dans les frameworks web (<a
title="Struts2 ObjectFactory" href="http://struts.apache.org/2.x/struts2-core/apidocs/index.html?com/opensymphony/xwork2/ObjectFactory.html">Struts2 ObjectFactory</a>, <a
title="Wicket IWebApplicationFactory" href="http://wicket.apache.org/docs/wicket-1.3.2/wicket/apidocs/index.html?org/apache/wicket/protocol/http/IWebApplicationFactory.html">Wicket IWebApplicationFactory</a>, etc).</p><p>A la place, Servlet 3.0  introduit un nouveau conteneur d&#8217;objets qui, s&#8217;il reprend les annotations standard <code>@EJB</code>, <code>@Resource</code>, <code>@PersistenceContext</code>, etc , n&#8217;en reste pas moins différent des déjà standards conteneur EJB, conteneur EJB Lite 3.1, conteneur de Managed Bean JSF ou encore du très probable conteneur de Web Beans.</p><p>L&#8217;enregistrement programmatique des Servlet et Filter (<code>ServletContext#addServlet(...)</code> et <code>ServletContext#addFilter(...)</code>) n&#8217;assouplit pas le monopole du conteneur de servlet sur le cycle de vie des Servlet et Filter : on enregistre les composants par leur nom de classe et le conteneur de servlet se charge de les instancier.</p><p>Par ailleurs, les annotations Servlet 3.0 (@WebServlet, @ServletFilter, @GET, etc), en plus de ne mutualiser ni le code, ni les concepts équivalents du très récent JAX-RS ( <a
title="@Path" href="https://jsr311.dev.java.net/nonav/javadoc/index.html?javax/ws/rs/Path.html">@Path</a> , <a
title="GET" href="https://jsr311.dev.java.net/nonav/javadoc/index.html?javax/ws/rs/GET.html">GET</a>, etc), ont été beaucoup moins ambitieuses puisqu&#8217;on ne retrouve pas les <a
title="QueryParam" href="https://jsr311.dev.java.net/nonav/javadoc/index.html?javax/ws/rs/QueryParam.html">QueryParam</a>, <a
title="PathParam" href="https://jsr311.dev.java.net/nonav/javadoc/index.html?javax/ws/rs/PathParam.html">PathParam</a>, etc. de JAX-RS, qui existent pourtant depuis bien longtemps dans nos framework Web MVC (cf. Spring MVC <a
title="WebParam" href="http://static.springframework.org/spring/docs/2.5.x/api/index.html?org/springframework/web/bind/annotation/RequestParam.html">@WebParam</a>).</p><p>Ces limitations de la <em>pluggability</em> des frameworks web de Servlet 3.0 restreignent les perspectives de standardisation des frameworks web autres que JSF, pourtant si controversé <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' /> .</p><p>En revanche, petit rayon de soleil, le support des modes asynchrone/Comet dans Servlet 3.0 semble satisfaire les projets innovants en la matière même s&#8217;ils vont sensiblement plus loin que la nouvelle API startAsync() (cf <a
title="Grizzly and the New Atmosphere Comet Framework QA with Project Lead JeanFrancois Arcand" href="http://www.infoq.com/news/2008/06/grizzly-atmosphere">Grizzly and the New Atmosphere Comet Framework: Q&amp;A with Project Lead Jean-Francois Arcand</a>]).</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="SortiedeFESTSwing"></a>Sortie de FEST-Swing 1.0</h4><p>Alex Ruiz nous informe sur <a
title="son blog" href="http://www.jroller.com/alexRuiz/">son blog</a> de la sortie de <a
title="FESTSwing en version 10" href="http://www.jroller.com/alexRuiz/entry/fest_swing_1_0_gui">FEST-Swing en version 1.0</a>.</p><p>Pour rappel FEST-Swing, tout comme <a
title="UISpec4J" href="http://www.uispec4j.org/">UISpec4J</a>, est un outil de test d&#8217;interface utilisateur pour une application Swing.</p><p>Ses principales caractéristiques sont :</p><ul><li>Support de tous les composants Swing standard (JDK),</li><li>API de création et de maintenance des tests,</li><li>Simulation de toutes les interactions utilisateur (souris, clavier&#8230;),</li><li>Supporte les Applets,</li><li>Ajout des captures d&#8217;écran des erreurs dans le rapport HTML,</li><li>Utilisable avec JUnit et TestNG.</li></ul><p>Une interface utilisateur devient alors aussi simple à tester que :</p><pre class="brush: java; title: ; notranslate">
dialog.comboBox(&quot;domain&quot;).select(&quot;Xebia&quot;);
dialog.textBox(&quot;username&quot;).enterText(&quot;rmaton&quot;);
dialog.button(&quot;login&quot;).click();
dialog.optionPane().requireErrorMessage().requireMessage(&quot;Please enter your password&quot;);
</pre><p>Chaque classe de tests a la possibilité de définir les fonctions <em>setUp</em> et <em>tearDown</em> :</p><ul><li><em>setUp</em> et <em>tearDown</em> en JUnit 3.8.x</li><li>Toutes méthodes avec <em>@After</em> et <em>@Before</em> pour JUnit 4.x</li><li>Toutes méthodes avec <em>@AfterMethod</em> et <em>@BeforeMethod</em> pour TestNG</li></ul><p>On se retrouve avec des tests du type :</p><pre class="brush: java; title: ; notranslate">
import org.testng.annotations.*;
import org.fest.swing.fixture.FrameFixture;
public class FirstGUITest {
private FrameFixure window;
@BeforeMethod
public void setUp() {
window = new FrameFixture(new MyFrame());
window.show(); // shows the frame to test
}
@AfterMethod
public void tearDown() {
window.cleanUp();
}
@Test
public void shouldCopyTextInLabelWhenClickingButton() {
// Your unit tests
}
}
</pre><p>La librairie se télécharge <a
title="ici" href="http://code.google.com/p/fest/downloads/list">ici</a> ou, pour notre <a
title="pom" href="http://maven.apache.org/">pom</a> adoré, dans ce <a
title="repository" href="http://fest.googlecode.com/svn/trunk/fest/m2/repository/">repository</a>.</p><h4><a
name="IntgrationContinueavecMaven"></a>Intégration Continue avec Maven</h4><p><a
title="Brian Fox" href="http://blogs.sonatype.com/people/author/brian/">Brian Fox</a> de <a
title="Sonatype" href="http://www.sonatype.com/">Sonatype</a> nous livre ses <a
title="Maven Continuous Integration Best Practices" href="http://blogs.sonatype.com/people/2009/01/maven-continuous-integration-best-practices/">Maven Continuous Integration Best Practices</a> pour faciliter l&#8217;<a
title="Intégration Continue" href="http://fr.wikipedia.org/wiki/Integration_continue">Intégration Continue</a> (IC) avec <a
title="Maven" href="http://maven.apache.org/">Maven</a> :</p><ul><li>Laisser le server d&#8217;IC <strong>déployer automatiquement les snapshots</strong> pour s&#8217;assurer que le repository est synchro avec le système de gestion des sources. <a
title="Nexus" href="http://www.sonatype.com/products/nexus">Nexus</a> aide en purgeant automatiquement les snaphosts.</li><li><strong>Isoler les repository locaux</strong> des différents projets avec <em>-Dmaven.repo.local=xxx</em> pour éviter qu&#8217;un artifact buildé par un projet ne soit visible par les autres builds</li><li><strong>Purger</strong> régulièrement (tous les soirs) les repository locaux permet de garder l&#8217;espace disque sous contrôle</li><li>Activer le <strong>mode Batch</strong> pour raccourcir les logs (skip les traces de téléchargement des dépendances) avec <em>-B</em> ou dans <em>settings.xml</em> :</li></ul><pre class="brush: java; title: ; notranslate">
false
</pre><ul><li>Activer les <strong>traces complètes</strong> <em>-e</em> pour débugger plus facilement</li><li>Rediriger les <strong>erreurs des tests</strong> sur la <strong>sortie standard</strong> avec <em>-Dsurefire.useFile=false</em> ou dans <em>settings.xml</em> :</li></ul><pre class="brush: java; title: ; notranslate"> true </pre><ul><li>Toujours chercher les <strong>snapshots</strong> avec <em>-U</em> ou dans <em>settings.xml</em> :</li></ul><pre class="brush: java; title: ; notranslate">
always
</pre><h4><a
name="NouvelleversiondeRichFaceslaes"></a>Nouvelle version de RichFaces: la 3.3.0 est sortie</h4><p>4 mois après la dernière version (<a
title="3.2.2" href="http://www.jboss.org/community/docs/DOC-11878">3.2.2</a>), JBoss sort la version <a
title="330" href="http://www.jboss.org/community/docs/DOC-11879">3.3.0</a> de RichFaces.<br
/> Celle-ci a corrigé pas mal de bugs, la liste est disponible sur <a
title="Jira" href="https://jira.jboss.org/jira/browse/RF/fixforversion/12312451">Jira</a>. Ella a amélioré certains composants ou en a simplifié d&#8217;autres. Enfin, le support du navigateur Chrome a été revu et amélioré.</p><p><a
title="Deux nouveaux composants" href="https://www.jboss.org/community/docs/DOC-13245">Deux nouveaux composants</a> viennent s&#8217;ajouter aux nombreux déjà existants :</p><ul><li>l&#8217;éditeur WYSIWYG adapté de <a
title="TinyMCE" href="http://tinymce.moxiecode.com/">TinyMCE</a> accessible par la balise <a
title="ampltricheditorampgt" href="http://www.jboss.org/file-access/default/members/jbossrichfaces/freezone/docs/devguide/en/html/editor.html">&lt;rich:editor&gt;</a>,</li><li>l&#8217;amélioration du traffic Ajax grâce à une file d&#8217;attente, en utilisant la balise <a
title="amplta4jqueueampgt" href="http://www.jboss.org/file-access/default/members/jbossrichfaces/freezone/docs/devguide/en/html/queue.html">&lt;a4j:queue&gt;</a>.</li></ul><p><strong>L&#8217;éditeur</strong> ne nécessite pas de code javascript supplémentaire, tout est paramétrable par les propriétés du composant. Et surtout, il est extensible, on peut ajouter <a
title="ses propres plugins" href="http://tinymce.moxiecode.com/plugins_thirdparty.php">ses propres plug-ins</a>.</p><p><strong>La file d&#8217;attente</strong> Ajax est la petite révolution de cette version. Ce qu&#8217;on reproche souvent à JSF, c&#8217;est de rendre difficile l&#8217;utilisation d&#8217;Ajax dans le cycle de vie JSF. Ce composant va mettre de l&#8217;ordre dans tout ça et ne laisser passer qu&#8217;une requête à la fois, les autres sont mises en attente. Il va aussi réduire la charge du serveur en <a
title="combinant plusieurs requêtes" href="http://www.jboss.org/file-access/default/members/jbossrichfaces/freezone/docs/devguide/en/html/ArchitectureOverview.html#d0e1578">combinant plusieurs requêtes</a> si celles-ci sont similaires. Enfin, <a
title="plusieurs files dattente" href="http://www.jboss.org/file-access/default/members/jbossrichfaces/freezone/docs/devguide/en/html/ArchitectureOverview.html#QueuePrinciples">plusieurs files d&#8217;attente</a> peuvent être définies pour une gestion plus fine des requêtes (Global default queue, View scoped default queue, View scoped named queue, Form-based default queue).</p><p>D&#8217;autre part, quelques nouvelles fonctionnalités sont venues enrichir plusieurs composants:</p><ul><li>le slider de nombre qui permet de changer une valeur en faisant glisser un curseur sur une ligne (<a
title="ampltrichinputNumberSliderampgt" href="http://www.jboss.org/file-access/default/members/jbossrichfaces/freezone/docs/devguide/en/html/inputNumberSlider.html">&lt;rich:inputNumberSlider&gt;</a>) peut être positionné verticalement,</li><li>l&#8217;évènement &laquo;&nbsp;clic droit&nbsp;&raquo; (onRowContextMenu) a été ajouté sur les lignes d&#8217;un tableau et permet de faire apparaître des informations (<a
title="ampltrichdataTableampgt" href="http://www.jboss.org/file-access/default/members/jbossrichfaces/freezone/docs/devguide/en/html/dataTable.html">&lt;rich:dataTable&gt;</a>),</li><li>l&#8217;élément d&#8217;un menu (<a
title="&lt;rich:menuItem&gt;" href="http://www.jboss.org/file-access/default/members/jbossrichfaces/freezone/docs/devguide/en/html/menuItem.html">&lt;rich:menuItem&gt;</a>) peut être utilisé seul et ajouté directement dans la <a
title="toolbar" href="http://www.jboss.org/file-access/default/members/jbossrichfaces/freezone/docs/devguide/en/html/toolBar.html">toolbar</a>.</li></ul><p>Comme toujours avec RichFaces, il est possible de voir à l&#8217;oeuvre les composants sur <a
title="la page de dmonstration" href="http://livedemo.exadel.com/richfaces-demo-3.3.0.GA/richfaces/orderingList.jsf?tab=info&amp;cid=2814">la page de démonstration</a>.</p><p>Enfin, le souhait des <a
title="utilisateurs" href="http://www.jboss.org/community/docs/DOC-11862">utilisateurs</a> va se réaliser, la prochaine version de RichFaces a pour objectif d&#8217;enrichir les possibilités de positionnement des composants dans une page.</p><h4><a
name="LiquiBaseDesamliorationsbienut"></a>LiquiBase 1.9 : Des améliorations bien utiles</h4><p>Le mois dernier, un billet sur <a
title="la refactorisation de base de donnes" href="http://blog.xebia.fr/2008/12/03/refactorisation-de-bases-de-donnees-avec-liquibase/">la refactorisation de base de données</a> avait présenté LiquiBase dans sa version 1.8.1. Nous tenions donc à vous informer de la sortie d&#8217;une nouvelle version qui confirme la forte activité autour de cet outil.</p><p>Sans surprise, <a
title="cette version 190" href="http://blog.liquibase.org/2009/01/liquibase-190-released.html">cette version 1.9.0</a> corrige son lot de bugs et améliore la validation dans le schéma XSD.</p><p>La fonctionnalité majeure de cette nouvelle release se trouve dans la balise <a
title="ampltmodifySQLampgt" href="http://www.liquibase.org/manual/modify_sql">&lt;modifySQL&gt;</a>. Elle offre un mécanisme de modification du code SQL après génération par les balises standards. Cela permet d&#8217;ajouter des informations spécifiques à la base de données utilisée, comme &laquo;&nbsp;engine innodb&nbsp;&raquo; pour une base MySQL.<br
/> Là où, avant, on devait passer par du code SQL custom (<a
title="ampltsqlampgt" href="http://www.liquibase.org/manual/custom_sql">&lt;sql&gt;</a>), on va pouvoir rester sur les balises existantes et les modifier à notre guise.</p><p>D&#8217;autre part, une nouvelle balise (<a
title="ampltstopampgt" href="http://www.liquibase.org/manual/stop">&lt;stop&gt;</a>) permet, en développement, d&#8217;arrêter le traitement du fichier et d&#8217;aller regarder dans la base de données pour voir si tout se passe comme il faut.</p><p>Enfin, dans les versions précédentes, pour inclure d&#8217;autres fichiers, il fallait les énumérer un par un, à présent, il suffit d&#8217;indiquer un répertoire avec la balise <a
title="ampltincludeAllampgt" href="http://www.liquibase.org/manual/includeall">&lt;includeAll&gt;</a>. Il faut toutefois être prudent car l&#8217;ordre des fichiers est important et cette balise parcours la liste dans l&#8217;ordre alphabétique, une politique précise de nommage s&#8217;impose.</p><p><a
title="Pour rassurer certains" href="http://blog.liquibase.org/2009/01/a-note-on-version-numbering.html">Pour rassurer certains</a> qui penseraient qu&#8217;il vaut mieux attendre la version 2.0 qui sort généralement après la version 1.9, le responsable du projet LiquiBase précise que la version majeure n&#8217;est pas prévue dans l&#8217;immédiat et que les prochaines versions seraient 1.10, 1.11, etc.</p><p>Donc n&#8217;ayez crainte et allez-y.</p><h4><a
name="ComparatifdeperformanceentreJS"></a>Comparatif de performance entre JSF/Seam à Wicket</h4><p>Peter Thomas nous propose dans son article <a
title="Seam / JSF vs Wicket: performance comparison" href="http://ptrthomas.wordpress.com/2009/01/14/seam-jsf-vs-wicket-performance-comparison/#comments">Seam / JSF vs Wicket: performance comparison</a>, un comparatif de performance entre une solution <a
title="Seam/JSF" href="http://www.seamframework.org/">Seam/JSF</a> et <a
title="Wicket" href="http://wicket.apache.org/">Wicket</a>.</p><p>Il y a deux éléments intéressants dans cet article :</p><ul><li>Le resultat de l&#8217;étude : Wicket semble plus performant que Seam/JSF</li></ul><p>En effet, Wicket a une empreinte moins grande que Seam/JSF :</p><ul><li>Wicket consomme moins de mémoire JVM</li><li>Wicket charge moins de classes</li><li>Wicket démarre plus rapidement. Le temps de démarrage n&#8217;est pas un critère primordial mais il est représentatif des performances globales et impacte le développement</li><li>Wicket a de meilleurs temps de réponse sur les différents scénarii</li></ul><ul><li>La méthode de test de performance.</li></ul><p>Ce n&#8217;est pas une méthode formelle qui garantit le résultat de manière scientifique mais cela donne une tendance.<br
/> Les outils utilisés sont :</p><ul><li>Ant pour le scripting du benchmark</li><li><a
title="JMeter" href="http://jakarta.apache.org/jmeter/">JMeter</a> pour réaliser les mesures de temps de réponses en injectant une charge</li><li><a
title="Eclipse Memory Analyzer" href="http://www.eclipse.org/mat/">Eclipse Memory Analyzer</a> pour réaliser les mesures d&#8217;empreinte mémoire de la JVM</li></ul><p>Le travail effectué peut être facilement étendu à d&#8217;autres frameworks. Il est en outre possible de réutiliser une partie des scripts du projet <a
title="Google Code PerfBench" href="http://perfbench.googlecode.com/svn/trunk/perfbench/">Google Code PerfBench</a>.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/01/19/revue-de-presse-xebia-92/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2008/09/08/revue-de-presse-xebia-73/</link> <comments>http://blog.xebia.fr/2008/09/08/revue-de-presse-xebia-73/#comments</comments> <pubDate>Mon, 08 Sep 2008 17:44:18 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Flex]]></category> <category><![CDATA[GWT]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Méthodes agiles]]></category> <category><![CDATA[RCP]]></category> <category><![CDATA[RIA]]></category> <category><![CDATA[SCRUM]]></category> <category><![CDATA[SOA]]></category> <category><![CDATA[Sun]]></category> <category><![CDATA[Wicket]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=611</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII Sortie de VirtualBox 2.0 Agilité Martin Fowler à propos de Scrum RIA ActionScript 3 vu par les programmeurs Java Le coin de la technique Comparaison avec le code de Wicket à GWT Liste de question à se poser lors du [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Actualité éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/09/08/revue-de-presse-xebia-73/#SortiedeVitualBox">Sortie de VirtualBox 2.0</a></li></ul><p><strong>Agilité</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/09/08/revue-de-presse-xebia-73/#MartinFowlerproposdeScrum">Martin Fowler à propos de Scrum</a></li></ul><p><strong>RIA</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/09/08/revue-de-presse-xebia-73/#ActionScriptvuparlesprogrammeu">ActionScript 3 vu par les programmeurs Java</a></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/09/08/revue-de-presse-xebia-73/#ComparaisonaveclecodedeWicketG">Comparaison avec le code de Wicket à GWT</a></li><li><a
href="http://blog.xebia.fr/2008/09/08/revue-de-presse-xebia-73/#Listedequestionseposerlorsduch">Liste de question à se poser lors du choix d&#8217;un framework d&#8217;application de bureau</a></li></ul><p><strong>Evènements de notre communauté en France et à l&#8217;étranger</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/09/08/revue-de-presse-xebia-73/#ForumSOA">Forum SOA 2008</a></li><li><a
href="http://blog.xebia.fr/2008/09/08/revue-de-presse-xebia-73/#SoireGroovyauParisJUGceMardiSe">Soirée Groovy au Paris JUG ce Mardi 09 Septembre</a></li></ul><h3><a
name="ActualitditeursSSII"></a>Actualité éditeurs / SSII</h3><h4><a
name="SortiedeVitualBox"></a>Sortie de VirtualBox 2.0</h4><p>Cette semaine est sortie la première évolution de <a
href=" http://www.virtualbox.org/" title="VirtualBox" >VirtualBox</a> depuis l&#8217;acquisition d&#8217;InnoTek par Sun  en février dernier. Pour mémoire, VirtualBox est disponible sous licence GPL depuis janvier 2007 et se positionne comme concurrent sérieux à <a
href=" http://www.vmware.com/fr/" title="VMware" >VMware</a>, <a
href=" http://www.microsoft.com/france/windows/xp/virtualpc/default.mspx" title="VirtualPC" >VirtualPC</a>, <a
href=" http://www.qemu.org/" title="QEmu" >QEmu</a> ou <a
href="http://www.cl.cam.ac.uk/research/srg/netos/xen/" title="Xen" >Xen</a>. Un tableau comparatif avec VMWare est d&#8217;ailleurs disponible sur le <a
href="http://www.virtualbox.org/wiki/VBox_vs_Others" title="site officiel" >site officiel</a> ou vous pouvez également y retrouver la liste des <a
href="http://www.virtualbox.org/wiki/Guest_OSes" title="systèmes d'exploitation compatibles" >systèmes d&#8217;exploitation compatibles</a>.</p><p>La principale nouveauté de cette version 2.0 est la gestion des hôtes 64 bits.</p><p>Autres nouveautés notables :</p><ul><li>L&#8217;interface a été refaite : montée de version de QT (QT4) améliorant l&#8217;intégration avec Gnome et utilisation de l&#8217;interface native sous Mac OS X</li><li>Support <a
href=" http://en.wikipedia.org/wiki/Native_Command_Queuing" title="Native Command Queuing" >Native Command Queuing</a> améliorant les performances des disques durs SATA</li><li>Structure permettant la collecte d&#8217;informations sur l&#8217;utilisation des ressources des machines virtuelles</li><li>Nouveau système d&#8217;avertissement de mises à jour</li><li>Nouveau kit de développement</li><li>Compatibilité avec les images &#8216;Microsoft VHD&#8217; utilisées par Virtual PC</li></ul><h3><a
name="Agilit"></a>Agilité</h3><h4><a
name="MartinFowlerproposdeScrum"></a>Martin Fowler à propos de Scrum</h4><p><a
href="http://www.martinfowler.com/" title="Martin Fowler" >Martin Fowler</a> est interviewé par Jacky Li d&#8217;InfoQ China sur <a
href="http://www.infoq.com/news/2008/09/fowler-scrum-interview" title="Scrum et le futur de l'Agile" >Scrum et le futur de l&#8217;Agile</a>. À retenir :</p><ul><li>L&#8217;adoption des méthodes agiles est particulièrement difficile à cause des changements de mentalité que cela implique. Beaucoup de monde se concentre sur les pratiques plutôt que sur la philosophie, ce qui aboutit généralement à l&#8217;échec de l&#8217;adoption.</li><li>Les impacts de l&#8217;Agilité se sentiront dans plusieurs décennies. En comparaison, la <a
href="http://fr.wikipedia.org/wiki/Orient%C3%A9_objet" title="Programmation Orientée Object" >Programmation Orientée Object</a> &#8211; apparue il y a 40 ans &#8211; a mis 20 ans à devenir le courant principal, et encore même aujourd&#8217;hui le code est écrit en Java mais il n&#8217;est pas orienté Objet.</li><li>La certification Scrum dure seulement 2 jours et le terme &laquo;&nbsp;certification&nbsp;&raquo; peut tromper. Comprendre l&#8217;Agilité reste un exercice qui nécessite plusieurs mois. Cependant, c&#8217;est un bon début pour apprendre car les formateurs Scrum connaissent vraiment leur sujet, ce qui n&#8217;est pas le cas dans beaucoup d&#8217;autres technologies, par exemple RUP ou CMM.</li></ul><p>En conclusion, Martin acquiesce que ce qui importe n&#8217;est pas de savoir &laquo;&nbsp;si un projet est agile&nbsp;&raquo; mais plutôt &laquo;&nbsp;comment s&#8217;améliorer&nbsp;&raquo;.</p><h3><a
name="RIA"></a>RIA</h3><h4><a
name="ActionScriptvuparlesprogrammeu"></a>ActionScript 3 vu par les programmeurs Java</h4><p>Avouons-le, les interfaces graphiques n&#8217;ont jamais été la tasse de thé des équipes de développement Java. Les succès relativement limités de Swing, Awt le prouvent.</p><p>Aujourd&#8217;hui, c&#8217;est Flex qui tient la tête des RIA émergents.</p><p>Alors qu&#8217;en est-il de son appropriation par les équipes Java ? Pour InfoQ, Jack Herrington donne des pistes de comparaison.<br
/> Nous ne nous attarderons pas dans cette revue presse sur les différences syntaxiques, mais plutôt sur les similitudes (ou les divergences) structurelles.</p><ul><li>Les classes : les deux langages sont des langages objets. Ils utilisent tous deux des espaces de nommage et la notion de package. Les imports, les variables de classe, les notions de public / private, les constructeurs vides ou valués, et les méthodes de classe sont aussi au rendez-vous.<br
/> Une différence cependant : les getters / setters des variables de classe sont des méthodes particulières et réservées. Elles ont leur déclaration propre et leur appel se fait de manière transparente (on appelle <em>myClass.myProperty</em> même si en fait c&#8217;est le getter de myProperty qui est appelé).<br
/> Autre différence notable, à la manière de Swing, on peut déclarer un objet comme EventDispatcher : celui-ci lance alors des évènements (sur le changement d&#8217;une variable par exemple) qui peuvent être intercepté à plus haut niveau, par un mécanisme d&#8217;abonnement.</li><li>Interface : nouvelle &laquo;&nbsp;facilité&nbsp;&raquo; offerte par l&#8217;AS, les interfaces peuvent comporter des &laquo;&nbsp;variables&nbsp;&raquo;. En effet, en déclarant des getters / setters dans les interfaces, on donne l&#8217;illusion d&#8217;accéder à des &laquo;&nbsp;variables&nbsp;&raquo; déclarées par l&#8217;interface.<br
/> On a donc une syntaxe du type <em>myInterface.myProperty</em> (au lieu d&#8217;utiliser en java le _getMyProperty()_).</li><li>Constantes : le mot clé <em>final</em> est remplacé par le mot clé _const_</li><li>Variables statiques, Exceptions. Rien de notable</li><li>Héritage : le mot clé <em>abstract</em> est remplacé par le mot clé <em>virtual</em>. Le principe est identique.</li><li>Itérateurs : AS ne propose pas de conteneurs fortement typés, comme les <em>Tree</em>, les <em>Map</em>. Cependant, on peut utiliser le type <em>Objet{}</em> et itérer sur ses attributs, comme on le ferait sur les clés d&#8217;une <em>Map</em>.</li><li>Expressions régulières  : les expressions régulières sont interprétées dans le code AS. On peut les utiliser pour manipuler par exemple des chaînes de caractères (rechercher dans une chaînes , scinder une chaînes&#8230;)</li><li>E4X : l&#8217;une des différences les plus notables à ce jour est l&#8217;intégration du Xml dans ActionScript. Le parcours ou l&#8217;écriture d&#8217;un fichier est vraiment intuitif, grâce à l&#8217;utilisation des fonctions d&#8217;itération ou conditionnelles &laquo;&nbsp;standard&nbsp;&raquo;.</li></ul><p>En conclusion, passer de Java à ActionScript ne devrait pas représenter un traumatisme trop grand. Mais entre posséder les bases et posséder l&#8217;ensemble des subtilités du langage, il faut rester méfiant, et une nouvelle race de développeurs de haut niveau pur &#8216;Flex&#8217; fera probablement bientôt son apparition.</p><p>Pour retrouver l&#8217;intégralité de cet article et ses nombreux exemples, <a
href="http://www.infoq.com/articles/actionscript-java" title="rendez-vous sur InfoQ" >rendez-vous sur InfoQ</a></p><h3><a
name="Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="ComparaisonaveclecodedeWicketG"></a>Comparaison avec le code de Wicket à GWT</h4><p>Dans l&#8217;article <a
href="http://ptrthomas.wordpress.com/2008/09/04/wicket-and-gwt-compared-with-code/" title="Wicket and GWT compared with code" >Wicket and GWT compared with code</a>, Peter Thomas compare deux technologies qui font parler d&#8217;elles depuis quelques temps : <a
href="http://code.google.com/webtoolkit/" title="GWT (Google)" >GWT (Google)</a> et <a
href="http://wicket.apache.org/" title="Wicket (Apache)" >Wicket (Apache)</a></p><p>Il est vrai que ces deux technlogies ont des points techniques en commun :</p><ul><li>GWT et Wicket privilégient la programmation événementielle en Java (à la Swing) plutôt que la programmation déclarative (à la JSP ou JSF)</li><li>Ils ont un modèle de composants (ensemble de <em>Panels</em> et de _Widgets_)</li><li>Ils ont un modèle de composants extensibles</li></ul><p>Cependant, ils se différencient sur plusieurs points :</p><ul><li>Lors de la phase de compilation, GWT analyse le code pour générer une interface Web en DHTML</li><li>Wicket exécute le code Java pour construire les composants, lorsque l&#8217;application Web est déployée</li><li>Wicket utilise le templating HTML et les <em>Widgets</em> pour faciliter la réalisation des pages. GWT utilise de manière intensive la technologie CSS.</li></ul><p>Peter Thomas nous présente ses conclusions à travers 13 points :</p><ol><li>Wicket nous permet un contrôle complet sur le rendu HTML. De manière générale, en GWT, pour avoir une maîtrise complète du rendu HTML <strong>il faut être un virtuose de la technologie CSS</strong>.</li><li>Il est vrai qu&#8217;en GWT, il existe une <em>impedance mismatch</em> entre le langage Java et Javscript (Reflexion, <code>synchronized</code>, &#8230;). Dans certains cas, on doit effectuer des contournements de programmation en Java pour pouvoir effectuer le traitement en Javascript.</li><li>En GWT différentes pratiques doivent être réfléchies, conçues et mises en place pour effectuer de manière élégante certaines implémentations, à l&#8217;image du binding dynamique dans une table</li><li>Il faut maitriser la technolologie CSS pour maitriser le rendu GWT , ce qui n&#8217;est pas toujours évident</li><li>Un point de différence important entre GWT et Wicket et la gestion des <em>Layouts</em>. Wicket gère en priorité les <em>Layouts</em> par le templating HTML tandis que GWT passe par des objets de son modèle de composants : <em>Layout</em>. Cependant, il reste possible dans GWT, de définir un <em>Layout</em> dans la page HTML est d&#8217;injecter N composants GWT dans les balises HTML de cette page (code GWT : <code>RootPanel.get("slot1").add(button)</code>)</li><li>Le débogage en GWT n&#8217;est pas toujours évident car il est difficilement possible de voir les sources (view source dans le navigateur). Cependant, l&#8217;outil de développement <em>GWTHost</em> fonctionne bien et s&#8217;intègre très facilement à l&#8217;IDE Eclipse pour le débogage.</li><li>Une démonstration de la réutilisation du code est faite dans Wicket, qui est un de ses points forts. Des bonnes pratiques de conception sur des applications classiques peuvent être réutilisées pour l&#8217;interface graphique.</li><li>Une difficulté avec GWT est son fonctionnement au premier abord un peu déroutant : la génération de code DHTML à partir du code source Java. Il faut en être conscient et connaître toutes les conséquences (maîtrise des instances d&#8217;objets dans le code Java GWT).</li><li>Avec Wicket, la gestion des URLS bookmarkable demande un effort supplémentaire.</li><li>Il est évident qu&#8217;une compilation de source GWT est plus lente qu&#8217;une compilation de source Wicket. Cependant, ce critère n&#8217;est pas important mais révèle un aspect important actuellement négligé dans GWT : le packaging et l&#8217;organisation des sources, surtout lorsque GWT s&#8217;intègre dans un existant conséquent (avec par exemple des objets métiers éparpillés dans les différents projets de sources).</li><li>Grâce à <a
href="http://blog.xebia.fr/2008/09/01/revue-de-presse-xebia-72/#SortieGWT" title="GWT 1.5" >GWT 1.5</a> et au support du langage 1.5, l&#8217;observation précédente peut être plus facilement gérée</li><li>Un avantage certain de GWT est le fait d&#8217;être déconnecté du serveur ce qui permet un gain important de performance à l&#8217;exécution. Cependant, le développement et debogage des appels distants n&#8217;est pas toujours intuitifs. Il faut aussi faire attention à l&#8217;intégration dans un existant avec une forte responsabilité graphique du serveur (JSP/Servlet). Par exemple, même si des efforts ont été entrepris par la communauté GWT (<a
href="http://hibernate4gwt.sourceforge.net/" title="hibernate4gwt" >hibernate4gwt</a>), pour intégrer des acquis dans cette nouvelle technologie GWT, il reste comme même des régressions dans l&#8217;intégration du client au serveur.</li><li>Il reste cependant difficile d&#8217;effectuer des tests unitaires sur les interfaces graphiques &#8230; on est trop proche du fonctionnel</li></ol><p>Wicket et GWT ont fait le choix audacieux de choisir un langage familier pour le développement d&#8217;application Web en Java. C&#8217;est un énorme avantage. Il faut reconnaître que si GWT introduit de nouveaux problèmes du fait de ces choix techniques, il permet de produire des applications Web de manière très productive. Il permet à un développeur Java de produire des applications Web qu&#8217;il aurait eu énormément de mal à réaliser avec des technologies plus classiques (JSP, HTML, Javascript, &#8230;). GWT et Wicket permettent de populariser le développement pour les purs et durs du développement Java.</p><p>Liens connexes :<br
/> - <a
href="http://www.dotnetguru2.org/bmarchesson/index.php?p=721&#038;more=1&#038;c=1&#038;tb=1&#038;pb=1" title="Blog de Bruno Marchesson" >Blog de Bruno Marchesson</a> qui analyse de manière très critique et argurmentée GWT</p><h4><a
name="Listedequestionseposerlorsduch"></a>Liste de question à se poser lors du choix d&#8217;un framework d&#8217;application de bureau</h4><p>Geertjan Wielenga <a
href="http://java.dzone.com/news/how-choose-a-java-desktop-fram" title="nous propose" >nous propose</a> une liste de questions à se poser lors du choix d&#8217;un framework RCP.</p><p>Les questions sont regroupées par catégorie :</p><ul><li>Architecture : Niveau de scalabilité, de flexibilité ? Comment le framework s&#8217;intègre avec d&#8217;autres frameworks existant ?</li><li>Liste de fonctionnalité : Est-ce que le framework prend en charge un maximum de plomberie pour lier les différentes couches de l&#8217;application ? Est-il facile d&#8217;étendre la liste des fonctionnalités ?</li><li>Open Source : Est-ce que l&#8217;open source s&#8217;inscrit dans votre stratégie d&#8217;entreprise ? Est-ce que l&#8217;Open Source vous fait peur ?</li><li>Communauté : La communauté de développeurs est-elle active ? Le framework a t-il été utilisé et epprouvé dans le cadre d&#8217;une application &laquo;&nbsp;réelle&nbsp;&raquo; ? Quels sont leurs retours d&#8217;expérience sur son utilisation ?</li><li>Période d&#8217;apprentissage : Est-elle conséquente ? Si oui, est-elle contrebalancée par les gains qu&#8217;apporte le framework ? Existe t-il une formation ?</li><li>Outillage : Intégration avec un IDE (niveau ? Quel(s) IDE ?) Y a t-il de la génération automatique ou aide à la complétion de code ?</li><li>Documentation : Existe t-elle ? Est-elle à jour, complète ? Y a t-il des livres (combien) traitant du sujet ?</li><li>Support : Évaluer la rapidité (en fonction de la communauté et de la documentation) de traitement d&#8217;une question ? Existe t-il une mailing-list, un forum, un help desk ? Des patchs sont-ils livrés ou la correction d&#8217;un bug doit-elle attendre une RC ?</li><li>Future : Quel est l&#8217;avenir du framework ? Quelle est la stratégie long terme de la société investissant dans le framework ?</li></ul><p>La catégorie Productivité (rapidité de développement ? Nombre d&#8217;écrans développés par sprint ?) pourrait compléter cette liste pour qualifier un framework.<br
/> Les questions étant assez génériques, cette liste d&#8217;interrogations ne se limite pas seulement au choix d&#8217;un framework d&#8217;applications de bureau, ce questions reviennent lors de la sélection d&#8217;autres types de framework (MVC, RIA&#8230;).</p><h3><a
name="EvnementsdenotrecommunautenFra"></a>Evènements de notre communauté en France et à l&#8217;étranger</h3><h4><a
name="ForumSOA"></a>Forum SOA 2008</h4><p>Pour la troisième année consécutive, <a
href="http://www.lemondeinformatique.fr/" title="le monde informatique" >le monde informatique</a> organise le <a
href="http://forumsoa.lemondeinformatique.fr/" title="Forum SOA" >Forum SOA</a>.<br
/> L&#8217;édition 2008 se tiendra le 9 octobre 2008 à Paris <em>(à l&#8217;Eurosite George V)</em> et a pour thème &laquo;&nbsp;Des processus et des hommes&nbsp;&raquo;.<br
/> Le <a
href="http://forumsoa.lemondeinformatique.fr/download/ProgrammeForumSOA2008.pdf" title="programme" >programme</a> est disponible sur le site de l&#8217;événement.</p><h4><a
name="SoireGroovyauParisJUGceMardiSe"></a>Soirée Groovy au Paris JUG ce Mardi 09 Septembre</h4><p><a
href="http://groovy.codehaus.org/" title="Groovy" >Groovy</a> est à l&#8217;honneur pour la rentrée du Paris JUG, avec les venues de :</p><ul><li>Guillaume Laforge, VP Technology chez <a
href="http://www.g2one.com/" title="G2One" >G2One</a>, qui va nous présenter Groovy, le langage dynamique pour la machine virtuelle Java qui permet d&#8217;accroître la productivité des développements</li><li>Fabrice Robini architecte chez OCTO, qui va nous présenter le framework web Grails, basé sur Groovy, qui permet là aussi de bénéficier de l&#8217;apport de productivité de Groovy, et d&#8217;un maximum de &laquo;&nbsp;Convention over configuration&nbsp;&raquo;</li></ul><p>Pour la description de la soirée et les inscriptions, c&#8217;est <a
href="http://www.parisjug.org/xwiki/bin/view/Meeting/20080909" title="par ici" >par ici</a>.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2008/09/08/revue-de-presse-xebia-73/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>Hands on Wicket &#8211; Partie 4</title><link>http://blog.xebia.fr/2008/04/23/hands-on-wicket-partie-4/</link> <comments>http://blog.xebia.fr/2008/04/23/hands-on-wicket-partie-4/#comments</comments> <pubDate>Wed, 23 Apr 2008 07:31:13 +0000</pubDate> <dc:creator>Manuel Eveno</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[développement]]></category> <category><![CDATA[Web]]></category> <category><![CDATA[Wicket]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/2008/04/23/hands-on-wicket-partie-4/</guid> <description><![CDATA[Dans les précédents articles sur Wicket, nous avons exploré les bases du framework. Nous allons nous intéresser maintenant à quelques fonctionnalités avancées comme le templating ou l&#8217;internationalisation. Les mécanismes de templating Avec Wicket, même le templating est très simple. L&#8217;implémentation du templating dans Wicket est très proche de la façon de faire de SiteMesh (au [...]]]></description> <content:encoded><![CDATA[<p>Dans <a
href="http://blog.xebia.fr/2008/02/14/hands-on-wicket-partie-1/">les</a> <a
href="http://blog.xebia.fr/2008/02/22/hands-on-wicket-partie-2/">précédents</a> <a
href="http://blog.xebia.fr/2008/03/07/hands-on-wicket-partie-3/">articles</a> sur Wicket, nous avons exploré les bases du framework. Nous allons nous intéresser maintenant à quelques fonctionnalités avancées comme le templating ou l&#8217;internationalisation.</p><h3><a
title="Lesmcanismesdetemplating" name="Lesmcanismesdetemplating"></a>Les mécanismes de templating</h3><p>Avec Wicket, même le templating est très simple. L&#8217;implémentation du templating dans Wicket est très proche de la façon de faire de <a
href="http://www.opensymphony.com/sitemesh/" title="SiteMesh">SiteMesh</a> (au moins pour la partie HTML). La mise en œuvre se fait par des mécanismes d&#8217;héritage : Wicket nomme ceci le <a
href="http://cwiki.apache.org/WICKET/markup-inheritance.html" title="Markup Inheritance">Markup Inheritance</a>. Prenons un exemple concret.</p><p>J&#8217;ai une page de template qui va définir le header et le footer commun de mon site. Ensuite le body va varier selon les pages. Je crée donc un fichier HTML et la classe Java associée. Dans le fichier HTML, j&#8217;ai juste besoin de préciser où va s&#8217;insérer le contenu des fils en positionnant la balise <wicket:child>.</wicket:child></p><p>Ce qui donne dans le fichier HTML du parent :</p><pre class="brush: xml; title: ; notranslate">
&lt;html&gt;
&lt;head&gt;
&lt;wicket:head&gt;&lt;/wicket:head&gt;
&lt;/head&gt;
&lt;body&gt;
	&lt;div id=&quot;header&quot;&gt;&lt;!-- Contenu du header --&gt;&lt;/div&gt;
	&lt;div id=&quot;body&quot;&gt;
		&lt;!-- Positionnement du contenu des fils --&gt;
		&lt;wicket:child /&gt;
	&lt;/div&gt;
	&lt;div id=&quot;footer&quot;&gt;&lt;!-- Contenu du footer --&gt;&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre><p>La balise &lt;wicket:head&gt; permettra plus tard d&#8217;ajouter des éléments (comme le titre de la page) dans le header de la page à partir des enfants. Cette zone est en quelque sorte une zone modifiable du template.</p><p>La classe Java (ParentPage.java) associée :</p><pre class="brush: java; title: ; notranslate">
package test.view;
// import ...;
public abstract class ParentPage extends WebPage {
	private static final long serialVersionUID = 1L;
	public ParentPage() {
		super();
		createTemplateComponents();
	}
	protected void createTemplateComponents() {
		// Ajout des composants communs dans le header et le footer
	}
}
</pre><p>Pour les pages du fils, je vais, comme d&#8217;habitude en Wicket, définir le fichier HTML et la classe Java associée. La classe Java va hériter de la classe ParentPage (les composants ajoutés et gérés par la page parente seront donc ajoutés à ma page).</p><pre class="brush: java; title: ; notranslate">
package test.view;
// import ...;
public class ChildPage extends ParentPage {
	private static final long serialVersionUID = 1L;
	public ChildPage() {
		super();
		createComponents();
	}
	protected void createComponents() {
		// Ajout des composants propres à cette page
	}
}
</pre><p>Pour ce qui est du fichier HTML, je dois encadrer le code HTML qui doit être inséré dans le code HTML du parent par la balise &lt;wicket:extend&gt;.</p><pre class="brush: xml; title: ; notranslate">
&lt;html&gt;
&lt;wicket:head&gt;
	&lt;title&gt;Page fille !&lt;/title&gt;
&lt;/wicket:head&gt;
&lt;body&gt;
&lt;wicket:extend&gt;
	&lt;!-- Ajout ici du contenu spécifique du fils --&gt;
	&lt;h2 align=&quot;center&quot;&gt;Hello dans le fils&lt;/h2&gt;
&lt;/wicket:extend&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre><p>Cette fois-ci, dans le header de la page et entre les balises &lt;wicket:head&gt;, j&#8217;insère la balise &lt;title&gt;. Ce titre sera inséré dans la page finale rendue à l&#8217;utilisateur. De même, je peux ajouter des imports CSS ou JavaScript propres à la page fille.</p><p>Et voilà, tout ce que j&#8217;ajouterai dans la page parent apparaitra aussi dans les pages filles !</p><h3><a
title="Linternationalisation" name="Linternationalisation"></a>L&#8217;internationalisation</h3><p>L&#8217;internationalisation se fait de la façon habituelle, c&#8217;est à dire via l&#8217;utilisation de fichiers properties nommés en fonction de la langue supportée. Avec Wicket, il est possible d&#8217;adjoindre à chaque composant (page, formulaire, composant &#8216;maison&#8217;) un fichier properties portant le même nom et situé dans le même package que la classe associée.</p><p>Exemple : Le fichier properties contenant les traductions pour la page fr/xebia/wicket/demo/HomePage.java doit être fr/xebia/wicket/demo/HomePage.properties (<a
href="http://people.apache.org/~tobrien/wicket/apidocs/org/apache/wicket/resource/loader/ComponentStringResourceLoader.html" title="par défaut">par défaut</a> bien sûr).</p><p>L&#8217;accès aux traductions se fait de trois manières :</p><ul><li>Dans le code HTML, en ajoutant la balise &lt;wicket:message key=&nbsp;&raquo;stringKey&nbsp;&raquo; /&gt;</li><li>Dans le code Java, en utilisant un type de modèle particulier : le <a
href="http://people.apache.org/~tobrien/wicket/apidocs/org/apache/wicket/model/StringResourceModel.html" title="StringResourceModel">StringResourceModel</a>. Ce modèle peut être passé en paramètre de tous les composants Wicket (Label, TextField, etc)</li><li>Toujours dans le code Java, en appelant la méthode <a
href="http://people.apache.org/~tobrien/wicket/apidocs/org/apache/wicket/Component.html#getLocalizer()" title="getLocalizer().getString()">getLocalizer().getString()</a> sur n&#8217;importe quel composant.</li></ul><p>Cependant, Wicket ne s&#8217;est pas arrêté là. Pour la classe StringResourceModel, la clé passée en paramètre peut être dynamique. Exemple : &laquo;&nbsp;product.${product.id}&nbsp;&raquo;. Le modèle passé en paramètre permet de résoudre la clé (dans ce cas, l&#8217;objet Product contient un champ id).</p><p>L&#8217;autre particularité, ici, réside dans le mécanisme de recherche de la traduction. Wicket va utiliser la hiérarchie de classes pour parcourir les fichiers properties.</p><p>Prenons en exemple la hiérarchie suivante :</p><pre class="brush: java; title: ; notranslate">
+ fr/xebia/wicket/BasePage.java
+ fr/xebia/wicket/MyPage.java
</pre><p>Si dans la classe MyPage (ou la page HTML correspondante), je recherche une traduction, Wicket va rechercher la valeur en parcourant dans cet ordre les fichiers properties :</p><ul><li>fr/xebia/wicket/MyPage.properties</li><li>fr/xebia/wicket/BasePage.properties</li><li>org/apache/wicket/markup/html/WebPage.properties</li><li>Et ainsi de suite, en remontant la hiérarchie de classe &#8230;</li></ul><p>Pour les cas où cette façon de faire implique trop de duplication de properties, il est aussi possible de charger arbitrairement des fichiers properties dans la classe principale de l&#8217;application) en configurant les <a
href="http://people.apache.org/~tobrien/wicket/apidocs/org/apache/wicket/settings/IResourceSettings.html" title="IResourceSettings">IResourceSettings</a>.</p><h3><a
title="Modifierdynamiquementlesattrib" name="Modifierdynamiquementlesattrib"></a>Modifier dynamiquement les attributs des balises HTML</h3><p>Le cas d&#8217;usage typique pour ce genre de besoin est la modification dynamique de l&#8217;attribut &laquo;&nbsp;class&nbsp;&raquo; d&#8217;un tag HTML pour modifier le rendu en jouant avec les CSS. Un autre type d&#8217;utilisation est d&#8217;écrire un appel JavaScript dynamique en définissant par exemple l&#8217;attribut &laquo;&nbsp;onClick&nbsp;&raquo; d&#8217;un bouton.</p><p>Différentes approches sont proposées dans <a
href="http://cwiki.apache.org/WICKET/how-to-modify-an-attribute-on-a-html-tag.html" title="cette page">cette page</a> du Wiki mais nous n&#8217;en retiendrons ici qu&#8217;une seule. Il s&#8217;agit d&#8217;utiliser la classe <a
href="http://wicket.apache.org/docs/wicket-1.3.2/wicket/apidocs/org/apache/wicket/AttributeModifier.html" title="AttributeModifier">AttributeModifier</a>. Cette classe est très simple dans son usage : on ajoute une instance de cette classe à n&#8217;importe quel élément Wicket héritant de Component comme suit :</p><pre class="brush: java; title: ; notranslate">
TextField textField = new TextField(&quot;myField&quot;, new Model());
textField.add(new AttributeModifier(&quot;class&quot;, true, new Model(&quot;formFields&quot;)));
</pre><p>Dans cet exemple, un attribut &laquo;&nbsp;class&nbsp;&raquo; sera ajouté même s&#8217;il n&#8217;est pas présent dans le HTML (signification du paramètre &laquo;&nbsp;true&nbsp;&raquo;). La valeur de l&#8217;attribut est donnée par le modèle passé en 3ème position.</p><p>Il est aussi possible de modifier le comportement par défaut en surchargeant la méthode getObject() :</p><pre class="brush: java; title: ; notranslate">
textField.add(new AttributeModifier(&quot;class&quot;, new Model() {
   public Object getObject(final Component component) {
         String cssClass;
         if ( test.getAlarmState() )
             cssClass = &quot;alarm&quot;;
         } else {
             cssClass=&quot;noAlarm&quot;;
         }
         return cssClass;
   }
 }));
</pre><p>C&#8217;est tout pour cette fois. Vous en savez déjà assez pour commencer votre nouveau projet avec Wicket. D&#8217;autres aspects de Wicket sont à découvrir : avec Wicket, on peut aussi faire de l&#8217;<a
href="http://cwiki.apache.org/WICKET/ajax.html" title="AJAX">AJAX</a>, des <a
href="http://cwiki.apache.org/WICKET/testing-pages.html" title="tests d'IHM">tests d&#8217;IHM</a> et plein d&#8217;<a
href="http://cwiki.apache.org/WICKET/reference-library.html" title="autres choses">autres choses</a>.</p><p>A l&#8217;occasion de ces articles, un projet de démonstration de wicket a été créé et est disponible (sous License Apache 2.0) sous le <a
href="http://code.google.com/p/xebia-france">projet xebia-france</a> hébergé chez GoogleCode. Voici le <a
href="http://code.google.com/p/xebia-france/source/checkout">lien direct</a> vers le repository Subversion.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2008/04/23/hands-on-wicket-partie-4/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Hands on Wicket &#8211; Partie 3</title><link>http://blog.xebia.fr/2008/03/07/hands-on-wicket-partie-3/</link> <comments>http://blog.xebia.fr/2008/03/07/hands-on-wicket-partie-3/#comments</comments> <pubDate>Fri, 07 Mar 2008 10:35:15 +0000</pubDate> <dc:creator>Manuel Eveno</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[développement]]></category> <category><![CDATA[Web]]></category> <category><![CDATA[Wicket]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/2008/03/07/hands-on-wicket-partie-3/</guid> <description><![CDATA[Wicket est un framework plutôt en rupture avec les frameworks web actuels. Ici pas de fichier XML qui définit la navigation, pas de librairies de tag spécifiques, juste de la simplicité et du pragmatisme &#8230; tout pour nous plaire ! Wicket a choisi de ne pas mélanger les genres : les pages se font en [...]]]></description> <content:encoded><![CDATA[<p><a
href="http://wicket.apache.org/">Wicket</a> est un framework plutôt en rupture avec les frameworks web actuels. Ici pas de fichier XML qui définit la navigation, pas de librairies de tag spécifiques, juste de la simplicité et du pragmatisme &#8230; tout pour nous plaire ! Wicket a choisi de ne pas mélanger les genres : les pages se font en plain html et le développement, à proprement parler, se fait en pur Java.</p><p>Enfonçons-nous un peu dans les mécanismes du framework. Cette semaine, étudions la gestion de la session, la validation de formulaires et l&#8217;intégration (toujours aussi simple) avec SpringFramework.</p><h3>La gestion de la session</h3><p>Le framework s&#8217;occupe déjà de mettre en session la page courante et les composants Wicket inclus dans celle-ci. Ce mécanisme permet notamment d&#8217;écrire les traitements de réponse aux événements à la Swing (onClick, onSubmit). Il est cependant très important de faire attention aux objets que l&#8217;on met en attribut des pages et composants pour éviter de voir grossir la taille de la session.</p><p>Mais Wicket ne met en session que la page courante. Or, dans bien des cas, il est nécessaire de pouvoir accéder et manipuler des données de la session afin de rendre certaines données accessibles au travers d&#8217;un enchainement de pages. Wicket nous permet bien sûr d&#8217;accéder à la session mais nous oblige à le faire proprement.</p><p>A partir de n&#8217;importe quel composant, il est possible d&#8217;obtenir la session en utilisant la méthode <a
href="http://people.apache.org/~tobrien/wicket/apidocs/org/apache/wicket/Component.html#getSession()">getSession()</a> qui renvoit un objet <a
href="http://people.apache.org/~tobrien/wicket/apidocs/org/apache/wicket/Session.html">Session</a>, wrapper Wicket de la véritable session HTTP. On s&#8217;empresse donc de regarder les méthodes de cette session et on s&#8217;aperçoit que les méthodes get/setAttribute() sont &laquo;&nbsp;protected&nbsp;&raquo; et donc inaccessibles. Comment faire donc ?</p><p>Wicket nous invite en réalité à hériter de la classe WebSession pour proposer des méthodes explicites pour manipuler la session. L&#8217;avantage de cette méthode est la lisibilité et la limitation des erreurs dues à la manipulation de la session via les méthodes génériques habituelles et des clés de type String. Voici donc un exemple de session personnalisée :</p><pre class="brush: java; title: ; notranslate">
public class ShoppingWebSession extends WebSession {
	private static final long serialVersionUID = 1L;
	private static final String CART_KEY = &quot;cart&quot;;
	public XkeWebSession(Request request) {
		super(request);
	}
	public void setCart(Cart cart) {
		setAttribute(CART_KEY, cart);
	}
	public Cart getCart() {
		Cart cart = (Cart) getAttribute(CART_KEY);
		return cart;
	}
}
</pre><p>Ensuite, il faut dire à Wicket d&#8217;utiliser cette classe de session à la place de celle par défaut. Souvenez-vous de la classe principale dont je vous ai parlé dans un <a
href="http://blog.xebia.fr/2008/02/14/hands-on-wicket-partie-1/">précédent article</a>. C&#8217;est dans cette classe que nous allons redéfinir la classe qui représentera la session. Il suffit de redéfinir la méthode newSession(Request, Response) de la classe <a
href="http://people.apache.org/~tobrien/wicket/apidocs/org/apache/wicket/Application.html#newSession(org.apache.wicket.Request,%20org.apache.wicket.Response)">Application</a> pour proposer notre classe de session.</p><pre class="brush: java; title: ; notranslate">
@Override
public Session newSession(Request request, Response response) {
	return new ShoppingWebSession(request);
}
</pre><p>Et voila ! Wicket utilisera désormais votre classe pour gérer la session HTTP.</p><p>La bonne nouvelle, ce genre de ligne disparait de notre code :</p><pre class="brush: java; title: ; notranslate">
((Cart) request.getSession().getAttribute(&quot;cart&quot;));
</pre><p>La mauvaise, lors de l&#8217;utilisation de notre session, il faut effectuer un &laquo;&nbsp;cast&nbsp;&raquo; :</p><pre class="brush: java; title: ; notranslate">
((ShoppingSession) getSession()).getCart();
</pre><p>Malgré cela, l&#8217;accès à la session ne se fait plus via des String mais au travers de méthodes Java qui doivent compiler, ce qui évite bien des erreurs.</p><p>Il est aussi possible d&#8217;utiliser des Helpers ou de créer une base de composants fournissant des méthodes pour accéder sans &laquo;&nbsp;cast&nbsp;&raquo; à la session.</p><h3>La validation de formulaire</h3><p>En ce qui concerne les champs requis, la procédure est très simple : on les définit avec la méthode <a
href="http://people.apache.org/~tobrien/wicket/apidocs/org/apache/wicket/markup/html/form/FormComponent.html#setRequired(boolean)">setRequired(boolean)</a> disponible sur la classe <a
href="http://people.apache.org/~tobrien/wicket/apidocs/org/apache/wicket/markup/html/form/FormComponent.html">FormComponent</a> (dont héritent quasiment tous les champs de formulaire).</p><pre class="brush: java; title: ; notranslate">
TextField textField = new TextField(&quot;myRequiredField&quot;, new Model());
textField.setRequired(true);
</pre><p>Pour la validation plus avancée de valeur, il faut utiliser les validators qui implémentent l&#8217;interface <a
href="http://people.apache.org/~tobrien/wicket/apidocs/org/apache/wicket/validation/IValidator.html">IValidator</a>. On ajoute ensuite aux éléments du formulaire les validations nécessaires avec la méthode add(IValidator). Wicket fournit en standard quelques validators disponibles dans le package <a
href="http://people.apache.org/~tobrien/wicket/apidocs/org/apache/wicket/validation/validator/package-frame.html">org.apache.wicket.validation.validator</a> (email, date, number, string, etc). Il est bien sûr possible de créer ses propres validateurs en implémentant soi-même l&#8217;interface IValidator.</p><p>Exemple :</p><pre class="brush: java; title: ; notranslate">
TextField textField = new TextField(&quot;myRequiredField&quot;, new Model());
textField.add(NumberValidator.range(10L, 99L)); // Valide un entier compris entre 10 et 99
</pre><p>Pour effectuer des validations entre les éléments du formulaire (par exemple, si tel champ vaut telle valeur alors tel autre champ doit &#8230;.), il faut se tourner cette fois-ci vers l&#8217;interface <a
href="http://people.apache.org/~tobrien/wicket/apidocs/org/apache/wicket/markup/html/form/validation/IFormValidator.html">IFormValidator</a> ou la classe <a
href="http://people.apache.org/~tobrien/wicket/apidocs/org/apache/wicket/markup/html/form/validation/AbstractFormValidator.html">AbstractFormValidator</a>. Quelques implémentations de base sont disponibles mais ce genre de validation reste très spécifique aux besoins de l&#8217;application.</p><p>Encore une fois, pas de fichier XML fastidieux à définir, juste du bon vieux Java&nbsp;:-) .</p><h3>Intégration avec SpringFramework</h3><p>Pour utiliser Spring avec Wicket, il faut ajouter l&#8217;extension wicket-spring et wicket-spring-annot à votre projet en ajoutant la dépendance dans votre pom.xml.</p><p>Du point de vue de la configuration Spring, il suffit de déclarer la classe principale de l&#8217;application en tant que bean avec un scope singleton.</p><pre class="brush: xml; title: ; notranslate">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
	xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
	default-autowire=&quot;no&quot;
	xsi:schemaLocation=&quot;
	http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd&quot;&gt;
	&lt;bean id=&quot;wicketApplication&quot; class=&quot;fr.xebia.view.WicketApplication&quot; scope=&quot;singleton&quot;/&gt;
	&lt;!-- Définition des autres beans --&gt;
	[.........]
&lt;/beans&gt;
</pre><p>On modifie le Servlet Filter dans le web.xml, en spécifiant cette fois-ci, la propriété &laquo;&nbsp;applicationFactoryClassName&nbsp;&raquo;. Cette propriété pointe vers la factory Spring qui permet l&nbsp;&raquo;intégration des deux frameworks :</p><pre class="brush: xml; title: ; notranslate">
&lt;filter&gt;
	&lt;filter-name&gt;Application&lt;/filter-name&gt;
	&lt;filter-class&gt;org.apache.wicket.protocol.http.WicketFilter&lt;/filter-class&gt;
        &lt;init-param&gt;
            &lt;param-name&gt;applicationFactoryClassName&lt;/param-name&gt;
            &lt;param-value&gt;org.apache.wicket.spring.SpringWebApplicationFactory&lt;/param-value&gt;
        &lt;/init-param&gt;
&lt;/filter&gt;
</pre><p>Puis dans la méthode init() de la classe principale de l&#8217;application (rappelez-vous celle qui hérite de WebApplication), il faut ajouter une ligne pour que l&#8217;injection de dépendance fonctionne pour les pages Wicket :</p><pre class="brush: java; title: ; notranslate">
addComponentInstantiationListener(new SpringComponentInjector(this));
</pre><p>Ce <a
href="http://people.apache.org/~tobrien/wicket/apidocs/org/apache/wicket/spring/injection/annot/SpringComponentInjector.html">SpringComponentInjector</a> va utiliser la classe <a
href="http://static.springframework.org/spring/docs/2.0.8/api/org/springframework/web/context/support/WebApplicationContextUtils.html">WebApplicationContextUtils</a> de Spring pour retrouver le contexte Spring (ceci sous-entend que vous ayez configuré un <a
href="http://static.springframework.org/spring/docs/2.0.8/api/org/springframework/web/context/ContextLoaderListener.html">ContextLoaderListener</a> Spring dans le web.xml par exemple pour charger la déclaration des beans gérés par Spring). Si vous voulez charger le contexte Spring vous-même, il est aussi possible de passer le contexte Spring en paramètre du constructeur de SpringComponentInjector.</p><p>Enfin dans le code Java, il nous suffit d&#8217;ajouter l&#8217;annotation <a
href="http://people.apache.org/~tobrien/wicket/apidocs/org/apache/wicket/spring/injection/annot/SpringBean.html">@SpringBean</a> devant les attributs des composants (Page, Form, etc.) pour lesquels il faut injecter des beans gérés par Spring.</p><pre class="brush: java; title: ; notranslate">
@SpringBean(name=&quot;mySpringService&quot;)
private MyService myService;
</pre><p>Et voila, rien de plus !</p><p>La prochaine fois, nous verrons la mise en œuvre des mécanismes de templating, l&#8217;internationalisation ainsi que la façon d&#8217;écrire des tests unitaires (ce qui tient à cœur aux équipes de Xebia) !</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2008/03/07/hands-on-wicket-partie-3/feed/</wfw:commentRss> <slash:comments>4</slash:comments> </item> <item><title>Hands on Wicket &#8211; Partie 2</title><link>http://blog.xebia.fr/2008/02/22/hands-on-wicket-partie-2/</link> <comments>http://blog.xebia.fr/2008/02/22/hands-on-wicket-partie-2/#comments</comments> <pubDate>Fri, 22 Feb 2008 09:43:04 +0000</pubDate> <dc:creator>Manuel Eveno</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[développement]]></category> <category><![CDATA[Web]]></category> <category><![CDATA[Wicket]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/2008/02/22/hands-on-wicket-partie-2/</guid> <description><![CDATA[Wicket est un framework plut&#244;t en rupture avec les frameworks web actuels. Ici pas de fichier XML qui d&#233;finit la navigation, pas de librairies de tag sp&#233;cifiques, juste de la simplicit&#233; et du pragmatisme &#8230; tout pour nous plaire ! Wicket a choisi de ne pas m&#233;langer les genres : les pages se font en [...]]]></description> <content:encoded><![CDATA[<p><a
href="http://wicket.apache.org">Wicket</a> est un framework plut&ocirc;t en rupture avec les frameworks web actuels. Ici pas de fichier XML qui d&eacute;finit la navigation, pas de librairies de tag sp&eacute;cifiques, juste de la simplicit&eacute; et du pragmatisme &#8230; tout pour nous plaire ! Wicket a choisi de ne pas m&eacute;langer les genres : les pages se font en plain html et le d&eacute;veloppement, à proprement parler, se fait en pur Java.</p><p>Dans le <a
href="http://blog.xebia.fr/2008/02/14/hands-on-wicket-partie-1/">pr&eacute;c&eacute;dent</a> billet, nous nous &eacute;tions arr&ecirc;t&eacute;s à la mise en place d&#8217;un projet Wicket. Aujourd&#8217;hui, regardons de plus pr&egrave;s la construction des pages et la façon d&#8217;impl&eacute;menter la logique de navigation avec les formulaires et les liens.</p><h3>Construction des pages</h3><p>La construction des pages se fait en deux &eacute;tapes :</p><ul><li>Cr&eacute;ation du fichier HTML</li><li>Cr&eacute;ation de la classe Java correspondante</li></ul><p>Par d&eacute;faut, Wicket suppose que le fichier HTML et la classe Java doivent &ecirc;tre dans le m&ecirc;me package et porter le m&ecirc;me nom (sauf l&#8217;extension bien sûr) . Il est cependant possible de <a
href="http://cwiki.apache.org/WICKET/control-where-html-files-are-loaded-from.html">modifier</a> ce comportement.</p><p>Le fichier HTML utilise exclusivement la syntaxe HTML sur laquelle on vient positionner des attributs &quot;wicket:id&quot; pour les &eacute;l&eacute;ments qui sont associ&eacute;s aux traitements m&eacute;tiers des pages. Les balises auxquelles on ajoute cet attribut repr&eacute;sentent le contenu dynamique (que l&#8217;on veut traiter en Java). C&#8217;est par cet attribut que Wicket fera la correspondance entre les tags HTML et les composants cr&eacute;&eacute;s en Java. Le code HTML ne contient rien d&#8217;autre que de la mise en page et mise en forme (classique HTML + CSS), la logique m&eacute;tier &eacute;tant compl&egrave;tement impl&eacute;ment&eacute;e en Java. Un bel exemple de &quot;<a
href="http://en.wikipedia.org/wiki/Separation_of_concerns">Separation of concerns</a>&quot;.</p><p>Etudions un exemple pour bien comprendre ce m&eacute;canisme.</p><p>Imaginons le fichier HTML suivant avec un message que l&#8217;on veut dynamique, un champ texte et un bouton :</p><pre class="brush: xml; title: ; notranslate">
&lt;html&gt;
  &lt;body&gt;
    &lt;p&gt;Dynamic Message goes here&lt;/p&gt;
    &lt;form&gt;
    	&lt;input type=&quot;text&quot; /&gt;
    	&lt;input type=&quot;submit&quot; value=&quot;update&quot;/&gt;
    &lt;/form&gt;
  &lt;/body&gt;
&lt;/html&gt;
</pre><p>Le passage à Wicket donnera :</p><pre class="brush: xml; title: ; notranslate">
&lt;html&gt;
  &lt;body&gt;
    &lt;p wicket:id=&quot;message&quot;&gt;Message goes here&lt;/p&gt;
    &lt;form wicket:id=&quot;messageInputForm&quot;&gt;
    	&lt;input type=&quot;text&quot; wicket:id=&quot;messageInput&quot;/&gt;
    	&lt;input type=&quot;submit&quot; value=&quot;update&quot;/&gt;
    &lt;/form&gt;
  &lt;/body&gt;
&lt;/html&gt;
</pre><p>On ajoute l&#8217;attribut wicket:id auquel on donne une valeur unique qui nous servira dans le code Java. Cet attribut &quot;wicket:id&quot; persiste par d&eacute;faut dans le HTML m&ecirc;me apr&egrave;s traitement par Wicket. Il est cependant possible de demander à Wicket de supprimer ces attributs (voir <a
href="http://cwiki.apache.org/WICKET/how-to-remove-wicket-markup-from-output.html">ici</a>) en production pour obtenir des pages HTML conformes au <a
href="http://validator.w3.org">standard du W3C</a>.</p><p>Il nous reste plus qu&#8217;à &eacute;crire la classe Java correspondante qui doit h&eacute;riter de la classe <a
href="http://people.apache.org/~tobrien/wicket/apidocs/org/apache/wicket/markup/html/WebPage.html">WebPage</a> :</p><pre class="brush: java; title: ; notranslate">
public class HelloWorld extends WebPage
{
  public HelloWorld()
  {
    IModel messageModel = new Model(&quot;Hello World!&quot;);
    add(new Label(&quot;message&quot;, messageModel));
    add(new MessageForm(&quot;messageInputForm&quot;, messageModel));
  }
  private static final class MessageForm extends Form
  {
    public MessageForm(String id, IModel model)
    {
      super(id);
      add(new TextField(&quot;messageInput&quot;, model));
    }
    protected void onSubmit()
    {
      // Rien à faire ici, le modèle sera automatiquement mis à jour
    }
  }
}
</pre><p>On remarque que le code Java r&eacute;utilise les ids qui apparaissent dans le code HTML. C&#8217;est via ces ids que le pont entre le Java et le HTML est fait.</p><p>Ensuite, la seconde chose que l&#8217;on note est l&#8217;imbrication des composants. Cette imbrication doit respecter celle qui existe dans le HTML. Ainsi puisque le formulaire contient le champ texte, dans le code Java, on doit retrouver cette contenance.</p><p>L&#8217;autre particularit&eacute; à remarquer est l&#8217;utilisation de l&#8217;objet Model. Tous les composants Wicket ont un model qui permet de d&eacute;finir leur contenu : m&ecirc;me un simple label utilise un Model pour afficher son body. Chacun des mod&egrave;les doit impl&eacute;menter l&#8217;interface <a
href="http://people.apache.org/~tobrien/wicket/apidocs/org/apache/wicket/model/IModel.html">IModel</a> (voir paragraphe suivant).</p><p>Dans notre cas, le champ texte et le label partagent le m&ecirc;me mod&egrave;le. Ainsi, le contenu du label aura le m&ecirc;me contenu que le champ texte. De plus, par d&eacute;faut, la soumission d&#8217;un formulaire entraîne la mise à jour automatique du mod&egrave;le avec les donn&eacute;es du formulaire. La classe Form appelle simplement la m&eacute;thode setObject(&#8230;) du mod&egrave;le avec la donn&eacute;e correspondante du formulaire. La mise à jour du champ causera donc la mise à jour du label apr&egrave;s soumission du formulaire. Il est bien sûr possible d&#8217;ajouter des traitements dans la m&eacute;thode onSubmit() du formulaire.</p><p>Je vous invite à faire un tour dans les <a
href="http://www.wicketstuff.org/wicket13/">exemples</a>, la <a
href="http://people.apache.org/~tobrien/wicket/apidocs/index.html">Javadoc</a> et le <a
href="http://cwiki.apache.org/WICKET/">wiki</a> pour &eacute;plucher les diff&eacute;rents composants et leur mod&egrave;le respectif.</p><h3>La notion de Model</h3><p>Les composants Wicket reposent tous sur un mod&egrave;le. Les composants acc&egrave;dent aux donn&eacute;es qu&#8217;ils doivent prendre en charge via le mod&egrave;le qui leur est attach&eacute;. Ces mod&egrave;les impl&eacute;mentent tous l&#8217;interface <a
href="http://people.apache.org/~tobrien/wicket/apidocs/org/apache/wicket/model/IModel.html">IModel</a>. Ceci permet de garder le contr&ocirc;le sur l&#8217;acc&egrave;s aux donn&eacute;es par les composants. Il est à noter que les objets qui impl&eacute;mentent cette interface seront syst&eacute;matiquement stock&eacute;s dans la session. Il faut donc faire attention à la façon dont nous impl&eacute;mentons les mod&egrave;les pour &eacute;viter de surcharger la session.</p><p>Plusieurs mod&egrave;les sont disponibles et fournis par Wicket :</p><ul><li> <b>Basic Models</b> &#8211; Pour impl&eacute;menter un mod&egrave;le basique qui sera int&eacute;gralement stock&eacute; dans la session. Pour impl&eacute;menter ce mod&egrave;le, vous pouvez utiliser simplement la classe <a
href="http://people.apache.org/~tobrien/wicket/apidocs/org/apache/wicket/model/Model.html">Model</a>.</li><li> <b>Detachable Models</b> &#8211; Ces mod&egrave;les impl&eacute;mentent l&#8217;interface <a
href="http://people.apache.org/~tobrien/wicket/apidocs/org/apache/wicket/model/IDetachable.html">IDetachable</a> et offrent la m&eacute;thode detach(), qui permet d&#8217;&ecirc;tre notifi&eacute; quand Wicket n&#8217;a plus besoin du mod&egrave;le, ainsi les donn&eacute;es peuvent &ecirc;tre lib&eacute;r&eacute;es de la m&eacute;moire au plus t&ocirc;t.</li><li> <b>Nested Models</b> &#8211; Les mod&egrave;les peuvent aussi &ecirc;tre imbriqu&eacute;s pour repr&eacute;senter une hi&eacute;rarchie d&#8217;objets. Pour ce faire, il suffit d&#8217;impl&eacute;menter la m&eacute;thode getNestedModel() de l&#8217;interface IModel qui renvoie le mod&egrave;le sous-jacent.</li><li> <b>Property Models</b> &#8211; La classe <a
href="http://people.apache.org/~tobrien/wicket/apidocs/org/apache/wicket/model/AbstractPropertyModel.html">AbstractPropertyModel</a> fournit un comportement par d&eacute;faut pour les mod&egrave;les bas&eacute;s sur des propri&eacute;t&eacute;s. La classe <a
href="http://people.apache.org/~tobrien/wicket/apidocs/org/apache/wicket/model/PropertyModel.html">PropertyModel</a> permet d&#8217;encapsuler un POJO et de donner acc&egrave;s aux propri&eacute;t&eacute;s de cet objet. C&#8217;est cette classe qu&#8217;on utilise pour associer l&#8217;attribut d&#8217;un objet à un champ de formulaire.</li><li> <b>Compound Property Models</b> &#8211; Ce type de mod&egrave;le permet de changer le comportement du mod&egrave;le en fonction du composant qui y acc&egrave;de. Les m&eacute;thodes get et setObject prennent le composant en param&egrave;tre pour cela.</li></ul><p>Le <a
href="http://people.apache.org/~tobrien/wicket/apidocs/org/apache/wicket/model/PropertyModel.html">PropertyModel</a> et le <a
href="http://people.apache.org/~tobrien/wicket/apidocs/org/apache/wicket/model/Model.html">Model</a> restent les deux mod&egrave;les les plus courants.</p><p>Exemple :&nbsp;</p><pre class="brush: java; title: ; notranslate">
Label myLabel = new Label(&quot;myLabel&quot;, new Model(&quot;Hello world !&quot;));
Person person = .... // Obtenir un objet Person
TextField myTextField = new TextField(&quot;myTextField&quot;,
	new PropertyModel(person, &quot;name&quot;));
</pre><h3>La navigation dans Wicket</h3><p>Avec Wicket, la navigation se code en Java. Ici, pas de fichier xml de configuration des mappings URL/Class. Une m&eacute;thode principale est utilis&eacute;e pour ceci, il s&#8217;agit de setResponsePage() disponible sur la classe <a
href="http://people.apache.org/~tobrien/wicket/apidocs/org/apache/wicket/Component.html">Component</a>. Cette m&eacute;thode prend en param&egrave;tre soit une classe, soit une classe avec des param&egrave;tres, soit une instance de page (dans les deux cas, la classe pass&eacute;e en param&egrave;tre doit h&eacute;riter de la classe Page).</p><ul><li>setResponsePage(Class) permet de rediriger vers une page ind&eacute;pendante des donn&eacute;es de la page courante. L&#8217;instanciation de la page et la gestion de son cycle de vie sont effectu&eacute;es par Wicket.</li><li>setResponsePage(Class, <a
href="http://people.apache.org/~tobrien/wicket/apidocs/org/apache/wicket/PageParameters.html">PageParameters</a>) redirige vers une page en lui passant des donn&eacute;es. L&#8217;instanciation de la page et la gestion de son cycle de vie sont là aussi effectu&eacute;es par Wicket.</li><li>setResponsePage(Page) La troisi&egrave;me (avec une instance de page pass&eacute;e en param&egrave;tre) permet de pointer vers une page que l&#8217;on aura instanci&eacute;e nous-m&ecirc;me et à laquelle on a pass&eacute; des param&egrave;tres.</li></ul><pre class="brush: java; title: ; notranslate">
setResponsePage(MySecondPage.class);
setResponsePage(new MySecondPage(myTextField.getModel())); // On passe des données dynamiques à la page cible
</pre><p>Nous allons appeler cette m&eacute;thode en r&eacute;pondant aux &quot;&eacute;v&eacute;nements&quot; de l&#8217;application à la mani&egrave;re d&#8217;une application Swing (onClick, onSubmit, etc.) ou en sp&eacute;cifiant pour certains types de lien, la page à afficher en cas de click.</p><p>Il y a deux principaux moyens de naviguer dans Wicket :</p><ul><li><b>les formulaires</b> : Dans ce cas, on utilise (ou h&eacute;rite de) la classe <a
href="http://people.apache.org/~tobrien/wicket/apidocs/org/apache/wicket/markup/html/form/Form.html">Form</a> à laquelle on ajoute les composants du formulaire. Le traitement associ&eacute; à la validation du formulaire est cod&eacute; dans la m&eacute;thode onSubmit(). C&#8217;est aussi dans cette m&eacute;thode que l&#8217;on peut d&eacute;finir la page qui sera affich&eacute;e apr&egrave;s soumission du formulaire via la m&eacute;thode setResponsePage().</li></ul><pre class="brush: java; title: ; notranslate">
/**
 * @see org.apache.wicket.markup.html.form.Form#onSubmit()
 */
public final void onSubmit() {
	// Do the submit stuff (update the database, etc.)
	setResponsePage(MySecondPage.class);
}
</pre><ul><li><b>les liens</b> : Les liens h&eacute;ritent en g&eacute;n&eacute;ral de la classe <a
href="http://people.apache.org/~tobrien/wicket/apidocs/org/apache/wicket/markup/html/link/Link.html">Link</a> qui fournit les m&eacute;canismes de base pour cr&eacute;er un lien. Pour d&eacute;finir l&#8217;action à effectuer lors d&#8217;un click, on red&eacute;finit simplement le m&eacute;thode onClick(). On peut effectuer dans cette m&eacute;thode un traitement pour finir par donner la page à afficher en r&eacute;sultat via la m&eacute;thode setResponsePage(). Il est aussi possible d&#8217;utiliser la classe <a
href="http://people.apache.org/~tobrien/wicket/apidocs/org/apache/wicket/markup/html/link/PageLink.html">PageLink</a> qui redirige simplement vers une page donn&eacute;e en param&egrave;tres.</li></ul><pre class="brush: java; title: ; notranslate">
Link addToCartLink = new Link(&quot;addToCartLink&quot;) {
	private static final long serialVersionUID = 1L;
	public void onClick() {
		AddToCartPage page = new AddToCartPage(book.getId());
		setResponsePage(page);
	}
};
 // ou
new PageLink(&quot;viewLink&quot;, ViewPage.class);
</pre><p>Par d&eacute;faut, les liens ne peuvent &ecirc;tre ajout&eacute;s aux favoris (si on retourne sur une page &quot;bookmark&eacute;e&quot;, on obtient un message &quot;Page expired&quot;). Les liens sont en fait maintenus en session, ce qui explique la possibilit&eacute; de cr&eacute;er ses liens en Java de cette façon. Pour cr&eacute;er un lien &quot;bookmarkable&quot;, il faut utiliser la classe du m&ecirc;me nom : <a
href="http://people.apache.org/~tobrien/wicket/apidocs/org/apache/wicket/markup/html/link/BookmarkablePageLink.html">BookmarkablePageLink</a>. Ce type de lien peut &ecirc;tre ajout&eacute; aux favoris.</p><p>C&#8217;est tout pour cette fois, il vous faudra un peu de patience avant d&#8217;en savoir plus sur les fonctionnalit&eacute;s de Wicket.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2008/02/22/hands-on-wicket-partie-2/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Hands on Wicket &#8211; Partie 1</title><link>http://blog.xebia.fr/2008/02/14/hands-on-wicket-partie-1/</link> <comments>http://blog.xebia.fr/2008/02/14/hands-on-wicket-partie-1/#comments</comments> <pubDate>Thu, 14 Feb 2008 11:16:03 +0000</pubDate> <dc:creator>Manuel Eveno</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[développement]]></category> <category><![CDATA[Web]]></category> <category><![CDATA[Wicket]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/2008/02/14/hands-on-wicket-partie-1/</guid> <description><![CDATA[Wicket est un framework plutôt en rupture avec les frameworks web actuels. Ici pas de fichier XML qui définit la navigation, pas de librairies de tags spécifiques, juste de la simplicité et du pragmatisme &#8230; tout pour nous plaire ! Wicket a choisi de ne pas mélanger les genres : les pages se font en [...]]]></description> <content:encoded><![CDATA[<p><a
href="http://wicket.apache.org/">Wicket</a> est un framework plutôt en rupture avec les frameworks web actuels. Ici pas de fichier XML qui définit la navigation, pas de librairies de tags spécifiques, juste de la simplicité et du pragmatisme &#8230; tout pour nous plaire ! Wicket a choisi de ne pas mélanger les genres : les pages se font en pur html et le développement, à proprement parler, se fait en pur Java.</p><p>Dans cette première partie, nous verrons comment démarrer avec Wicket.</p><h3>Quickstart</h3><p>Démarrer avec <a
href="http://wicket.apache.org/">Wicket</a> est plutôt simple. Il suffit de lancer une commande <a
href="http://maven.apache.org/">Maven2</a>, ce qui a deux avantages :</p><ul><li>Générer automatiquement un pom avec les dépendances Wicket</li><li>Générer un squelette de projet Wicket</li></ul><p>Il existe donc un archetype Wicket pour Maven2 que l&#8217;on peut utiliser comme suit :</p><pre class="brush: python; title: ; notranslate">
mvn archetype:create -DarchetypeGroupId=org.apache.wicket
-DarchetypeArtifactId=wicket-archetype-quickstart
-DarchetypeVersion=1.3.0-rc1
-DgroupId=com.mycompany
-DartifactId=myproject
</pre><p>Qu&#8217;obtient-on d&#8217;intéressant avec cet archetype ?</p><ul><li>Un fichier pom.xml</li><li>Un fichier webapp\WEB-INF\web.xml préconfiguré pour Wicket</li><li>Quelques fichiers sources dans src\main\java\com\mycompany :<br
/> - Une page d&#8217;accueil constituée d&#8217;un fichier HTML (HomePage.html) et d&#8217;un fichier Java (HomePage.java)<br
/> - Une classe Java (WicketApplication.java)</li><li>Une classe Java src\test\java\com\mycompany\Start.java qui permet de lancer Jetty</li></ul><p>Vous avez déjà une application Wicket fonctionnelle à ce stade.</p><p>Ensuite, générer la configuration Eclipse avec la commande :</p><pre class="brush: python; title: ; notranslate">
mvn eclipse:eclipse
</pre><p><em>(Attention, le plugin maven eclipse n&#8217;est pas encore compatible WTP 2.0, c&#8217;est la version de WTP livrée dans Eclipse Europa, pour avoir ce support, il faut compiler le plugin maven eclipse 2.5-SNAPSHOT, en attendant sa sortie officielle.)</em></p><h3>Configuration de l&#8217;application web</h3><p>Revenons sur certains des fichiers générés par l&#8217;archetype Maven2. Pour utiliser Wicket dans une application web, il faut ajouter quelques lignes dans le web.xml. On y référence en fait un simple Servlet Filter qui lui-même pointe vers une classe de l&#8217;application.</p><pre class="brush: xml; title: ; notranslate">
&lt;filter&gt;
&lt;filter-name&gt;wicket.myproject&lt;/filter-name&gt;
&lt;filter-class&gt;org.apache.wicket.protocol.http.WicketFilter&lt;/filter-class&gt;
&lt;init-param&gt;&lt;/init-param&gt;&lt;/filter&gt;
&lt;param-name&gt;applicationClassName&lt;/param-name&gt;
&lt;param-value&gt;com.mycompany.WicketApplication&lt;/param-value&gt;
&lt;filter-mapping&gt;
&lt;filter-name&gt;wicket.myproject&lt;/filter-name&gt;
&lt;url-pattern&gt;/*&lt;/url-pattern&gt;
&lt;/filter-mapping&gt;
</pre><p>C&#8217;est tout pour la configuration en XML. Le reste des développements se fera en HTML et en Java !!</p><h3>La pièce maîtresse</h3><p>Le Servlet Filter pointe vers la classe principale de l&#8217;application qui doit hériter de <a
href="http://people.apache.org/%7Etobrien/wicket/apidocs/org/apache/wicket/protocol/http/WebApplication.html">WebApplication</a>. C&#8217;est le point d&#8217;entrée de l&#8217;application Wicket. Cette classe permet :</p><ul><li>de configurer l&#8217;application en utilisant les nombreuses méthodes de type getXXXXSettings() (où XXXX peut être remplacé par Session, Markup, Framework, Resources, Security, etc.).</li><li>de définir la page d&#8217;accueil en surchargeant la méthode getHomePage() :</li></ul><pre class="brush: java; title: ; notranslate">
import org.apache.wicket.protocol.http.WebApplication;
public class HelloWorldApplication extends WebApplication {
public void init() {
// getXXXSettings().set ......
}
/**
* @see org.apache.wicket.Application#getHomePage()
*/
public Class getHomePage() {
return HelloWorld.class;
}
}
</pre><p>Cette &laquo;&nbsp;HomePage&nbsp;&raquo; sera affichée, par défaut, lorsqu&#8217;un utilisateur accédera à l&#8217;application sans adresser directement une page visible de l&#8217;application <em>(nous reviendrons sur ce point dans les articles suivants)</em>.</p><p>Et voilà, la magie Wicket vient d&#8217;opérer : vous avez déjà une application exécutable. Pour la tester, c&#8217;est encore très simple.</p><p>Le pom Maven2, généré par l&#8217;archetype Wicket, est configuré pour pouvoir lancer jetty avec l&#8217;application web.</p><p>Démarrer le serveur Jetty (préconfiguré lui aussi dans le POM généré) via :</p><pre class="brush: python; title: ; notranslate">
mvn jetty:run
</pre><p>Ouvrez votre navigateur à l&#8217;adresse http://localhost:8080/myproject. Vous verrez apparaître votre première application Wicket <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</p><p>A bientôt, pour de nouvelles aventures avec Wicket &#8230;</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2008/02/14/hands-on-wicket-partie-1/feed/</wfw:commentRss> <slash:comments>4</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2008/02/11/revue-de-presse-xebia-43/</link> <comments>http://blog.xebia.fr/2008/02/11/revue-de-presse-xebia-43/#comments</comments> <pubDate>Mon, 11 Feb 2008 17:01:30 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Eclipse]]></category> <category><![CDATA[Grails]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Méthodes agiles]]></category> <category><![CDATA[Spring]]></category> <category><![CDATA[Websphere]]></category> <category><![CDATA[Wicket]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/2008/02/11/revue-de-presse-xebia-43/</guid> <description><![CDATA[La revue de presse de l&#8217;actualité Java/J2EE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII Sortie de Wicket 1.3.1 Sortie de Grails 1.0 Agilité Comment mesurer le succès d&#8217;un projet agile du point de vue client ? Le coin de la technique Eclipse 3.4 M5 : le Breadcrumb Mode Les différents GC de la JVM [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse de l&#8217;actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Actualité éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/02/11/revue-de-presse-xebia-43/#Wicket">Sortie de Wicket 1.3.1</a></li><li><a
href="http://blog.xebia.fr/2008/02/11/revue-de-presse-xebia-43/#Grails">Sortie de Grails 1.0</a></li></ul><p><strong>Agilité</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/02/11/revue-de-presse-xebia-43/#ProjetAgile">Comment mesurer le succès d&#8217;un projet agile du point de vue client ?</a></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/02/11/revue-de-presse-xebia-43/#Breadcrumb">Eclipse 3.4 M5 : le Breadcrumb Mode</a></li><li><a
href="http://blog.xebia.fr/2008/02/11/revue-de-presse-xebia-43/#GC">Les différents GC de la JVM</a></li><li><a
href="http://blog.xebia.fr/2008/02/11/revue-de-presse-xebia-43/#TestUnitaireSpringMVC">Test Unitaire avec Spring MVC</a></li><li><a
href="http://blog.xebia.fr/2008/02/11/revue-de-presse-xebia-43/#WebSphereApplicationServer">Websphere Webcast : Prepare for Problem Determination for WebSphere Application Server</a></li></ul><hr/><h3>Actualité éditeurs / SSII</h3><h4><a
name="Wicket"></a>Sortie de Wicket 1.3.1</h4><p>Il y a un mois <a
href="http://blog.xebia.fr/2008/01/07/revue-de-presse-xebia-38/#Wicket">nous annoncions</a> la sortie de Wicket 1.3.<br
/> Comme un peu de teasing ne fait pas de mal, nous profitons de la sortie <a
href="http://wicket.apache.org/news.html#News-wicket1.3.1">version 1.3.1</a> pour vous annoncer une prochaine série de billets dédiée à ce Web Framework.<br
/> Quant à cette version, la principale nouveauté concerne le <a
href="https://issues.apache.org/jira/browse/WICKET-1272">support transparent et out-of-the-box d&#8217;un mode cluster</a>.</p><h4><a
name="Grails"></a>Sortie de Grails 1.0</h4><p>Grails est défini comme &#8216;the ultimate rapid prototyping for Java&#8217; <a
href="http://groovy.dzone.com/news/grails-10-released">par certains</a>. Il s&#8217;agit d&#8217;un framework web s&#8217;inspirant de <a
href="http://www.rubyonrails.org/">Ruby on Rails</a> écrit en Java et de <a
href="http://groovy.codehaus.org/">Groovy</a>. Grails repose sur des frameworks ayant fait leurs preuves comme Spring et Hibernate.<br
/> Vous pouvez télécharger Grails à <a
href="http://grails.org/Download">cette adresse</a>, sa documentation est disponible <a
href="http://grails.org/doc/1.0.x/">ici</a>.</p><h3>Agilité</h3><h4><a
name="ProjetAgile"></a>Comment mesurer le succès d&#8217;un projet agile du point de vue client ?</h4><p>Vikas Hazrati revient dans <a
href="http://www.infoq.com/news/2008/02/agile-customer-success">InfoQ &#8211; Discussion: Measuring Success of an Agile Project from the Customer&#8217;s Perspective</a> sur un échange ayant eu lieu sur le <a
href="http://groups.yahoo.com/group/scrumdevelopment/messages/25945?threaded=1&amp;m=e&amp;var=1&amp;tidx=1">user group Scrum Development</a>.<br
/> Il y offre des pistes pour définir quels éléments de <b>mesure</b> peuvent <em>(devraient)</em> être communiqués par l&#8217;équipe afin qu&#8217;un client puisse mesurer sa <b>satisfaction</b> <em>(et donc le succès du projet)</em>.</p><h3>Le coin de la technique</h3><h4><a
name="Breadcrumb"></a>Eclipse 3.4 M5 : le Breadcrumb Mode</h4><p>Le projet Eclipse vient de mettre à disposition le MileStone 5 de la version 3.4 &#8211; Projet Ganymede (Date de Sortie prévue le 25 juin). Parmi les <a
href="http://download.eclipse.org/eclipse/downloads/drops/S-3.4M5-200802071530/eclipse-news-M5.html#JDT">évolutions marquantes</a>, on peut noter le <a
href="http://en.wikipedia.org/wiki/Breadcrumb_%28navigation%29">Breadcrumb Mode</a>. Une fois activé, Eclipse ajoute sur chaque fichier ouvert une barre de navigation horizontale qui indique les différents éléments qui mènent à la sélection courante. Dans cette vidéo, on voit l&#8217;évolution de cette barre en fonction de la sélection: une classe, une méthode, une inner-classes et une méthode de l&#8217;inner-classe.</p><p>Démonstration en vidéo : <a
href='http://blog.xebia.fr/wp-content/uploads/2008/02/breadcrumb.wmv' title='Eclipse 3.4 M5 : le Breadcrumb Mode'>Breadcrumb.wmv</a>.</p><h4><a
name="GC"></a>Les différents GC de la JVM</h4><p>Ce <a
href="http://blogs.sun.com/jonthecollector/entry/our_collectors">post</a> de Jon Masamitsu présente les particularités des différents algorithmes offerts par la JVM pour gérer et libérer les différentes zones mémoires d&#8217;une JVM Sun. Il dévoile également un nouveau type de &#8216;collector&#8217; qui serait disponible et utilisé par défaut dans la prochaine version de Java, le &#8216;Garbage First&#8217; ou G1. L&#8217;idée principale est ne plus diviser la mémoire en deux zones (Young &amp; Tenured) mais en plusieurs régions dont le rôle majeur (Young/Tenured) serait déterminé au runtime.</p><h4><a
name="TestUnitaireSpringMVC"></a>Test Unitaire avec Spring MVC</h4><p>Le nombre de tests unitaires d&#8217;un framework de présentation est souvent faible en comparaison des autres parties de l&#8217;application. C&#8217;est sur ce constat que le framework <a
href="http://www.springframework.org/">Spring MVC</a> a mis l&#8217;accent sur l&#8217;outillage de ces tests unitaires.<br
/> Craig Walls et John Ferguson Smart nous présentent respectivement leurs conseils dans <a
href="http://www.jroller.com/habuma/entry/unit_testing_spring_mvc_it">Unit-testing Spring MVC: It gets even awesomer</a> et <a
href="http://java.dzone.com/blogs/mrjohnsmart/2008/02/03/unit-testing-your-spring-mvc-a">Unit testing your Spring-MVC applications</a>. Il n&#8217;y a plus d&#8217;excuses !</p><h4><a
name="WebSphereApplicationServer"></a>Websphere Webcast : Prepare for Problem Determination for WebSphere Application Server</h4><p>Yu Tang, membre du WebSphere SWAT team, nous présente <a
href="http://www-1.ibm.com/support/docview.wss?uid=swg27011295">Prepare for Problem Determination for WebSphere Application Server </a>. Les points essentiels :</p><ul><li>La gestion d&#8217;un problème sur un serveur J2EE se décompose en trois étapes :<br
/> &nbsp;&nbsp;&nbsp;-&nbsp;Collecte des informations de diagnostique. Cette phase est essentielle pour la correction sur le fond du problème.<br
/> &nbsp;&nbsp;&nbsp;-&nbsp;Fix en urgence et redémarrage du serveur.<br
/> &nbsp;&nbsp;&nbsp;-&nbsp;Correction sur le fond du problème.</li><li>Les problèmes se regroupent en deux grandes familles :<br
/> &nbsp;&nbsp;&nbsp;-&nbsp;Les crashs (JVM, système, etc).<br
/> &nbsp;&nbsp;&nbsp;-&nbsp;Les blocages / dégradations de performances (avec ou sans consommation élevée de CPU).</li><li>Les principales informations à collecter sont :<br
/> &nbsp;&nbsp;&nbsp;-&nbsp;Les classiques logs SystemOut et SystemErr sans oublier les informations de FFDC et d&#8217;activity.log.<br
/> &nbsp;&nbsp;&nbsp;-&nbsp;Les logs de VerboseGC : un très bon indicateur de l&#8217;état de santé de la JVM. <b>VerboseGC mérite d&#8217;être activé en permanence</b> car son impact sur les performances est très faible (il faut toutefois gérer la purge régulière du fichier).<br
/> &nbsp;&nbsp;&nbsp;-&nbsp;Les javacores (aka thread dumps) :  essentiels pour diagnostiquer les blocages/dégradations de performances.<br
/> &nbsp;&nbsp;&nbsp;-&nbsp;Vmstat et netstat : compléments des javacores en cas de problème de performance.<br
/> &nbsp;&nbsp;&nbsp;-&nbsp;Les heap dumps : essentiels pour traiter les OutOfMemoryError. Préciser la variable <tt>IBM_HEAPDUMPDIR</tt> pour diriger ces logs très volumineuses sur un système de fichiers dédié pour prévenir les problèmes <em>file system full</em> [1].<br
/> &nbsp;&nbsp;&nbsp;-&nbsp;Il faut rédiger et <b>tester régulièrement les procédures de collecte des informations de diagnostiques</b> (notamment les heap dumps et les java cores).</li></ul><p>Un complément pour approfondir le sujet : <a
href="http://www.ibm.com/developerworks/websphere/techjournal/0708_supauth/0708_supauth.html">The Support Authority: 12 ways you can prepare for effective production troubleshooting</a> par IBM Software Services for Websphere.</p><p>[1] Ce système de fichiers dédié (e.g. <tt>/coredumps/</tt>) sera mutualisé entre les différentes applications java voire avec d&#8217;autres applications qui peuvent générer des cores volumineux. Ce système de fichiers est destiné à devenir plein si le problème se répète rapidement et que le nombre de cores se multiplie. Son but est d&#8217;éviter de remplir les autres systèmes de fichiers.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2008/02/11/revue-de-presse-xebia-43/feed/</wfw:commentRss> <slash:comments>1</slash:comments> <enclosure
url="http://blog.xebia.fr/wp-content/uploads/2008/02/breadcrumb.wmv" length="579126" type="video/x-ms-wmv" /> </item> <item><title>Xebia ouvre ses journées de partage de la connaissance (XKE)</title><link>http://blog.xebia.fr/2008/02/06/xebia-ouvre-ses-journees-de-partage-de-la-connaissance-xke/</link> <comments>http://blog.xebia.fr/2008/02/06/xebia-ouvre-ses-journees-de-partage-de-la-connaissance-xke/#comments</comments> <pubDate>Wed, 06 Feb 2008 09:07:45 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Divers]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[SCRUM]]></category> <category><![CDATA[SOA]]></category> <category><![CDATA[Wicket]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/2008/02/06/xebia-ouvre-ses-journees-de-partage-de-la-connaissance-xke/</guid> <description><![CDATA[La gestion et la diffusion de la connaissance sont des valeurs essentielles pour Xebia. Le XKE (Xebia Knowledge Exchange) est le rendez-vous mensuel où l&#8217;ensemble des consultants de Xebia France est réuni une journée entière afin d&#8217;échanger sur les dernières technologies de l&#8217;écosystème Java/J2EE, SOA et Agilité. Les modes d&#8217;échanges sont variés : De la [...]]]></description> <content:encoded><![CDATA[<p>La gestion et la diffusion de la connaissance sont des valeurs essentielles pour Xebia. Le XKE (Xebia Knowledge Exchange) est le rendez-vous mensuel où l&#8217;ensemble des consultants de Xebia France est réuni une journée entière afin d&#8217;échanger sur les dernières technologies de l&#8217;écosystème Java/J2EE, SOA et Agilité.</p><p>Les modes d&#8217;échanges sont variés :</p><ul><li>De la présentation formelle courte mais intense. Exemple : Google Web Toolkit ; Les ESB (Enterprise Services Bus) ou Migration WebLogic/JBoss.</li><li>A des sessions de travaux pratiques de plusieurs heures où chaque consultant peut aller au fond choses sur un sujet technique. Exemple : Maven 2.0 ; OSGi ou WebSphere ObjectGrid.</li><li>En incluant des débats (Exemple : Les EJB ont-ils un avenir?) ou des concours sur une journée (Exemple : <a
href="http://blog.xebia.fr/2007/10/26/xebia-web-framework-contest">Web Framework Contest</a>).</li></ul><p>A partir du mois de Février 2008, les XKE sont ouverts à l&#8217;ensemble des personnes à l&#8217;écoute du marché de l&#8217;emploi autour des technologies Java/J2EE. Si vous êtes l&#8217;une d&#8217;entre elles, n&#8217;hésitez pas à contacter <a
href="mailto:mbacrot@xebia.fr">Mélanie Bacrot</a> pour vous inscrire et connaître les dates des prochaines sessions. L&#8217;agenda sera publié, tous les mois, sur ce blog.</p><p>Au programme du XKE de février 2008 :</p><p><img
src='http://blog.xebia.fr/wp-content/uploads/2008/02/xke2008-02-v3.png' alt='Programme du XKE de février ' /></p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2008/02/06/xebia-ouvre-ses-journees-de-partage-de-la-connaissance-xke/feed/</wfw:commentRss> <slash:comments>5</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2008/01/21/revue-de-presse-xebia-40/</link> <comments>http://blog.xebia.fr/2008/01/21/revue-de-presse-xebia-40/#comments</comments> <pubDate>Mon, 21 Jan 2008 17:12:36 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[BEA]]></category> <category><![CDATA[Flex]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Méthodes agiles]]></category> <category><![CDATA[Oracle]]></category> <category><![CDATA[RIA]]></category> <category><![CDATA[SOA]]></category> <category><![CDATA[Wicket]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/2008/01/21/revue-de-presse-xebia-40/</guid> <description><![CDATA[La revue de presse de l&#8217;actualité Java/J2EE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII Oracle rachète BEA Agilité Mike Cohn donne des pratiques d&#8217;adoption des méthodes agiles RIA Qu&#8217;est-ce que Flex ? SOA JEE 6 : Extensibility, Profiles and Pruning Le coin de la technique Une expérience positive sur Wicket Actualité éditeurs / SSII [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse de l&#8217;actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Actualité éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/01/21/revue-de-presse-xebia-40/#OracleBEA">Oracle rachète BEA</a></li></ul><p><strong>Agilité</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/01/21/revue-de-presse-xebia-40/#adoptionAgile">Mike Cohn donne des pratiques d&#8217;adoption des méthodes agiles</a></li></ul><p><strong>RIA</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/01/21/revue-de-presse-xebia-40/#Flex">Qu&#8217;est-ce que Flex ?</a></li></ul><p><strong>SOA</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/01/21/revue-de-presse-xebia-40/#JEE6">JEE 6 : Extensibility, Profiles and Pruning</a></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/01/21/revue-de-presse-xebia-40/#Wicket">Une expérience positive sur Wicket</a></li></ul><hr/><h3>Actualité éditeurs / SSII</h3><h4><a
name="OracleBEA"></a>Oracle rachète BEA</h4><p>Massimo Pezinni du Gartner Group expose son point de vue <a
href="http://www.lemondeinformatique.fr/actualites/lire-bea-oracle-gartner-conseille-aux-clients-de-differer-leurs-investissements-25094.html">dans un article paru sur LMI</a> : il voit dans ce rachat un danger de disparition de composants BEA hors WLS et Tuxedo.<br
/> Selon lui le projet Fusion est déjà bien engagé chez Oracle et l&#8217;arrivée de BEA ne devrait pas changer la donne. Il parle de certains produits qui passeraient en mode maintenance &#8230; De là à s&#8217;interroger sur l&#8217;avenir des produits nouveaux (ALSB, WLI) il n&#8217;y a qu&#8217;un pas.<br
/> Effectivement, en quelques années la gamme des produits BEA s&#8217;est considérablement élargie. On distingue 3 gammes :</p><ul><li>La gamme historique : Tuxedo.</li><li>La gamme infrastructure WebLogic-* : Weblogic Server, WebLogic Integration, Weblogic Portal et JVM JRockit</li><li>La gamme SOA : Aqualogic-* : <a
href="http://fr.bea.com/products/aqualogic/service_bus/">ALSB</a>, <a
href="http://fr.bea.com/products/aqualogic/data_services/">ALDSP</a>,<a
href="http://fr.bea.com/products/aqualogic/bpm/">ALBPM</a>, <a
href="http://fr.bea.com/products/aqualogic/repository/">ALRR</a>, <a
href="http://fr.bea.com/products/aqualogic/security/">ALES</a>, <a
href="http://fr.bea.com/products/aqualogic/user_interaction/">ALUI</a>, &#8230;</li></ul><p>Il faut regarder ce qui est à ce jour massivement vendu chez les client BEA : Weblogic Server, Tuxedo, WLI/WLP, ALSB.</p><ul><li>Oracle est certainement très intéressé par Weblogic Server qui est reconnu comme l&#8217;un des meilleurs serveurs d&#8217;applications.</li><li>WLI est sûrement le produit qui peut résister et continuer à exister s&#8217;il est vu comme un outil d&#8217;intégration et non comme un moteur de BPM.</li><li>Concernant ALUI, ex Plumbtree, il y a un gros parc installé. Il faut savoir que ALUI est globalement indépendant du serveur d&#8217;application. Pour une réflexion sur les portail BEA/Oracle, vous pouvez lire le billet de Chris Bucchere : <a
href="http://dev2dev.bea.com/blog/bucchere/archive/2008/01/one_portal_rules.html">One Portal to Rule Them All</a>.</li><li>De son côté, Tuxedo n&#8217;évolue pas énormément. Il est déjà en mode maintenance depuis des années mais avec un parc client énorme.</li><li>JRockit sous Linux devrait également être conservé. C&#8217;est une excellente JVM, plus performante que celle de Sun qui concentre plutôt ses optimisations sur la version Solaris (rien d&#8217;étonnant à celà). Ce produit est également un vitrine pour BEA où il démontrait son savoir faire technologique. Si l&#8217;investissement annuel est raisonable, Oracle pourrait bien conserver cette vitrine.</li><li>ALSB (AquaLogic Service Bus), l&#8217;ESB de BEA pourrait quant à lui résister car déjà bien vendu et reconnu.</li></ul><p>Pour tout le reste, l&#8217;avenir semble plus sombre : peu de clients et en doublon avec une offre déjà existante chez Oracle (c&#8217;est quand même Oracle qui rachète BEA, et pas BEA qui rachète le département middleware d&#8217;oracle).</p><h3>Agilité</h3><h4><a
name="adoptionAgile"></a>Mike Cohn donne des pratiques d&#8217;adoption des méthodes agiles</h4><p><a
href="http://www.mountaingoatsoftware.com">Mike Cohn</a>, membre fondateur de l&#8217;Agile Alliance, <a
href="http://www.infoq.com/news/2008/01/agile-adoption-patterns">donne quelques pistes</a> sur la façon d&#8217;injecter des pratiques agiles dans une entreprise à travers des patterns de base.</p><ul><li>Faut-il démarrer l&#8217;agilité sur un petit projet, ou transformer toute l&#8217;organisation d&#8217;un coup?</li><li>Faut-il d&#8217;abord mettre en place les pratiques techniques XP ou d&#8217;abord s&#8217;efforcer de développer par itérations, sans mettre en place TDD (Test Driven Development), pair programming ou intégration continue?</li><li>Faut-il mettre en place l&#8217;agilité en &laquo;&nbsp;mode furtif&nbsp;&raquo;, ou faut-il en faire la publicité à travers toute l&#8217;entreprise et même en dehors?</li></ul><p>Comme toujours, il faut être pragmatique! Et choisir suivant le contexte les pratiques qui s&#8217;adaptent le mieux à l&#8217;entreprise.</p><h3>RIA</h3><h4><a
name="Flex"></a>Qu&#8217;est-ce que Flex ?</h4><p>Ted Patrick, de chez Adobe, répond à la question basique: <a
href="http://www.onflex.org/ted/2008/01/what-is-flex.php">what is Flex?</a>.<br
/> Extrait:</p><ul><li>Flex est un moyen de produire des fichiers SWF (Flash)</li><li>Flex est fait pour les développeurs, pas pour les graphistes</li><li>Flex permet de développer des applications&#8230;</li><li>Qui vont être exécutées sur le web (player Adobe Flash)&#8230;</li><li>Ou sur le bureau (Adobe AIR)</li><li>Ou sur des mobiles (ce n&#8217;est pas encore le cas, et c&#8217;est un des gros défauts de Flex !)</li></ul><h3>SOA</h3><h4><a
name="JEE6"></a>JEE 6 : Extensibility, Profiles and Pruning</h4><p>InfoQ nous <a
href="http://www.infoq.com/news/2008/01/jee6">présente les grandes lignes de Java EE 6</a> dont la version finale est attendue pour Q4 2008. Ce sera la première version modulaire de Java EE grâce à l&#8217;introduction des profiles. Le débat discutable &laquo;&nbsp;Tomcat est il un serveur Java EE ?&nbsp;&raquo; deviendra officiellement caduque, Tomcat implémentera le &laquo;&nbsp;Java EE Web Profile&nbsp;&raquo;.</p><p><strong>Les nouveautés majeures</strong><br
/> Fini les serveurs Java EE monolythiques ! Java EE 6 devient modulaires avec l&#8217;introduction de profiles.<br
/> Ce mécanisme de profile est déjà utilisé dans Java Mobile [1] avec quelques difficultés d&#8217;interopérabilité et les promoteurs d&#8217;OSGI défendent leur modèle d&#8217;assemblage ; on se souviendra quand même du satisfecit que Rod Jonhson, le fondateur de Spring Framework, a adressé aux profiles JavaEE 6 en juillet 2007 (<a
href="http://blog.interface21.com/main/2007/07/03/java-ee-6-gets-it-right/">Spring source 2007/07 : Java EE 6 gets it right</a>). On remarquera aussi que le débat sur OSGI est aussi présent sur la spécification JBI 2.0.</p><p><strong>Pruning</strong><br
/> Le processus de &#8216;pruning&#8217; (ie. fin de vie) existe depuis longtemps pour les standards Java mais a rarement été utilisé. En rupture avec les versions précédentes, Java EE 6 ouvre le chantier de nettoyage des API désuètes (Java SE 7 suit la même approche). Les premiers candidats à la retraite sont :</p><ul><li>EJB-CMP : désolé pour les entreprises qui ont investi sur les EJB 1.x et 2.x. La suppression commence par le mécanisme de persistance EJB-CMP et il faudra s&#8217;attendra à voir rapidement suivre le reste de ces APIs.</li><li>JAX-RPC et JAX-Registry [2] : les APIs Web Services pour Java ne vivent pas plus longtemps que les standards WS-*. Ces disparitions auront probablement peu d&#8217;impacts, XFire et Axis 1 ont souvent été préférés à JAX-RPC. Quant à JAX-Registry, son utilisation est restée confidentielle.</li></ul><p><strong>Les absents</strong></p><p>On notera deux absents notables à JavaEE 6:</p><ul><li>Les portails java et leur gestion de contenu [3] : la vague de marketing intense des éditeurs de portails java est passée ; les promesses de réutilisabilité et de ROI on rarement été au rendez-vous. Les APIs portlet vont-elles se faire &#8216;pruner&#8217; avant même de rejoindre Java EE ? Nous pressentons plutôt la création d&#8217;un profile &laquo;&nbsp;java portals&nbsp;&raquo; dont la communauté sera très restreinte. Seule une rupture majeure dans la gestion de contenu en Java permettrait de menacer la prédominance de PHP sur ce sujet.</li><li>Les standards d&#8217;intégration JBI et SCA/SDO [4] : ces sujets semblent trop polémiques et trop politiques pour permettre d&#8217;entériner des standards Java. JBI 1.0 a déçu ceux qui s&#8217;y sont aventurés (ServiceMix, Mule, etc) et l&#8217;ébauche de la version 2.0 rencontre toujours l&#8217;hostilité d&#8217;IBM et de BEA. Ces deux éditeurs lui préfèrent les standards SCA et SDO qui rencontrent un accueil pour le moins circonspect de la part de Sun, peut-être parce que la gouvernance des ces standards est partagée.</li></ul><p>[1] <a
href="http://jcp.org/en/jsr/detail?id=37">JSR 37 Mobile Information Device Profile</a>, <a
href="http://jcp.org/en/jsr/detail?id=134">JSR 137 Java Game Profile</a>, etc<br
/> [2] <a
href="http://jcp.org/en/jsr/detail?id=101">JSR-101 Java APIs for XML based RPC</a> et <a
href="http://jcp.org/en/jsr/detail?id=93">JSR 93 Java API for XML Registries</a><br
/> [3] <a
href="http://www.jcp.org/en/jsr/detail?id=168">JSR-168 Portlet specification</a>, <a
href="http://www.jcp.org/en/jsr/detail?id=286">JSR-286 Portlet Specification 2.0</a>, <a
href="http://www.jcp.org/en/jsr/detail?id=170">JSR-301 Portlet Bridge Specification for JavaServer Faces</a> et <a
href="http://www.jcp.org/en/jsr/detail?id=170">JSR-170 Content Repository for Java technology API</a><br
/> [4] <a
href="http://www.jcp.org/en/jsr/detail?id=208">JSR-208 Java Business Integration</a> et <a
href="http://www.jcp.org/en/jsr/detail?id=235">JSR-235 Service Data Objects</a></p><h3>Le coin de la technique</h3><h4><a
name="Wicket"></a>Une expérience positive sur Wicket</h4><p>Après une année passée à développer une application avec <a
href="http://wicket.apache.org">Wicket</a>, Julian Sinai, nous <a
href="http://javathoughts.capesugarbird.com/2008/01/year-of-wicket.html">donne son retour d&#8217;expérience</a> très positif. Venant du monde du &laquo;&nbsp;client lourd&nbsp;&raquo; (Swing), il a dans un premier temps évalué différents frameworks web:</p><ul><li>GWT: trop éloigné des autres frameworks web, pas de HTML, pas de WAR</li><li>Tapestry: gros coût d&#8217;entrée, difficile de développer de nouveaux composants</li><li>JSF: trop complexe</li></ul><p>Parmi les points positifs qu&#8217;il retire de l&#8217;expérience, il insiste en particulier sur la claire séparation entre le code de présentation et le code métier, et sur la facilité avec laquelle on peut développer des composants réutilisables. Matt Raible a commenté rapidement l&#8217;article sur <a
href="http://raibledesigns.com/rd/entry/a_positive_wicket_experience">son blog</a>.</li> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2008/01/21/revue-de-presse-xebia-40/feed/</wfw:commentRss> <slash:comments>9</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2008/01/07/revue-de-presse-xebia-38/</link> <comments>http://blog.xebia.fr/2008/01/07/revue-de-presse-xebia-38/#comments</comments> <pubDate>Mon, 07 Jan 2008 17:38:36 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[IBM]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[JSF]]></category> <category><![CDATA[ObjectGrid]]></category> <category><![CDATA[Websphere]]></category> <category><![CDATA[Wicket]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/2008/01/07/revue-de-presse-xebia-38/</guid> <description><![CDATA[La revue de presse de l&#8217;actualité Java/J2EE hebdomadaire proposée par Xebia. Le coin de la technique JSF Testing Tools Wicket 1.3 released WebSphere MQ en environnent J2EE/JEE : JMS vs. &#8216;MQ Java Interfaces&#8217; IBM ObjectGrid 6.1 fix 3 : une grille résolument &#8216;developer friendly&#8217; Le coin de la technique JSF Testing Tools Cet article présente [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse de l&#8217;actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/01/07/revue-de-presse-xebia-38/#JSFTestingTools">JSF Testing Tools</a></li><li><a
href="http://blog.xebia.fr/2008/01/07/revue-de-presse-xebia-38/#Wicket">Wicket 1.3 released</a></li><li><a
href="http://blog.xebia.fr/2008/01/07/revue-de-presse-xebia-38/#WebSphereMQ">WebSphere MQ en environnent J2EE/JEE : JMS vs. &#8216;MQ Java Interfaces&#8217;</a></li><li><a
href="http://blog.xebia.fr/2008/01/07/revue-de-presse-xebia-38/#IBMObjectGrid">IBM ObjectGrid 6.1 fix 3 : une grille résolument &#8216;developer friendly&#8217;</a></li></ul><hr/><h3>Le coin de la technique</h3><h4><a
name="JSFTestingTools"></a><a
href="http://www.infoq.com/news/2007/12/jsf-testing-tools">JSF Testing Tools</a></h4><p>Cet article présente trois principaux frameworks permettant d&#8217;effectuer des tests unitaires JSF. Pour rappel, la principale difficulté est de pouvoir effectuer des tests en dehors du container, et grâce à ces outils il est possible de tester les composants côtés client mais aussi côté serveur.</p><ul><li>JSFUnit est basé sur HttpUnit et Apache Cactus. Son API permet notamment de tester le transfert de données dans un formulaire et de savoir si le managed bean correspondant à bien été mis à jour&#8230; Cet outil inclue aussi un JSF Static Analysis permettant notamment d&#8217;analyser les fichiers de configuration.</li><li>Shale Test est un projet Apache fournissant des implémentations d&#8217;objet Mock pour les Servlets et les composants JSF.</li><li>JSF Extensions est basé sur JUnit, HTMLUnit, et Cactus. Cet outil est composé d&#8217;un module <a
href="https://jsf-extensions.dev.java.net/nonav/mvn/index.html#Test%20Time">Test-Time</a> fournissant des objets Mock pour les composants JSF 1.2, ainsi qu&#8217;un module <a
href="https://jsf-extensions.dev.java.net/nonav/mvn/index.html#Design%20Time">Design-Time</a> pour effectuer des déploiements plus rapide (hot deploy). Cette fonctionnalité a pour but de mettre en place des tests de manière itératif durant le développement d&#8217;application JSF.</li></ul><p>Enfin l&#8217;article termine par deux outils d&#8217;aide au développement et au monitoring d&#8217;applications JSF :</p><ul><li>JXInsight, se basant sur l&#8217;interface PhaseListener, permet de collecter différentes informations sur l&#8217;exécution du code (les stacks&#8230;)</li><li>JSF Tools, sous projet de Eclipse WTP, fournit un support pour le développement et le déploiement d&#8217;application JSF.</li></ul><p>Pour terminer, cet article présente assez bien les différents outils, mais il aurait peut être été bien de proposer des critiques sur ceux-ci, qui feront peut être l&#8217;objet d&#8217;un nouvel article.</p><h4><a
name="Wicket"></a>Wicket 1.3 released</h4><p>Nous annoncions lors de la revue de presse du <a
href="http://blog.xebia.fr/2007/11/12/revue-de-presse-xebia-31/#ApacheWicket">12 novembre dernier</a> son passage en RC, et bien c&#8217;est maintenant officiel : Apache Wicket 1.3 fait maintenant partit de la volumineuse liste des java web framework disponibles sur le marché. Malgré cette farouche concurrence, le buzz continue : Wicket est l&#8217;un des web framework faisant le plus de bruit sur la toile, ses promesses sont simples : simplicité d&#8217;utilisation, POJO-centric, pas de configuration XML &#8230; donnez votre sur le billet du <a
href="http://blog.xebia.fr/2007/10/26/xebia-web-framework-contest/">Xebia Web Framework Contest</a>.</p><p>Nous vous invitons à consulter la liste complète des nouveautés à partir du site d&#8217;Apache.</p><ul><li><a
href="http://wicket.apache.org/">Apache Wicket</a></li><li><a
href="http://zedros.developpez.com/tutoriels/java/wicket/">Discovering Apache Wicket 1.3 by Pachod Joseph</a></li><li><a
href="http://cwiki.apache.org/WICKET/migrate-13.html">Guide de migration à Wicket 1.3</a></li></ul><h4><a
name="WebSphereMQ"></a>WebSphere MQ en environnent J2EE/JEE : JMS vs. &#8216;MQ Java Interfaces&#8217;</h4><p>David Currie nous rappelle dans <a
href="http://david.currie.name/archives/2008/01/02/websphere-mq-java-in-j2ee/">WebSphere MQ Java in J2EE</a> que JMS est l&#8217;API privilégiée pour accéder à Websphere MQ dans un environnement J2EE/JEE et que les historiques API &laquo;&nbsp;MQ Java Interfaces&nbsp;&raquo; devraient progressivement être remplacées [1].</p><p>Au delà d&#8217;un simple choix technique d&#8217;API (la fiabilité de JMS est aujourd&#8217;hui avérée), il s&#8217;agit d&#8217;un réel changement de culture depuis l&#8217;historique approche en langage C (user exits MQ, style de programmation des &laquo;&nbsp;MQ Java Interfaces&nbsp;&raquo;, etc) vers le monde orienté objet Java / .Net [2]. Cette évolution demande un travail d&#8217;explication et de formation des équipes qu&#8217;il ne faut pas négliger.</p><p>La roadmap MQ JMS pourra aller jusqu&#8217;au remplacement de Queue Managers MQ par le Websphere Embedded Messaging Engine pour les utilisateurs du serveur J2EE d&#8217;IBM &#8230;</p><p>[1] <a
href="http://www-1.ibm.com/support/docview.wss?rs=171&amp;context=SSFKSJ&amp;dc=DB520&amp;uid=swg21266535&amp;loc=en_US&amp;cs=UTF-8&amp;lang=en&amp;rss=ct171websphere">IBM Technote : Using WebSphere MQ Java Interfaces in J2EE/JEE Environments</a> : <em>&laquo;&nbsp;This technote explains why &#8216;WebSphere MQ classes for Java Message Service&#8217; is the API best suited for use in J2EE/JEE environments &#8230;&nbsp;&raquo;</em><br
/> [2] <a
href="http://www.ibm.com/developerworks/websphere/library/techarticles/0509_phillips/0509_phillips.html">IBM DeveloperWorks : Introducing XMS : The IBM Messages API</a></p><h4><a
name="IBMObjectGrid"></a>IBM ObjectGrid 6.1 fix 3 : une grille résolument &#8216;developer friendly&#8217;</h4><p><a
href="http://www.ibm.com/developerworks/wikis/display/objectgridprog/ObjectGrid+6.1+cumulative+fix+3+contents">Le fix 3 d&#8217;IBM ObjectGrid</a> apporte de nouvelles fonctionnalités résolument à l&#8217;écoute des développeurs avec notamment :</p><ul><li><a
href="http://www.ibm.com/developerworks/wikis/display/objectgridprog/Spring+framework+integration">Support de Spring Framework</a><br
/> - Intégration aux transactions Spring et à leurs annotation @Transactional<br
/> - Gestion par le container Spring des beans d&#8217;extension d&#8217;ObjectGrid (ObjectTransformer, Loader, TransactionCallback, etc)</li><li><a
href="http://www.ibm.com/developerworks/wikis/display/objectgridprog/Entity+listeners+and+life+cycle+callback+methods">Entity Listeners</a> similaires aux listeners JPA/Hibernate autour des événements persist, load, update et remove</li></ul><p>On remarquera à l&#8217;occasion la poursuite de la nuit de noces entre IBM et Spring Framework dont les précédents épisodes marquant furent <a
href="http://www.springframework.org/node/561">le support officiel de Websphere par Spring Framework</a> (11/2007) et la <a
href="http://www.devwebsphere.com/devwebsphere/2007/12/great-time-at-t.html">présentation de Billy Newport sur l&#8217;eXtreme Transaction Processing</a> à The Spring Experience (12/2007).<br
clear="all"></p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2008/01/07/revue-de-presse-xebia-38/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2007/11/12/revue-de-presse-xebia-31/</link> <comments>http://blog.xebia.fr/2007/11/12/revue-de-presse-xebia-31/#comments</comments> <pubDate>Mon, 12 Nov 2007 15:22:31 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[BEA]]></category> <category><![CDATA[IBM]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Seam]]></category> <category><![CDATA[Weblogic]]></category> <category><![CDATA[Websphere]]></category> <category><![CDATA[Wicket]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/2007/11/12/revue-de-presse-xebia-31/</guid> <description><![CDATA[La revue de presse de l&#8217;actualité Java/J2EE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII Weblogic Server 10.3 Le coin de la technique Release de Seam 2.0 Un vent de Websphere 7 chez IBM Apache Wicket 1.3.0-rc1 is released! Actualité éditeurs / SSII Weblogic Server 10.3 Cette nouvelle mouture du serveur d&#8217;application de BEA reste [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse de l&#8217;actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Actualité éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2007/11/12/revue-de-presse-xebia-31/#WeblogicServer10">Weblogic Server 10.3</a></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2007/11/12/revue-de-presse-xebia-31/#Seam">Release de Seam 2.0</a></li><li><a
href="http://blog.xebia.fr/2007/11/12/revue-de-presse-xebia-31/#Websphere">Un vent de Websphere 7 chez IBM</a></li><li><a
href="http://blog.xebia.fr/2007/11/12/revue-de-presse-xebia-31/#ApacheWicket">Apache Wicket 1.3.0-rc1 is released!</a></li></ul><hr
/><h3>Actualité éditeurs / SSII</h3><h4><a
name="WeblogicServer10"></a>Weblogic Server 10.3</h4><p>Cette nouvelle mouture du serveur d&#8217;application de BEA reste conforme aux spécifications J2EE 5 tout en ajoutant le support de Java SE 6. Donc peu de nouveautés technico-fonctionnelles, l&#8217;accent a été mis sur les performances. Cette version vient de sortir en mode &#8216;<a
href="http://commerce.bea.com/showproduct.jsp?family=WLS&amp;major=10.3Tech&amp;minor=-1">Tech Preview</a>&#8216;. La version 10.3 deviendrat-elle une version aussi performante et stable qu&#8217;est (ou fût) la version 8.1SP5+ ?</p><h3>Le coin de la technique</h3><h4><a
name="Seam"></a>Release de <a
href="http://sourceforge.net/project/showfiles.php?group_id=22866&amp;package_id=163777&amp;release_id=551158">Seam 2.0</a></h4><p>Pour rappel, Seam permet de mettre en des applications par le biais des technologies JSF, EJB 3, AJAX, BPM&#8230; Sa nouvelle version arrive avec ses lots <a
href="http://in.relation.to/Bloggers/WhatsNewInSeam2">de corrections et d&#8217;améliorations</a> parmi lesquelles :</p><ul><li>possibilité d&#8217;écrire des composants Seam en Groovy</li><li>intégration de GWT pour le rendering de page ou bien encore inclure des composants GWT dans une page JSF</li><li>les composants Seam peuvent faire l&#8217;office de Web Service</li><li>intégration de Hibernate Search</li><li>syntaxe des EL améliorée</li></ul><h4><a
name="Websphere"></a>Un vent de Websphere 7 chez IBM</h4><p>IBM nous prépare à Websphere 7, ses EJB3, sa persistance JPA et ses web services JAX-WS 2.0  en publiant le redbook <a
href="http://www.redbooks.ibm.com/abstracts/sg247497.html">Designing and Coding Applications for Performance and Scalability in WebSphere Application Server</a> et en annonçant <a
href="https://www14.software.ibm.com/iwm/web/cc/earlyprograms/rational/RAD75OpenBeta/index.shtml">Rational Application Developer 7.5 Open Beta</a>.</p><p>RAD 7.5, dont la beta sera disponible mi-décembre, apporte le support de support de Java EE 5 (EJB 3, JPA, JAX-WS, etc). La sortie de cette version, en avance sur Websphere 7, rassurera les clients RAD qui avaient été déçus par le décalage de plusieurs mois entre la sortie de WAS 6.1 et celle de RAD 7 (la v7 de RAD apportait le support de Java 5 et le WAS 6.1 runtime environment).</p><p><em>Designing and Coding Applications for Performance and Scalability in WebSphere Application Server</em> est un RedBook de transition de l&#8217;ère des EJB 2.1 vers les nouveaux EJB 3.0 qui seront supportés par le futur Websphere 7 :</p><p>On y retrouve hélas quelques exemples légèrement <em>défraîchis</em> qui font penser à des copier/coller des redbooks précédents :</p><ul><li>Le chapitre sur l&#8217;utilisation des mécanismes de synchronisation (p99) mériteraient d&#8217;être réécrit en s&#8217;inspirant du très intéressant Google Tech Talk <a
href="http://video.google.com/videoplay?docid=8394326369005388010&amp;hl=en">Advanced Topics in Programming Languages: The Java Memory Model</a> de Jeremy Manson qui nous expliquent comment les blocs <tt>synchronized</tt> devraient être remplacé par les verrous introduis avec la librairie <tt>java.util.concurrent.locks</tt></li><li>Les exemples qui utilisent <tt>Vector</tt> et <tt>Hashtable</tt> pourraient avantageusement être mis à jour pour parler de <tt>List</tt>/<tt>ArrayList</tt> et de <tt>Map</tt>/<tt>HashMap</tt></li><li>Le paragraphe sur Struts et ses <tt>ActionForm</tt> pourrait être remplacé par son équivalent avec Struts2 ou être supprimé si IBM ne souhaite pas mettre en avant Struts2.</li></ul><p>A côté de ces anachronismes mineurs, IBM nous livre les grands axes de la stratégie Websphere :</p><ul><li>SCA/SDO sont toujours des technologies clefs. Ce redbook nous explique avec clarté et raison leur rôle et leur position par rapport à EJB3/JPA : <em>If you are developing a traditional (non SOA) application and only have relational data and are only developing in Java, then EJB 3.0 is a good choice. (p 449)</em>.</li><li>Java Connector Architecture (JCA) est désormais la technologie standard et unifiée pour accéder aux Enterprise Information Systems (EIS) comme CICS et IMS dont les connecteurs Java propriétaires ont été remplacés par des Resources Adapter JCA [1]. Le support de l&#8217;API JCA permet une intégration élégante à SpringFramework [2].</li><li>EJB3, JPA et JAX-WS sont les successeurs respectifs d&#8217;EJB 2.1, d&#8217;EJB CMP et de JAX-RPC ; ils sont disponibles avec WAS 6.1 sous forme de <em>feature pack</em> additionnels [3] ; Websphere 7 les embarquera en standard. Ce redbook sera une bonne introduction pour ceux qui n&#8217;ont pas encore eu le temps de découvrir ces nouvelles technologies.</li></ul><p>Pour conclure, RAD 7.5 et ce redbook sont principalement des <em>previews</em> des technologies JavaEE 5 (EJB3, JPA, JAX-WS, etc) que nous attendons avec impatience et qui seront disponible avec Websphere 7.</p><p>D&#8217;ici à y voir les prémices d&#8217;une grande opération de <em>teasing</em> pour préparer l&#8217;imminente arrivée de Websphere 7 &#8230; <img
class="emoticon" src="/confluence/images/icons/emoticons/wink.gif" alt="" align="absmiddle" border="0" height="20" width="20"></p><p>[1] Voir <a
href="http://www-306.ibm.com/software/data/ims/ims/components/tm-resource-adapter.html">IMS TM Resource Adapter</a> et <a
href="http://www-306.ibm.com/software/htp/cics/ctg/">CICS Transaction Gateway</a>.<br
/> [2] Voir <a
href="http://www.javaworld.com/javaworld/jw-08-2005/jw-0822-cics.html">Access CICS applications with Spring</a> par Thierry Templier pour JavaWorld.<br
/> [3] Voir <a
href="https://www14.software.ibm.com/iwm/web/cc/earlyprograms/websphere/was61ejb3/">WebSphere® Application Server Version 6.1 Feature Pack for EJB 3.0</a> et <a
href="http://www-1.ibm.com/support/docview.wss?rs=180&amp;uid=swg21264563">Feature Pack for Web Services for WebSphere Application Server V6.1</a></p><h4><a
name="ApacheWicket"></a><a
href="http://wicket.apache.org/wicket-130-rc1.html">Apache Wicket 1.3.0-rc1</a> is released!</h4><p> Le projet Wicket avance et entre en release candidates. Cela signifie que seulement des corrections de bugs seront faites jusque la sortie finale de la version 1.3.<br
/> Au programme de cette release :</p><ul><li>un <a
href="http://cwiki.apache.org/WICKET/migrate-13.html">guide de migration</a> à partir de la version 1.2 : l&#8217;API a évolué/changé et donc pas mal de changements sont à prévoir.</li><li>beaucoup de bugs ont été corrigés, et les évolutions sont nombreuses. <a
href="http://wicket.apache.org/wicket-130-rc1.html#wicket-1.3.0-rc1-Reportingbugs">Voici la liste</a>.</li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2007/11/12/revue-de-presse-xebia-31/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Xebia Web Framework Contest</title><link>http://blog.xebia.fr/2007/10/26/xebia-web-framework-contest/</link> <comments>http://blog.xebia.fr/2007/10/26/xebia-web-framework-contest/#comments</comments> <pubDate>Fri, 26 Oct 2007 04:42:36 +0000</pubDate> <dc:creator>Benoit Moussaud</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[GWT]]></category> <category><![CDATA[JSF]]></category> <category><![CDATA[Struts2]]></category> <category><![CDATA[Web]]></category> <category><![CDATA[Wicket]]></category> <category><![CDATA[XKE]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/2007/10/26/xebia-web-framework-contest/</guid> <description><![CDATA[Pour tous les consultants de Xebia France, le dernier vendredi de chaque mois est important : c&#8217;est le jour du XKE, le Xebia Knowledge Exchange. L&#8217;ensemble des consultants est rassemblé pour échanger durant une journée entière sur tous les sujets liés à l&#8217;écosystème Java / J2EE ainsi que les méthodes agiles. D&#8217;habitude la journée est [...]]]></description> <content:encoded><![CDATA[<p>Pour tous les consultants de Xebia France, le dernier vendredi de chaque mois est important : c&#8217;est le jour du XKE, le Xebia Knowledge Exchange. L&#8217;ensemble des consultants est rassemblé pour échanger durant une journée entière sur tous les sujets liés à l&#8217;écosystème Java / J2EE ainsi que les méthodes agiles. D&#8217;habitude la journée est découpée en plusieurs sessions allant de 45 mn à 3 h, suivant les sujets et le mode d&#8217;interaction (de la présentation formelle à des travaux pratiques sur des sujets complexes).</p><p>Le mois dernier, nous avons décidé de faire du XKE le Xebia Web Framework Contest, un concours de développement autour des framework de présentation.</p><p>4 équipes ont développé la même application web, chacune avec un framework (très) différent. Les frameworks retenus étaient :</p><ul><li>Strut2,</li><li>Google Web ToolKit,</li><li>Wicket,</li><li>My Faces (JSF).</li></ul><p>8h30 certains, les plus scolaires, sont déjà arrivés et aiguisent leurs environnements, se concertent sur les rôles de chacun.<br
/> 9h00 tout le monde est là, certains prennent leur café en discutant de tout sauf du concours qui les attend alors que d’autres sont fin prêts …<br
/> 9h30 les spécifications, tenues secrètes jusqu’au jour J sont enfin distribuées aux équipes et là : grande surprise et grande rigolade ….<br
/> <em><br
/> Wanda Zeller, directrice d&#8217;un réseau de call girls international, a décidé d&#8217;augmenter son volume d&#8217;affaire en mettant en ligne un site de réservation interactif de ses protégées. Mme Zeller, que son activité contraint à la discrétion, a délégué son chargé d&#8217;affaires, M. Moussaud, de relayer ses exigences et de piloter les développements. Mme Zeller, qui vit avec son temps, dispose d&#8217;ores et déjà d&#8217;un système de réservation qu&#8217;utilisent les opérateurs de son call-center marocain. Afin de limiter les efforts de développement, il a été décidé de réutiliser les services métier mis au point pour ce système de réservation, et de limiter les développements à la couche de présentation.<br
/> </em></p><p>Les spécifications de nouveaux lots seront ensuite distribuées à un rythme assez soutenu, à raison d’une toutes les heures trente. Chacune ayant pour but d’adresser un pan particulier.</p><ul><li>Le premier lot mettait en place les mécanismes de recherche simple et un système de panier avec commande.</li><li>Le lot 2 apportait la couche &laquo;&nbsp;sécurité&nbsp;&raquo; sur les commandes.</li><li>Le lot 3 ajoutait la mise en place d’un workflow de validation des commandes.</li><li>Enfin le dernier lot mettait l&#8217;accent sur l&#8217;aspect validation.</li></ul><p>Après une journée intense de développement, chaque équipe est venue présenter son œuvre et donner son avis sur les avantages et inconvénients de la solution étudiée.</p><h3>Google Web Toolkit</h3><p>L&#8217;équipe a bataillé un moment pour trouver quels fichiers étaient à synchroniser entre les membres de l&#8217;équipe et ceux qui ne l&#8217;étaient pas. Pour ne pas perdre de temps (c&#8217;était quand même un concours !), la synchronisation s&#8217;est faite finallement par clé USB !</p><p>Ce qui avait séduit l&#8217;équipe avec ce framework nouvelle génération est le concept du &#8216;Tout-Java&#8217;: le client et le serveur sont codés en java, GWT se charge de la génération des pages web et du javascript. Mais ce modèle à des contraintes:</p><ul><li>Implémentation d&#8217;une interface IsSerialisable pour tout objet qui transite entre le client et le serveur (réglé depuis la version 1.4).</li><li>Support de Java 1.4 (seulement), donc il faut oublier les génériques et les annotations pour la partie client (fonctionnalité programmé pour la future version 1.5 ).</li><li>Le concept client-serveur reste quand même assez déroutant quand depuis des années on manipule chaque jours des objets de type Request/Response, des pages JSP/Html ou des actions &#8216;Struts&#8217;.</li></ul><p>La conclusion de l&#8217;équipe est qu&#8217;il faut vraiment aborder GWT comme un framework Client Riche avec un concept de client/serveur; les outils se chargeant entièrement de l&#8217;exposition en mode Web (JSP/CSS/AJax). Le coût d&#8217;entrée semble assez important et les composants graphiques limités (il n&#8217;est pas évident d&#8217;intégrer des composants d&#8217;une maquette HTML existante). Donc GWT est un outil à suivre en attendant la maturité.</p><h4>Synthèse de l&#8217;équipe :</h4><p><strong>Les bons points :</strong></p><ul><li>Gestion transparente des différents browsers.</li><li>Possibilité d&#8217;utiliser un debugger Java (celui de l&#8217;environnement de développement choisi, Eclipse par exemple).</li><li>Beaucoup de buzz autour du projet. Notamment concernant les extensions graphiques (portage de plusieurs librairies AJAX), début d&#8217;intégration avec Spring.</li><li>Un retour à la programmation graphique par composant.</li><li>Facile de mettre en place une IHM simple.</li></ul><p><strong>Les mauvais points :</strong></p><ul><li>Seule une partie du JRE est supportée côté client et pour les DTO utilisés par les RCPs (ex: pas toutes les collections).</li><li>Besoin d&#8217;un mapping objet métier/DTO utilisés par GWT (Serializable et un constructeur public par défaut).</li><li>Manque guide de bonnes pratiques et de la documentation en général.</li><li>Les API ne sont pas toutes détaillées.</li><li>Il n&#8217;y a que des composants graphiques &laquo;&nbsp;simples&nbsp;&raquo;. Si l&#8217;on veut utiliser des composants plus évolués, il faut soit les coder ou bien se tourner vers des librairies de widgets GWT Open Source &laquo;&nbsp;non Google&nbsp;&raquo;.</li></ul><p><strong>Les points non abordés :<br
/> </strong></p><ul><li>Possibilité de faire des tests unitaires.</li><li>Internationalisation.</li><li>JavaScript Native Interface (JSNI).</li><li>Exposition de services via Web Services/JSON/XML.</li><li>Facilité/difficulté du respect d&#8217;une charte graphique.</li><li>Authentification.</li><li>Respect des standards, facilité de référencement.</li><li>Intégration à l&#8217;IDE Idea (semble assez poussée, gestion des CSS et modules à partir du code Java).</li></ul><h3>Struts 2</h3><p>L&#8217;équipe avait préparé un template de projet Struts2 avant le XKE, projet Eclipse/Maven 2, web.xml déjà configuré, librairies installées, et différents tests &laquo;&nbsp;Hello World&nbsp;&raquo; de plugins (zero conf, etc&#8230;).<br
/> Résultat : c&#8217;est l&#8217;équipe gagnante.</p><p>L&#8217;équipe n&#8217;a pas rencontré de difficultés particulières, et a décidé de développer l&#8217;application avec ses tests unitaires, ce qui n&#8217;était peut être pas nécessaire dans le cadre du concours, mais qui a permis de démontrer la facilité avec laquelle les actions Struts2 peuvent être testées unitairement (le gros défaut de Struts 1).</p><h4>Synthèse de l&#8217;équipe :</h4><p><strong>Les bons points :</strong></p><ul><li><strong>Testabilité :</strong> écrire des tests unitaires pour les actions, qui sont de simples POJOs, est très simple.</li><li><strong>Modularité des filtres sur les actions :</strong> les piles d&#8217;Interceptors sont très pratiques pour appliquer des filtres différents aux actions (authentification etc.). Mais est-ce réellement si utile ? A part le classique interceptor d&#8217;authentification qui ne s&#8217;applique pas aux actions de type &laquo;&nbsp;login&nbsp;&raquo; et &laquo;&nbsp;forgotten password&nbsp;&raquo;, a-t-on vraiment besoin de tant de modularité sur les filtres ?</li><li><strong>Simplicité :</strong> Struts 2 est simple à utiliser par une équipe projet. Sa modularité et sa testabilité le rendent parfaitement adapté au travail en équipe.</li><li><strong>Prédictibilité par son efficacité et son classicisme :</strong> Struts2 est un framework éprouvé aux concepts très répandus (&laquo;&nbsp;Action based&nbsp;&raquo;, Orienté Objet simple) qui ne causera pas de mauvaise surprise. Struts 2 sera prédictible sur un projet.</li><li><strong>Elégance des interactions HTTP :</strong> URL claires et un modèle post-and-redirect fiable (double submit) et efficace (bookmarkable) malgré WW-1714  qui est en cours de résolution.</li><li><strong>Souplesse de l&#8217;interface graphique :</strong> le mécanisme de template est très pratique mettre en œuvre la charte graphique d&#8217;un site ou d&#8217;une application. SiteMesh est un complément naturel très efficace.</li><li><strong>Débuggabilité :</strong> des tags de debug (facilement désactivables pour la production) et un browser de configuration simplifient le troubleshooting (voir également  les mauvais points sur la débuggabilité de Struts2).</li><li><strong>Coût d&#8217;entrée réduit :</strong> le framework est plus simple à appréhender que Struts 1.</li><li><strong>Form beans :</strong> aucun fichier de configuration, on peut passer de simples POJO à la vue Tests unitaires : les actions sont testables facilement avec JUnit, les actions sont des POJO.</li><li><strong>Templates :</strong> intégration avec Sitemesh aisée pour les templates, les templates Sitemesh ont accès aux tags Struts grâce au plugin struts2-sitemesh.</li><li><strong>Ajax :</strong> tags Ajax (support Ajax basé sur le toolkit Dojo) simplifient, voir masquent, l&#8217;utilisation de dojoSpring: support de Spring, on choisit le framework d&#8217;injection à utiliser dans la configuration.</li><li><strong>Expression Language :</strong> les taglibs utilisent OGNL, plus puissant que JSTL, Communauté: framework MVC le plus téléchargé du moment (http://www.jroller.com/TedHusted/entry/struts_skyrockets ) , les mailing lists sont très actives.</li></ul><p><strong>Les mauvais points :</strong></p><ul><li><strong>Hétérogénéité / dispersion :</strong> Struts 2 se disperse en proposant souvent plusieurs solutions pour un sujet sans qu&#8217;aucune ne soit pleinement satisfaisante.<ul><li>Trois technos pour le HTML : JSP, Freemarker et Velocity.</li><li>Plusieurs projets de configuration par annotations : Zero config etc.</li></ul></li><li><strong>Configuration propriétaire</strong> (struts.xml).<ul><li>Spring est le standard de-facto pour configurer l&#8217;assemblage des composants d&#8217;une application. Il serait très pratique de pouvoir configurer Struts2 dans les fichiers Spring grâce au mécanisme d&#8217;extension de configuration  introduit dans Spring 2 à l&#8217;instar de la configuration d&#8217;Apache CXF  (e.g. <jaxws:endpoint> , <jms:destination> etc.).</jms:destination></jaxws:endpoint></li></ul></li><li><strong>Productivité modérée :</strong> c&#8217;est probablement un écueil du classicisme et de la testabilité (découplage actions-pojo de la présentation) mais la productivité n&#8217;est pas stupéfiante.</li><li><strong>Debuggabilité :</strong> Struts2 n&#8217;affiche aucun message d&#8217;erreur en cas de coquille sur les variables de scripting (i.e. manipulées par OGNL) aussi bien dans les page web (jsp, ftl ou velocity) que dans la config (paramètres dans les redirections &#8230;). Le problème est en cours de résolution.</li><li><strong>Performances :</strong> l&#8217;application doit être configurée d&#8217;une certaine manière pour obtenir des performances acceptables (http://struts.apache.org/2.x/docs/performance-tuning.html). OGNL est plus lent que JSTL dans certains cas (mais est aussi plus riche).</li><li><strong>Développement :</strong> l&#8217;équipe de commiteurs est réduite, les trous de sécurité prennent du temps à être corrigés.</li><li><strong>Ajax :</strong> Le support Ajax est intégré dans le cœur de Struts2, pas sous forme de plugin, une mise à jour de dojo toolkit demande de sortir une nouvelle version de Struts2 (va changer dans Struts 2.1).</li><li><strong>Documentation :</strong> il est parfois difficile de se repérer dans la documentation, certaines pages font parfois référence à webwork, elle n&#8217;est pas tout le temps à jour (c&#8217;est bien évidemment lié au faible nombre de commiteurs sur le projet).</li></ul><p><strong>Conclusion :</strong></p><p>Struts2 est basé sur l&#8217;excellent WebWork 2.2, les bases sont saines. En revanche, les nouveaux développements Struts 2.0 ont pris du temps, et certains ont été remis en cause dans le futur Struts 2.1. Struts 2.1 est plein de promesses, les performances devraient être meilleures (mise à jour vers OGNL 2.7, vers Dojo 0.9,&#8230;), et le plugin SmartURLs devrait permettre de se passer de la configuration explicite, pour se rapprocher encore du paradigme &laquo;&nbsp;Convention over Configuration&nbsp;&raquo;. Le projet tend vers une consolidation des différents plugins, et a appris de ses erreurs depuis la première release de Struts2. Aujourd&#8217;hui nous pouvons conseiller d&#8217;attendre la première release stable et éprouvée de Struts 2.1 (Struts 2.1.0 devrait sortir à la fin Octobre 2007) pour démarrer un nouveau projet. La branche 2.0 ne va plus évoluer, et le saut 2.0 vers 2.1 ne sera pas forcément transparent!</p><h3>JSF/My Faces</h3><p>Ce groupe de Travail a véritablement bataillé durant toute la journée et le bilan affiché en fin de journée est un peu mitigé.</p><p><strong>Les bons points :</strong></p><ul><li>Concepts proches des frameworks Struts 2 et Spring MVC</li><li>Utilisation de POJO simple</li><li>La tentative de standardisation</li><li>Le support des éditeurs</li></ul><p><strong>Les mauvais points :</strong></p><ul><li>Complexité de mise en oeuvre</li><li>Manque de documentation</li><li>Manque de transparence sur le fonctionnement du framework</li><li>Impossibilité de mixer JSF avec d&#8217;autres composants (Tag JSP 2.0, Taglibs tierces, etc.)</li></ul><h4>Synthèse de l&#8217;équipe :</h4><ul><li>Dès le début JSF présente la spécificité d&#8217;utiliser un buffer spécifique pour écrire la response.</li><li>Il n&#8217;est pas possible d&#8217;utiliser directement du code HTML à l&#8217;intérieur de tags JSF ! Vous devez baliser tout vos blocs html par &lt;f:verbatim&gt; (bye bye xhtml) ou utiliser la tablig htmLib pour remplacer tous vos tags html par le tag <htm:xxx> équivalent (perfs ?).</htm:xxx></f:verbatim></li><li>Autre impact, plus gênant : l&#8217;intégration du code JSF avec les autres taglib. JSF ne dispose pas de certains tags intégrés de base dans d&#8217;autres frameworks. Par exemple, en JSF les conditions et les boucles n&#8217;existent pas. Et comme on atteint vite les limites des fonctionnalités offertes par les taglib JSF, on aimerait bien pouvoir retourner sur du JSTL ; mais là encore vous vous heurterez à des problèmes de compatibilité à cause du &laquo;&nbsp;buffer JSF&nbsp;&raquo; mentionné plus haut.</li><li>La gestion des templates n&#8217;existant pas non plus dans JSF, il faut utiliser struts-tiles.</li><li>Côté gestion des erreurs justement, on peut dire que JSF n&#8217;est pas bavard. Pour certains problèmes de navigation la page appelante est simplement réaffichée, sans aucun message d&#8217;erreur ! Autant dire que certains bugs deviennent très difficiles à analyser.</li><li>Autre détail, le nom des tags dans les taglib ou même pour les fichiers de conf ne sont pas très intuitifs, mais si vous avez besoin, des plugins permettent de vous imprégner du vocabulaire JSF assez rapidement.</li></ul><p><strong>Conclusion :</strong></p><p>JSF n&#8217;est clairement pas le framework le plus productif, en tous cas pas sur une journée car le coût d&#8217;entrée est lourd. Et même une fois habitué au framework, on peut se demander comment être productif sans remontée d&#8217;erreur et quelles limites posera cette gestion de buffer spécifique dans le cadre d&#8217;un vrai projet ?</p><h3>Wicket</h3><p>On peut considérer Wicket comme la bonne surprise de cette journée. Replaçons le contexte. Au moment des choix de chaque consultant, certains ont préféré partir sur la nouveauté (Wicket) par rapport à l&#8217;ancien solide et fiable (ex : Struts 2). Les différents contraintes de leur vie professionnelle n&#8217;ont pas permis aux membres de cette équipe d&#8217;affiner le sujet avant le jour J. Seul un rapide coup d&#8217;œil sur le &laquo;&nbsp;HelloWorld&nbsp;&raquo; de Wicket le soir précédant la compétition. C&#8217;est donc sans grandes connaissances qu&#8217;ils ont abordés ce concours. A la fin de la journée, ils avaient implémentés globalement l&#8217;ensemble du Lot 1 (Rappel: My Faces et GWT n&#8217;y sont pas arrivés !). C&#8217;est là que le framework choisit intervient.</p><p><strong>Les bons points :</strong></p><ul><li>Prise en main rapide</li><li>Véritable séparation entre la partie cliente et la partie serveur (utilisation de plain HTML)</li><li>Retour à la programmation graphique des composants</li><li>Mécanismes de templating par héritage Java</li><li>Pas de fichier de configuration : une classe définie dans le web.xml sert de point d&#8217;entrée</li><li>Navigation entre les pages définies en Java (ex: new Link(PageSuivante.class))</li><li>Démarrage rapide (notamment grâce à l&#8217;archetype Maven2)</li></ul><p><strong>Les mauvais points :</strong></p><ul><li>Documentation très très succinte malgré l&#8217;existence d&#8217;exemples<ul><li>Pas d&#8217;explication des concepts de base (navigation, gestion de la session, templating, etc)</li></ul></li></ul><p><strong>Les points non abordés :</strong></p><ul><li>Possibilité de faire des tests unitaires</li><li>Validation de formulaire</li><li>Internationalisation</li><li>Intégration de composant Ajax</li></ul><h4>Synthèse de l&#8217;équipe :</h4><p>Les concepts de wicket sont les suivants :</p><ul><li>Séparation très claire entre la présentation (.html) et les actions métiers (.java).</li><li>Pas de longue configuration xml, le seul fichier xml est le web.xml.</li><li>Une création automatique d&#8217;un squelette d&#8217;application avec un seul artefact maven. (est-ce maven la réelle clé de la productivité ?)</li><li>Haute réutilisation des maquettes html (fournie avec les spécifications) : le positionnement des éléments dynamiques utilisent principalement des balises HTML de type <span></span> &lt;span&gt; avec un attribut &laquo;&nbsp;wicket.id&nbsp;&raquo;.</li></ul><p><strong>Conclusion :</strong></p><p>En un mot, un framework web simple, facile et pragmatique. Ces 3 qualificatifs ont permis à l&#8217;équipe d&#8217;aller très vite une fois les concepts acquis. Ils ont cependant beaucoup &laquo;&nbsp;ralé&nbsp;&raquo; sur le manque de documentation. Seuls les exemples fournis leur ont permis de déjouer et de comprendre les subtilités du framework. Il faut cependant relativiser cet enthousiasme :</p><ul><li>Que vaut wicket sur des fonctions avancées comme la validation de formulaire ou un workflow d&#8217;écran avec suivant et précédent ?</li><li>Est-il seulement un buzzword du moment ou va-t-il perdurer ?</li></ul><h3>Alors qui est le gagnant ?</h3><ul><li><strong>Catégorie &laquo;&nbsp;Couverture&nbsp;&raquo;</strong>, l&#8217;équipe Struts2 a implémenté le plus de fonctionnalités, c&#8217;est indéniable. En revanche déception vis à vis du rendement !</li><li><strong>Catégorie &laquo;&nbsp;Découverte&nbsp;&raquo;</strong>, Wicket a été une révélation pour beaucoup d&#8217;entre nous ! Une fois passée la barrière de la découverte, le développement est rapide et efficace.</li></ul><p>Pour des raisons évidentes de bonne moralité, nous ne pouvons mettre en ligne les différentes applications développées &#8230;</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2007/10/26/xebia-web-framework-contest/feed/</wfw:commentRss> <slash:comments>26</slash:comments> </item> </channel> </rss>
