<?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; JSF</title> <atom:link href="http://blog.xebia.fr/tag/jsf/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>Java EE 6, une plateforme simple et légère. Spring n’a qu’à bien se tenir !</title><link>http://blog.xebia.fr/2012/02/01/java-ee-6-une-plateforme-simple-et-legere-spring-na-qua-bien-se-tenir/</link> <comments>http://blog.xebia.fr/2012/02/01/java-ee-6-une-plateforme-simple-et-legere-spring-na-qua-bien-se-tenir/#comments</comments> <pubDate>Wed, 01 Feb 2012 04:20:00 +0000</pubDate> <dc:creator>Romain Schlick</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[CDI]]></category> <category><![CDATA[DeltaSpike]]></category> <category><![CDATA[EJB]]></category> <category><![CDATA[Java EE 6]]></category> <category><![CDATA[JSF]]></category> <category><![CDATA[Spring]]></category> <category><![CDATA[Weld]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=10500</guid> <description><![CDATA[La plateforme Java EE conserve de nos jours encore une mauvaise réputation. Les fameux EJB 2 et conteneurs lourds démarrant en plusieurs minutes vous rappelleront quelques bons souvenirs. L&#8217;arrivée de Spring a ouvert la voie aux conteneurs légers, à l&#8217;inversion de contrôle, ou encore à l&#8217;injection de dépendances; et est devenue la solution de référence. [...]]]></description> <content:encoded><![CDATA[<p>La plateforme Java EE conserve de nos jours encore une mauvaise réputation. Les fameux EJB 2 et conteneurs lourds démarrant en plusieurs minutes vous rappelleront quelques bons souvenirs. L&#8217;arrivée de Spring a ouvert la voie aux conteneurs légers, à l&#8217;inversion de contrôle, ou encore à l&#8217;injection de dépendances; et est devenue la solution de référence. Cependant, la plateforme Java EE a beaucoup évolué entre temps.</p><p>Nous allons voir que Java EE 6 n&#8217;a maintenant rien à envier à Spring. Cette plateforme est devenue légère et simple à prendre en main. Toutes les spécifications ne seront pas abordées en détails.  Nous parlerons plutôt de conteneurs légers et testables, de managed beans, d&#8217;EJB Lite, ainsi que des nombreux services et patterns offert par la plateforme.  Nous terminerons par la spécification CDI et ses extensions portables, qui offrent de belles perspectives à la plateforme Java EE 6.</p><h3><a
name="JavaEE6%2Cuneplateformesimpleetl%C3%A9g%C3%A8re.Springn%E2%80%99aqu%E2%80%99%C3%A0biensetenir%21-Spring%2Cc%E2%80%99estquandm%C3%AAmebienchouette%5C%21"></a>Spring, c’est quand même bien chouette!</h3><p>Spring, Spring, Spring&#8230; Oui, <a
href="http://www.springsource.org/get-started" rel="nofollow">Spring</a> est un outil qui a révolutionné nos vies de développeurs et qui s’est très rapidement installé chez nos clients. Il a apporté avec lui des paradigmes de programmation comme l’IOC (<a
href="http://fr.wikipedia.org/wiki/Inversion_de_contr%C3%B4le" rel="nofollow">Inversion Of Control</a>),  la DI (<a
href="http://en.wikipedia.org/wiki/Dependency_injection" rel="nofollow">dependency injection</a>), l&#8217;utilisation de simple POJOs, mais aussi de la simplicité avec ses xTemplate bien utiles. Arrivé en 2003, Spring s’est imposé rapidement dans les entreprises face au standard J2EE 1.4. Ce dernier était un peu Goliath J2EE. Souvenez vous de cette grosse usine à gaz avec ses EJB 2, son conteneur lourd packagé en <em>ear,</em> qui mettait des minutes à démarrer sur un serveur WAS.  Face à lui, un David nommé Spring doté de simples beans POJO, d&#8217;un conteneur léger  et d&#8217;un packaging war déployable sur un simple serveur web, comme <em>Tomcat</em>. Grâce à eux,  Spring s&#8217;est imposé dans les entreprises en quelques années .</p><h3><a
name="JavaEE6%2Cuneplateformesimpleetl%C3%A9g%C3%A8re.Springn%E2%80%99aqu%E2%80%99%C3%A0biensetenir%21-JavaEE5%3Ad%C3%A9butdelacured%E2%80%99amaigrissement"></a>Java EE 5: début de la cure d’amaigrissement</h3><p>Mais tout cela, c’était il y a neuf ans et depuis un sacré chemin a été parcouru par la spécification Java EE. En 2006, Java EE 5 est arrivé enrichi de nouvelles transformations. Tout d&#8217;abord, son utilisation a été rendue plus simple grâce à l’utilisation massive des annotations. Les EJB 3.0 en ont bénéficié et sont devenus ainsi injectables et plus faciles à implémenter. Il y a eu aussi l’arrivée de JPA, une nouvelle API de persistance, fortement inspirée d&#8217;Hibernate qui a fait disparaître les anciens Entity EJB CMP/BMP.</p><h3><a
name="JavaEE6%2Cuneplateformesimpleetl%C3%A9g%C3%A8re.Springn%E2%80%99aqu%E2%80%99%C3%A0biensetenir%21-JavaEE6%2C%C3%A7arocks%5C%21"></a>Java EE 6, ça rocks !</h3><p>Sortie en 2009, <a
href="http://www.oracle.com/technetwork/java/javaee/overview/index.html">Java EE 6</a> a progressé sur la voie de la simplicité avec l’utilisation massive des annotations et des POJO.  A tel point qu’on peut se demander maintenant qui est David et qui est Goliath.<br
/> Des API existantes ont encore prospéré de manière significative, comme les EJB 3.1 (dont les EJB Lite), JPA 2.0, JSF 2.0, ou encore Servlet 3.0. De nouvelles API ont fait leur apparition comme CDI 1.0, @Inject 1.0, Interceptors 1.1, JAX-RS 1.1, ou encore Bean Validation 1.0. Et, toujours dans un esprit de “light is right”, de vieilles spécifications comme JAX-RPC, JAX-R, ou JSR88 ont été déclarées “pruned” et devraient disparaître pour la prochaine version de Java EE 7.<br
/> Par ailleurs, cette version introduit enfin des noms JNDI standard et donc portables entre les différents serveurs d’application. Cette version embrasse aussi les paradigmes de <em>convention-over-configuration</em> et de <em>configuration-by-exception</em>, qui permettent de ne presque plus rien avoir à configurer, le conteneur appliquant des paramètres par défaut tant qu’il n’ y a pas d’exception. Ainsi, on obtient des applications avec très peu de fichiers de configuration xml.<br
/> Avec Servlet 3.0, le bon vieux web.xml est devenu optionnel. Ainsi, ne soyez pas étonné de ne voir qu’en tout et pour tout seulement deux fichiers de configuration dans un projet Java EE: un fichier persistence.xml pour gérer la persistance avec JPA et un fichier beans.xml (qui peut rester vide) pour les managed beans.</p><h3><a
name="JavaEE6%2Cuneplateformesimpleetl%C3%A9g%C3%A8re.Springn%E2%80%99aqu%E2%80%99%C3%A0biensetenir%21-Unpackagingwargr%C3%A2ceauWebProfile1.0etauxEJBLite"></a>Un packaging war grâce au Web Profile 1.0 et aux EJB Lite</h3><p>L’arrivée des Profiles est une autre nouveauté majeure, ouvrant de nouvelles perspectives. En particulier, le <a
href="http://java.sun.com/developer/technicalArticles/JavaEE/JavaEE6Overview_Part3.html#tab1" rel="nofollow">Web Profile</a> qui reprend un sous-ensemble de Java EE et qui permet de packager son application dans un simple war. Le Web Profile embarque les spécifications essentielles communément requises pour développer une application web d’aujourd’hui : JSF, JSP, Servlet, EL, JSTL, EJB Lite, CDI, etc. Cependant, il a été nécessaire de créer des EJB “Lite”, qui n’implémentent pas toute la spécification EJB. Ils conservent néanmoins le principal, à savoir : les Session Beans, l’injection, les interceptors, la transaction et sécurité. Ces sont donc de simples classes POJO, qui n’implémentent pas d’interfaces (appelée ‘no-interface view’). Les EJB Lite sont ainsi déployables dans un simple war.</p><pre class="brush: java; gutter: true; title: ; notranslate">
//Exemple d'un EJB Lite avec une no-interface view
  @Stateless
   public class HelloBean {
       public String sayHello() {
           String message = propertiesBean.getProperty(&quot;hello.message&quot;);
           return message;
       }
   }
</pre><h3><a
name="JavaEE6%2Cuneplateformesimpleetl%C3%A9g%C3%A8re.Springn%E2%80%99aqu%E2%80%99%C3%A0biensetenir%21-Desconteneursl%C3%A9gersetembarqu%C3%A9s"></a>Des conteneurs légers et embarqués</h3><p>Vous vous souvenez sans doute des serveurs d&#8217;application &laquo;&nbsp;usine à gaz&nbsp;&raquo;, qui prenaient parfois quelques minutes à démarrer et à déployer votre application Java EE, . Il était aussi très difficile de tester ces EJB et de réaliser des tests d&#8217;intégration automatisés. Ces temps là sont maintenant révolus! Aujourd&#8217;hui, nous écrivons de plus en plus des tests unitaires et d&#8217;intégration. Nous avons besoin de déployer nos applications le plus rapidement possible pour ne pas être trop pénalisé durant notre cycle de développement. Pour répondre à ces besoins, les EJB 3.1 ont introduit l&#8217;idée de conteneurs JEE embarqués. Ces conteneurs EJB implémentent l&#8217;API javax.ejb.embeddable et sont packagés dans un jar exécutable n&#8217;importe où : du code Java SE, des tests Junit, ou encore un conteneur web. Ce conteneur s’exécute donc au sein de la même JVM que votre programme. Vous pouvez ainsi débugger facilement vos applications avec votre IDE préféré.</p><h3><a
name="JavaEE6%2Cuneplateformesimpleetl%C3%A9g%C3%A8re.Springn%E2%80%99aqu%E2%80%99%C3%A0biensetenir%21-...ettestables%5C%21"></a>&#8230;et testables!</h3><p>Voici un exemple de code Junit, où l&#8217;on peut voir comme il est simple de créer un conteneur EJB embarqué à l&#8217;aide de API <a
href="http://docs.oracle.com/javaee/6/api/javax/ejb/embeddable/EJBContainer.html" rel="nofollow">javax.ejb.embeddable.EJBContainer</a>. Des propriétés sont passées à l&#8217; EJBContainer pour préciser où sont les ressources et classes Java. Ensuite, pour récupérer l&#8217;EJB, il suffit de faire un lookup dans le contexte en utilisant le nom JNDI portable de l&#8217;EJB.</p><pre class="brush: java; gutter: true; title: ; notranslate">
private static EJBContainer ec;
private static Context ctx;
@BeforeClass
public static void createEmbeddedTestContainer() throws Exception {
       Map properties = new HashMap();
       properties.put(EJBContainer.MODULES, new File[]{new File(&quot;target/classes&quot;), new File(&quot;target/test-classes&quot;)});
       ec = EJBContainer.createEJBContainer(properties);
       ctx = ec.getContext();
}
//Pour récuperer un EJB:
ctx.lookup(&quot;java:global/classes/MyEJB&quot;)
</pre><p>Par ailleurs, il existe une manière plus évoluée pour tester son conteneur EJB à l&#8217;aide de <a
href="http://www.jboss.org/arquillian" rel="nofollow">JBoss Arquillian</a> et <a
href="http://www.jboss.org/shrinkwrap" rel="nofollow">ShrinkWrap</a>. Arquillian se pluggue sous forme de runner Junit et s&#8217;occupe de créer le conteneur pour vous. Il permet ainsi d&#8217;injecter directement avec @Inject vos beans. ShrinkWrap est un petit utilitaire qui permet quant à lui de créer une archive jar contenant les classes et fichiers ressources du projet. Arquillian à l&#8217;aide de l&#8217;annotation @Deployment va récupérer cette archive au moment de démarrer le conteneur. </p><pre class="brush: java; gutter: true; title: ; notranslate">
@RunWith(Arquillian.class)
public class MyEJBTest {
   @Deployment
   public static JavaArchive createDeployment() {
      return ShrinkWrap.create(JavaArchive.class, &quot;test.jar&quot;)
         .addClasses(MyEJB.class, AnotherClass.class);
   }
   @Inject
   private MyEJB myEJB;
</pre><h3><a
name="JavaEE6%2Cuneplateformesimpleetl%C3%A9g%C3%A8re.Springn%E2%80%99aqu%E2%80%99%C3%A0biensetenir%21-Lesserveursd%27applicationsontmisleturbo"></a>Les serveurs d&#8217;applications ont mis le turbo</h3><p>Il existe quelques serveurs qui implémentent le Full Profile  Java  EE 6 et <a
href="http://www.oracle.com/technetwork/java/javaee/overview/compatibility-jsp-136984.html" rel="nofollow">certifiés par Oracle</a>, comme Oracle GlassFish Server 3.x,  IBM  WebSphere Application Server 8.0, ou encore Apache Geronimo 3.x. Mais grâce au Web Profile, on voit apparaitre de nombreux  serveurs Java  EE 6 Web Profile, comme: Jboss 7, Apache TomEE, ou encore Caucho   Resin.</p><p>Prenons par exemple, <a
href="http://openejb.apache.org/" rel="nofollow">Apache TomEE</a>, qui n&#8217;est autre qu&#8217;un serveur  Tomcat, auquel on a ajouté quelques jars, comme OpenWebBeans, OpenEJB,  OpenJPA et MyFaces pour qu&#8217;il soit compatible Java EE 6 Web Profile.  Comme le souligne <a
href="http://agoncal.wordpress.com/2011/10/20/o-java-ee-6-application-servers-where-art-thou/" rel="nofollow">Antonio Goncalves</a>, Java EE expert member, <b>ces serveurs démarrent très  rapidement:</b>  La plupart en moins de 4 secondes à comparer avec un simple  Tomcat qui démarre en 0,7s. On oubliera WebSphere qui reste encore d&#8217;une lenteur accablante avec un démarrage en 48s. La version Full Profile de GlassFish nous rassure avec un démarrage en à peine 3s. On voit bien que Java EE devient de plus  en plus rapide, simple à utiliser et s&#8217;oriente vers une architecture de  plus en plus modulaire. </p><h3><a
name="JavaEE6%2Cuneplateformesimpleetl%C3%A9g%C3%A8re.Springn%E2%80%99aqu%E2%80%99%C3%A0biensetenir%21-AvecCDI%2Coninjectetoutdanstout%5C%21"></a>Avec CDI, on injecte tout dans tout!</h3><p>En parallèle de la notion de conteneur léger, l&#8217;API Managed Beans 1.0 décrit que toute classe POJO est potentiellement un bean managé par le conteneur. Ce dernier doit lui fournir un certain nombre de services simples, comme la gestion du cycle de vie du bean avec @PostConstruct et @PreDestroy, des interceptors  “à la AOP” avec le @Interceptor, et le @AroundInvoke, ou encore de l’injection de dépendances avec @Inject, et @Resource.</p><p>CDI 1.0 est une API majeure dans Java EE 6 qui permet entre autre de réaliser l&#8217;injection de dépendance et bien plus comme nous le verrons par la suite. L&#8217;implémentation de référence est <a
href="http://seamframework.org/Weld" rel="nofollow">JBoss Weld</a>. Ici, le mot d&#8217;ordre est loose coupling, strong typing. Contrairement aux beans Spring, qui sont identifiés par des String, et donc sources d&#8217;erreurs au runtime, CDI a choisi la voix du typage fort en utilisant des annotations. Tout managed bean est injectable dans un autre. Bref, maintenant on peut vraiment injecter tout dans tout ! A son chargement le conteneur CDI va scanner tous les jars de son classpath à la recherche d&#8217;un fichier beans.xml. Si un fichier est trouvé, il va créer des managed beans pour toutes les classes concernées. Ce type de chargement permet de réduire le temps de création du conteneur CDI et d&#8217;exclure facilement les jars que l&#8217;on ne veut pas manager. Par défaut, le fichier beans.xml peut rester vide, ce sont alors les annotations, qui seront utilisées. Si vous configurez le fichier, vous pourrez définir ou surcharger les propriétés d&#8217;un bean : les informations du fichier xml ayant prédominance par rapport aux annotations.</p><h4><a
name="JavaEE6%2Cuneplateformesimpleetl%C3%A9g%C3%A8re.Springn%E2%80%99aqu%E2%80%99%C3%A0biensetenir%21-Lesscopes"></a>Les scopes</h4><p>Tout bean dispose d&#8217;un scope. Par défaut, le scope est implicitement annoté @Dependent, ce qui revient à créer une instance du bean pour chaque objet dépendant de lui. D&#8217;autres scopes sont proposés: @RequestScoped, @SessionScoped, @ApplicationScoped, ou encore @ConversationScoped. Il est possible de créer ses propres scopes métiers. Il existe également une annotation @New pour forcer l&#8217;injection d&#8217;une nouvelle instance d&#8217;un bean, même si celui-ci a un scope Application par exemple.</p><pre class="brush: java; gutter: true; title: ; notranslate">
@Inject @New Calculator calculator;
@ApplicationScoped
public class Calculator {...}
</pre><h4><a
name="JavaEE6%2Cuneplateformesimpleetl%C3%A9g%C3%A8re.Springn%E2%80%99aqu%E2%80%99%C3%A0biensetenir%21-L%27injectionavec@Inject"></a>L&#8217;injection avec @Inject</h4><p>Ainsi, pour injecter un bean, il suffit d&#8217;annoter une classe, une propriété, ou un paramètre avec l&#8217;annotation @Inject. Les beans sont identifiés de plusieurs manières possibles. La première méthode utilise un @Qualifier. Par défaut, si l&#8217;on ne précise rien, c&#8217;est le qualifier @Default qui est appliqué.</p><pre class="brush: java; gutter: true; title: ; notranslate">
@Inject
private CustomerDao customerDao;
//Equivalent à:
@Inject @Default
private CustomerDao customerDao;
</pre><h4><a
name="JavaEE6%2Cuneplateformesimpleetl%C3%A9g%C3%A8re.Springn%E2%80%99aqu%E2%80%99%C3%A0biensetenir%21-Identifierunbeanavec@Qualifier"></a>Identifier un bean avec @Qualifier</h4><p>Si votre bean a plusieurs implémentations et afin de prévenir des ambiguïtés au niveau d&#8217;un point d&#8217;injection, vous devrez créer votre propre qualifier. Pour cela, il suffit de créer votre propre annotation avec @Qualifier et d&#8217;annoter votre bean avec celle-ci.</p><pre class="brush: java; gutter: true; title: ; notranslate">
@Qualifier
@Retention(RUNTIME)
@Target({FIELD, TYPE, METHOD, PARAMETER})
public @interface JdbcDao {
}
@Qualifier
@Retention(RUNTIME)
@Target({FIELD, TYPE, METHOD, PARAMETER})
public @interface JPADao {
}
@JdbcDao
public class JdbcCustomerDao implements CustomerDao {...}
@JPADao
public class JPACustomerDao implements CustomerDao {...}
//Exemple d'injection avec @Qualifier:
@Inject @JdbcDao
private CustomerDao customerDao;
</pre><h4><a
name="JavaEE6%2Cuneplateformesimpleetl%C3%A9g%C3%A8re.Springn%E2%80%99aqu%E2%80%99%C3%A0biensetenir%21-IdentifierunbeanviasonnomELavec@Named"></a>Identifier un bean via son nom EL avec @Named</h4><p>Une autre manière d&#8217;identifier un bean est d&#8217;indiquer son nom EL (Expression Language) via l&#8217;annotation @Named. Ce bean sera ainsi accessible depuis vos pages JSF en utilisant une EL. Il est possible de spécifier un nom ou par défaut c&#8217;est le nom de classe dont la première lettre passe en minuscule qui est considéré.</p><pre class="brush: java; gutter: true; title: ; notranslate">
@Named
public class Calculator {...}
//Equivalent à :
@Named(&quot;calculator&quot;)
public class Calculator {...}
//Page JSF:
&lt;h:outputLabel value=&quot;#{calculator.someMethod}&quot; /&gt;
</pre><h4><a
name="JavaEE6%2Cuneplateformesimpleetl%C3%A9g%C3%A8re.Springn%E2%80%99aqu%E2%80%99%C3%A0biensetenir%21-D%C3%A9finiruneimpl%C3%A9mentationalternativeavec@Alternative"></a>Définir une implémentation alternative avec @Alternative</h4><p>Une autre fonctionnalité intéressante proposée dans CDI est de définir une implémentation alternative à un bean. Cette alternative doit être déclarée dans le fichier beans.xml et permet de modifier l&#8217;implémentation d&#8217;un bean au déploiement. Elle surcharge donc le bean qui aurait dû être injecté initialement.</p><pre class="brush: java; gutter: true; title: ; notranslate">
//MockCustomerDao est une implémentation alternative aux implémentations Jdbc et JPA
@Alternative
@JdbcDao
@JPADao
public class MockCustomerDao implements CustomerDao {...}
//L'implémentation alternative MockCustomerDao sera injectée à la place de JPADao:
@Inject @JPADao
private CustomerDao customerDao;
//Déclaration de l'alternative dans le beans.xml:
&lt;alternatives&gt;
   &lt;class&gt;fr.xebia.cdi.MockCustomerDao&lt;/class&gt;
&lt;/alternatives&gt;
</pre><h4><a
name="JavaEE6%2Cuneplateformesimpleetl%C3%A9g%C3%A8re.Springn%E2%80%99aqu%E2%80%99%C3%A0biensetenir%21-Personnaliserler%C3%B4led%27unbeanavec@Stereotype"></a>Personnaliser le rôle d&#8217;un bean avec @Stereotype</h4><p>Les stéréotypes permettent de regrouper au sein d&#8217;une même annotation des modèles et des rôles communs que l&#8217;on veut implanter sur des beans. CDI fournit quelques stéréotypes de base. Ci-dessous, le stéréotype @Model représente la partie Model du pattern MVC et peut être utilisée pour les beans JSF. On voit par exemple que les beans utilisant ce stéréotype auront tous en commun un nom EL, et un scope request.</p><pre class="brush: java; gutter: true; title: ; notranslate">
@Named
@RequestScoped
@Stereotype
@Target({TYPE, METHOD, FIELD})
@Retention(RUNTIME)
public @interface Model {}
</pre><p>On constate la richesse qu&#8217;offre CDI en plus de la simple injection de dépendances. Les qualifiers et stéréotypes permettent notamment de donner du sens métier et fonctionnel aux beans.</p><h3><a
name="JavaEE6%2Cuneplateformesimpleetl%C3%A9g%C3%A8re.Springn%E2%80%99aqu%E2%80%99%C3%A0biensetenir%21-CDIoffredenombreuxpatternscl%C3%A9enmain"></a>CDI offre de nombreux patterns clé en main</h3><p>Outre l&#8217;injection de dépendance, CDI va plus loin en implémentant un certain nombre de patterns de programmation. Là encore, c&#8217;est à l&#8217;aide d&#8217;annotations que la magie opère.</p><h4><a
name="JavaEE6%2Cuneplateformesimpleetl%C3%A9g%C3%A8re.Springn%E2%80%99aqu%E2%80%99%C3%A0biensetenir%21-LepatternSingletonavec@Singleton"></a>Le pattern Singleton avec @Singleton</h4><p>Tout d&#8217;abord le mythique pattern Singleton, où il suffit d&#8217;annoter un bean avec @Singleton. Ainsi, une seule instance du bean est partagée et les accès concurrents sont gérés. Il faut savoir que cette annotation est en fait un pseudo-scope, mais contrairement aux autres scopes, le conteneur injecte une référence directe au bean, et non un proxy.</p><h4><a
name="JavaEE6%2Cuneplateformesimpleetl%C3%A9g%C3%A8re.Springn%E2%80%99aqu%E2%80%99%C3%A0biensetenir%21-LepatternFactoryavec@Produces"></a>Le pattern Factory avec @Produces</h4><p>Cette technique appelée <em>producer method</em> est une méthode permettant de créer des objets injectables. On peut produire des types primitifs, des beans ou encore des ressources telles qu&#8217;un entityManager, une connection JMS, etc. Dans l&#8217;exemple ci-dessous, notre <em>producer method</em> produit un logger. Pour créer ce logger, il est nécessaire d&#8217;indiquer le nom de la classe qui sera loggué. Pour cela, il suffit de passer en paramètre de notre méthode un objet InjectionPoint qui sera injecté par CDI. Cet objet permet de récupérer des informations de contexte, comme la classe où est injecté l&#8217;objet Logger.</p><pre class="brush: java; gutter: true; title: ; notranslate">
class LogFactory {
   @Produces Logger createLogger(InjectionPoint injectionPoint) {
       return Logger.getLogger(injectionPoint.getMember().getDeclaringClass().getName());
   }
}
//Injection du logger:
@Inject
private Logger logger;
</pre><h4><a
name="JavaEE6%2Cuneplateformesimpleetl%C3%A9g%C3%A8re.Springn%E2%80%99aqu%E2%80%99%C3%A0biensetenir%21-LesinterceptorsavecCDI"></a>Les interceptors avec CDI</h4><p>CDI enrichit l&#8217;API Interceptors 1.1 présente dans Java EE 6. Initialement, Interceptors permet de faire de l&#8217;interception à la &laquo;&nbsp;AOP&nbsp;&raquo; sur les managed beans ou les EJB beans. L&#8217;intercepteur déclenche alors un traitement avant et après l&#8217;invocation d&#8217;une méthode. L&#8217;annotation @AroundInvoke permet d’exécuter du code au moment de l&#8217;interception et @Interceptors indique les méthodes à intercepter. Ainsi, CDI introduit une nouvelle annotation @InterceptorBinding, qui simplifie et offre un couplage lâche avec la classe de l&#8217;interceptor.</p><pre class="brush: java; gutter: true; title: ; notranslate">
@InterceptorBinding
@Inherited
@Target( { TYPE, METHOD })
@Retention(RUNTIME)
public @interface Transactional {}
//Intercepteur qui déclare l'annotation précédente, ainsi que @Interceptor
public @Transactional @Interceptor
class TransactionInterceptor { ... }
//On applique l'intercepteur sur le bean via l'annotation.
public @SessionScoped @Transactional
class ShoppingCart implements Serializable { ... }
</pre><h4><a
name="JavaEE6%2Cuneplateformesimpleetl%C3%A9g%C3%A8re.Springn%E2%80%99aqu%E2%80%99%C3%A0biensetenir%21-LepatternDecoratoravec@Decorator"></a>Le pattern Decorator avec @Decorator</h4><p>Les décorateurs ressemblent aux intercepteurs. Ils interceptent aussi des appels de méthodes, mais ont en plus accès à la sémantique du bean intercepté. Un décorateur est une classe abstraite (ou non) qui implémente le type du bean qu&#8217;il décore et est annoté avec @Decorator.<br
/> Le bean du décorateur s&#8217;injecte l&#8217;objet qu&#8217;il décore via les annotations  @Inject @Delegate @Any. L&#8217;annotation @Delegate indique que ce point  d&#8217;injection correspond au bean que l&#8217;on veut décorer. L&#8217;annotation  @Any permet d&#8217;intercepter tous les beans implémentant l&#8217;interface du type décoré.  Enfin, le décorateur implémente au choix les méthodes qu&#8217;il veut intercepter.</p><pre class="brush: java; gutter: true; title: ; notranslate">
public interface Customer {
   String getName();
   ...
}
@Decorator
public abstract class CustomerDecorator
implements Customer {
   @Inject @Delegate @Any
   Customer customer;
   public String getName() {
      return &quot;decorate&quot;+ customer.getName();
   }
}
</pre><h4><a
name="JavaEE6%2Cuneplateformesimpleetl%C3%A9g%C3%A8re.Springn%E2%80%99aqu%E2%80%99%C3%A0biensetenir%21-LepatternObserver%28ouEvent%29avec@Observable"></a>Le pattern Observer (ou Event) avec @Observable</h4><p>CDI offre la possibilité aux beans de produire et de consommer des  events. Ce mécanisme permet notamment aux beans d&#8217;interagir entre eux via un couplage lâche et asynchrone sans utiliser JMS. Par ailleurs, ce  pattern permet de synchroniser et capter les changements d&#8217;état de  beans stateful. <br
/> Un event est matérialisé par un objet java (event object ou payload) et est marqué d&#8217;un ou plusieurs qualifiers (event qualifiers). Les qualifiers permettent de distinguer les events que l&#8217;on veut produire ou observer pour un type de bean donné. Techniquement, une méthode observatrice (observer method) aura le rôle de consommer  l&#8217;event object, correspondant à un ensemble de qualifiers donnés.</p><pre class="brush: java; gutter: true; title: ; notranslate">
//Permet de qualifier l'event
@Qualifier
@Target({FIELD, PARAMETER})
@Retention(RUNTIME)
public @interface Updated {}
//Observer method pour tout type de Customer
public void onAnyCustomerEvent(@Observes Customer customer) { ... }
//Observer method pour les Customer qualifié par @Updated
public void afterCustomerUpdate(@Observes @Updated Customer customer) { ... }
//Producteur d'un event de type Customer qualifié par @Updated
@Inject @Updated Event&lt;Customer&gt; customerEvent;
public void someMethod(Event&lt;Customer&gt; customerEvent) {
   ...
   customerEvent.fire(customer);
}
</pre><h3><a
name="JavaEE6%2Cuneplateformesimpleetl%C3%A9g%C3%A8re.Springn%E2%80%99aqu%E2%80%99%C3%A0biensetenir%21-LesextensionsCDI%2Cl%E2%80%99avenirdeJavaEE%3F"></a>Les extensions CDI, l’avenir de Java EE ?</h3><p>De base, les patterns et les fonctionnalités qu&#8217;offre CDI sont riches et nombreux. Mais, cela va encore plus loin. Le cœur de CDI a été conçu tel  un bus d’événements. Au moment du chargement du conteneur, celui-ci  envoie ses informations de contexte (détection d&#8217;annotations, de beans,  etc.) dans un bus. Il est alors possible de capter ces événements via  une SPI, contenu dans le package <a
href="http://docs.jboss.org/cdi/api/1.0/javax/enterprise/inject/spi/Extension.html" rel="nofollow">javax.enterprise.inject.spi</a>. En  implémentant cette SPI, il est ainsi possible de capter ces informations  et d&#8217;effectuer des traitements propres. Cette architecture rend CDI  modulaire et permet le développement d&#8217;extensions CDI portables.</p><p>Les développeurs de <a
href="http://seamframework.org/Seam3" rel="nofollow">Seam 3</a> ont bien compris l’intérêt des extensions CDI et ont conçu leur framework comme un ensemble d&#8217;extensions à CDI. Si vous avez besoin d&#8217;une certaine fonctionnalité, il suffit d&#8217;ajouter le module concerné. Cela ouvre la voix à l&#8217;intégration d&#8217;api third-party et permet d&#8217;enrichir considérablement la plateforme Java EE,  de la même manière que Spring le fait avec ses modules et ses templates.</p><p>Par ailleurs, un projet très ambitieux encore en incubation chez Apache, nommé <a
href="http://wiki.apache.org/incubator/DeltaSpikeProposal" rel="nofollow">DeltaSpike </a>a pour but de standardiser un ensemble d&#8217;extensions CDI,  développé et maintenu par la communauté Java. Et éventuellement, ces  extensions pourront être intégrées aux spécifications Java SE et EE. Les premiers contributeurs ont offert les &laquo;&nbsp;code base&nbsp;&raquo; de JBoss Seam3, Apache MyFaces CODI et CDISource. A terme, JBoss Seam 3 et consorts disparaitront pour laisser DeltaSpike la seule source d&#8217;extensions CDI portables et standards. L&#8217;avenir de Java EE passera donc aussi par le développement des extensions CDI.</p><h3><a
name="JavaEE6%2Cuneplateformesimpleetl%C3%A9g%C3%A8re.Springn%E2%80%99aqu%E2%80%99%C3%A0biensetenir%21-Conclusion"></a>Conclusion</h3><p>Cet article avait pour vocation de démontrer que la plateforme Java EE 6 est aboutie et apporte des nouveautés majeures. Il n&#8217;a pas abordé toutes les spécifications, telles que JPA 2, Bean Validation 1.1 ou encore JSF 2.0.  Comme nous avons pu le voir, cette plateforme a rattrapé son retard par rapport au géant Spring. L&#8217;arrivée du Web Profile et des EJB Lite ouvre la voie à des conteneurs légers et testables.</p><p>Néanmoins, il y a quelques petites déceptions: par exemple, la gestion de la configuration et celle des profiles sont inexistantes contrairement à spring. On peut aussi regretter que le profile web  n&#8217;inclue pas JMS, JAX-RS et JAX-WS. Enfin, <b>la</b> réussite de Java EE 6 est sans doute l&#8217;API CDI, qui apporte enfin l&#8217;injection de dépendances, de la modularité, et même plus avec ses extensions. Le projet Delta Spike qui consiste à devenir le catalogue de référence des extensions CDI est à surveiller de près.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2012/02/01/java-ee-6-une-plateforme-simple-et-legere-spring-na-qua-bien-se-tenir/feed/</wfw:commentRss> <slash:comments>23</slash:comments> </item> <item><title>Devoxx &#8211; Jour 1 &#8211; JSF 2</title><link>http://blog.xebia.fr/2009/11/18/devoxx-jour-1-jsf-2/</link> <comments>http://blog.xebia.fr/2009/11/18/devoxx-jour-1-jsf-2/#comments</comments> <pubDate>Wed, 18 Nov 2009 12:01:33 +0000</pubDate> <dc:creator>Romain Maton</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Ajax]]></category> <category><![CDATA[Devoxx]]></category> <category><![CDATA[Facelets]]></category> <category><![CDATA[Gracelets]]></category> <category><![CDATA[Groovy]]></category> <category><![CDATA[JEE6]]></category> <category><![CDATA[JSF]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3205</guid> <description><![CDATA[Une des sessions très attendues de ce Devoxx 2009 (avec JEE6) est JSF 2.0. Beaucoup de spécificités de JSF premier du nom ont découragé de nombreux développeurs. De ce fait, JSF n&#8217;a pas très bonne réputation&#8230; Et il faut rattraper ça ! C&#8217;est en tout cas ce qui ressort des premiers slides de cette présentation [...]]]></description> <content:encoded><![CDATA[<p>Une des sessions très attendues de ce Devoxx 2009 <em>(avec JEE6)</em> est <a
href="http://www.devoxx.com/display/DV09/JSF+2+and+beyond" title="JSF 20" >JSF 2.0</a>. Beaucoup de spécificités de JSF premier du nom ont découragé de nombreux développeurs. De ce fait, JSF n&#8217;a pas très bonne réputation&#8230; Et il faut rattraper ça ! C&#8217;est en tout cas ce qui ressort des premiers slides de cette présentation avec l&#8217;accroche choc : <em>JSF 2.0 : it is not only us, it is you too !</em></p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2009/11/jsf2_speakers.jpg" border="0" alt="" /></div><p>Car oui : JSF 2.0 annonce la couleur et souhaite faire participer la communauté. Dans cet esprit, les speakers nous présentent le topic twitter <a
href="http://search.twitter.com/search?q=%23jsf2next"  title="JSF2NEXT">#jsf2next</a> pour partager autour des évolutions futures de JSF, souhaitées ou non. Ils enchaînent ensuite avec un trombinoscope de toutes les personnes qui se trouvent <em>derrière</em> JSF 2.0 <em>(on reconnaîtra quelques visages au passage)</em> :</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2009/11/jsf2_many_faces.jpg" border="0" alt="" /></div><p>L&#8217;aspect communautaire sera rappelé tout au long de la session et on sent vraiment que JSF met le paquet pour être apprécié des développeurs. Les speakers insisteront beaucoup sur le tag <code>JSF2.next</code> avec des slides spécifiques pour donner quelques idées internes ou remontées par la communauté pour <em>(déjà)</em> améliorer JSF 2.0.</p><p>La présentation fût découpée en 3 parties : <em>Vue</em>, <em>Contrôleur</em> et <em>Modèle</em> (approximativement 1h pour chaque partie), ce qui nous donne ainsi un bon aperçu de tous les changements de chaque couche du MVC. Une session de <a
href="http://en.wikipedia.org/wiki/Birds_of_a_Feather_%28computing%29" title="BOF" >BOF</a> spéciale <a
href="http://www.devoxx.com/display/DV09/JSF2+and+Beyond" title="JSF 20" >JSF 2.0</a>, qui a eu lieu le soir même, apportera quelques précisions sur certaines fonctionnalités non évoquées lors de la conférence.</p><h3><a
name="Vue"></a>Vue</h3><p>Premier rappel côté <em>Vue</em> et déjà quelques tacles à la gorge : JSP avec ses points faibles <em>(dont certains sont assez discutables&#8230;)</em> :</p><ul><li>la complexité de développer une librairie,</li><li>l&#8217;état <em>stateful</em> des tags qui impose de faire des appels à release sur les objets tags pour les réinitialiser,</li><li>l&#8217;obligation d&#8217;une phase de compilation lors du premier affichage,</li><li>le mélange de la présentation avec la couche métier</li><li>le fait que JSP soit orienté contenu (et non composant).</li></ul><p><em>Facelets</em> arrive ainsi avec ses XHTML tags, <em>stateless</em> par défaut, des librairies plus simples à développer, du templating et plus de compilation Java. Et, première bonne nouvelle pour les fans de <em>Facelets</em>, la librairie est incluse dans la spécification avec les mêmes fonctionnalités et quelques améliorations. Elle inclura aussi <em>Gracelets</em> (Groovy pour JSF / Facelets).<br
/> La présentation se focalise ensuite sur un des points noirs de JSF : la création de composant&#8230; Vous savez, les composants pour lesquels il faut coder un <code>UIComponent</code>, un <code>Renderer</code>, tag/tld, le <em>(ugly)</em> faces-config.xml&#8230;</p><p>La création de composants est simplifiée dans JSF 2.0 : soit en utilisant les annotations et le fichier taglibs.xml (configuration ainsi simplifiée) soit les <em>Composite Components</em>, une des grosses nouveautés de cette version. Nous avons ainsi les tags <code>composite:interface</code> et <code>composite:implementation</code> pour définir le composite et l&#8217;implémentation.</p><p>Ces composites sont accessibles directement dans la webapp ou dans un JAR, avec la possibilité d&#8217;ajouter des <em>listeners</em> et <em>converters</em>, de plugger un <em>resource bundle</em>&#8230;</p><p>L&#8217;Ajax n&#8217;est pas en reste avec un composant embarqué dans JSF 2.0 : <code>jsf.ajax.request()</code>, utilisable par le tag <code>&lt;f:ajax&gt;</code> qui peut-être soit <em>nested</em> soit <em>wrapping</em>.</p><h3><a
name="Contrleur"></a>Contrôleur</h3><p>Comme la plupart des frameworks web du moment (Wicket pour ne citer que lui), JSF 2.0 pourra enfin se targuer de supporter&#8230; GET (pas de sarcasme svp <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ) ! La conséquence directe est que nous allons enfin pouvoir <em>bookmarker</em> nos URLs. Un exemple avant/après :</p><pre class="brush: java; title: ; notranslate">
&lt;h:link outcome=&quot;product&quot; value=&quot;View&quot;&gt;
    &lt;f:param name=&quot;id&quot; value=&quot;#{product.id}&quot; /&gt;
&lt;/h:link&gt;
// qui donnera :
&lt;a href=&quot;/product.jsf ?id=3&quot;&gt;View&lt;/a&gt;
</pre><p>Côté événement, le nouveau <code>SystemEvent</code> fonctionne en mode publish/subscribe avec des événements de type <code>PostAddToViewEvent</code> (après la création du composant) et <code>PreRenderViewEvent</code> (avant le rendering du composant).</p><p>Une autre partie intéressante est la gestion des ressources dans l&#8217;application avec 2 possibilités de récupération selon que la ressource soit présente dans un dossier de la webapp ou dans un JAR :</p><pre class="brush: java; title: ; notranslate">
// Web root
&lt;h:graphicImage name=&quot;hello.png&quot; /&gt;
// Classpath of myimages.jar
&lt;h:graphicImage name=&quot;hello.png&quot; library=&quot;myimages&quot; /&gt;
&lt;h:graphicImage value=&quot;#{resources['myimages:hello.png']}&quot; /&gt;
</pre><h3><a
name="Modle"></a>Modèle</h3><p>Pour la partie modèle, ce sera surtout une présentation des différentes technologies JEE 6 avec leur intégration dans JSF 2.0 : Managed Beans (partie de JSR-316), Contexts and Dependency Injection (JSR-299), Bean-Validation (JSR-303) et JAX-RS (JSR-311).</p><p>Outre les fameuses annotations @Inject (CDI) et @Named (EL), la présentation fera la part belle à Bean-Validation avec l&#8217;ajout d&#8217;une annotation au niveau de notre POJO qui validera côté Data, Business mais surtout, ce qui nous intéresse, Client.</p><p>On se retrouve donc avec les exemples suivants qui sont nativement gérés par JSF 2.0 dans nos pages JSF :</p><pre class="brush: java; title: ; notranslate">
public class User {
   ...
   @NotNull @Size(min=3, max=25)
   public String getUsername() {return username;}
   @NotNull @Email
   public String getEmail() {return email;}
}
</pre><p>Il sera toutefois possible, côté JSF, de désactiver certaines validations, soit par paquet soit au cas par cas.</p><p>A noter une bonne gestion du <code>null</code> dans un champ (<code>null</code> ou String vide) avec la possibilité de valider ou non le champ si une annotation Bean-Validation est présente ou si le <code>context-param</code> suivant est présent :</p><pre class="brush: java; title: ; notranslate">
&lt;context-param&gt;
   &lt;param-name&gt;javax.faces.VALIDATE_EMPTY_FIELDS&lt;/param-name&gt;
   &lt;param-value&gt;true&lt;/param- value &gt;
&lt;/context-param&gt;
</pre><p>Mais, il est aussi possible de forcer le champ vide à <code>null</code> avec le paramètre assez explicite suivant :</p><pre class="brush: java; title: ; notranslate">
&lt;context-param&gt;
   &lt;param-name&gt;javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL&lt;/param-name&gt;
   &lt;param-value&gt;true&lt;/param- value &gt;
&lt;/context-param&gt;
</pre><p>Dernier point abordé, la validation multiple avec plusieurs approches :</p><ul><li>Avant la construction du modèle avec un test de tous les champs sur un événement PostValidateEvent ;</li><li>Après la construction du modèle avec Bean-Validation (mais un objet a déjà été construit&#8230; à vous de vous faire votre idée).</li></ul><h3><a
name="BOF"></a>BOF</h3><p>Au niveau des sujets esquivés en conférence, quid d&#8217;un projet comme Spring Web Flow pour la gestion d&#8217;un flow de page qui est supporté par Seam mais pas par JSF ? Une des réponses est que le projet est plutôt complexe et mériterait peut-être une spécification plus globale pour définir ce qu&#8217;est un flow de page, les événements autour de ce flow&#8230; Il n&#8217;en reste pas moins que JSF 2.0 supporte parfaitement le mode <em>Stateless</em> mais pour l&#8217;instant le <em>Stateful</em> ne l&#8217;est pas&#8230;</p><p>Au niveau des tags ajax embarqués, il devrait être assez simple de brancher un jQuery ou un Script.aculo.us sur JSF 2.0 et profiter d&#8217;une expérience Ajax complète. Reste à voir l&#8217;intégration avec des <em>Composite Components</em>.</p><h3><a
name="Conclusion"></a>Conclusion</h3><p>Une présentation très rythmée avec beaucoup de slides (peut-être trop) qui ne laissent donc que très peu de temps pour la prise de note. Dommage car certains sujets, non évoqués dans cet article, auraient aussi mérité leur place. Mais ce n&#8217;est que partie remise pour un prochain article !</p><p>En tout cas, force est de constater que JSF 2.0 tend vraiment à une simplification d&#8217;utilisation, orienté annotation et zero-XML. Des <code>Composite Component</code> simples à écrire, une intégration gracieuse avec Bean-Validation&#8230; en bref, beaucoup de bons points !</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/11/18/devoxx-jour-1-jsf-2/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Seam : Repenser l&#8217;architecture des applications web ?</title><link>http://blog.xebia.fr/2009/06/03/seam-repenser-larchitecture-des-applications-web/</link> <comments>http://blog.xebia.fr/2009/06/03/seam-repenser-larchitecture-des-applications-web/#comments</comments> <pubDate>Wed, 03 Jun 2009 10:11:04 +0000</pubDate> <dc:creator>Amin Fathallah</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[EJB]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[JPA]]></category> <category><![CDATA[JSF]]></category> <category><![CDATA[Seam]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=2104</guid> <description><![CDATA[Seam est un framework qui permet de simplifier le développement des applications web complexes. Seam utilise la plupart des concepts de la spécification JAVA EE 5 qui vise à faciliter le développement et l&#8217;intégration des applications entreprises. Seam fournit un modèle de composant, une API et des annotations pour faciliter l&#8217;intégration des standards Java EE [...]]]></description> <content:encoded><![CDATA[<p>Seam est un framework qui permet de simplifier le développement des applications web complexes. Seam utilise la plupart des concepts de la spécification JAVA EE 5 qui vise à faciliter le développement et l&#8217;intégration des applications entreprises. Seam fournit un modèle de composant, une API et des annotations pour faciliter l&#8217;intégration des standards Java EE 5 telles que JSF (Java Server Faces), EJB 3, et JPA (Java Persistence API).</p><p>Dans ce billet, nous allons essayer d&#8217;évaluer ce framework en menant une étude comparative entre deux prototypes basés sur le même socle fonctionnel. Un premier prototype en JSF/EJB3/JPA et un deuxième se basant sur le même socle technique mais intégrant Seam. L&#8217;étude va porter sur plusieurs critères tel que la maturité de la solution, la pérennité, la complexité de mise en œuvre, le coût de développement etc.</p><p>Au programme :</p><ul><li><a
href="http://blog.xebia.fr/2009/06/03/seam-repenser-larchitecture-des-applications-web/#PrsentationdeSeam">Présentation de Seam</a></li><li><a
href="http://blog.xebia.fr/2009/06/03/seam-repenser-larchitecture-des-applications-web/#LeprototypeContactBook">Le prototype ContactBook</a></li><li><a
href="http://blog.xebia.fr/2009/06/03/seam-repenser-larchitecture-des-applications-web/#LasolutionJSFEJBJPA">La solution JSF/EJB3/JPA</a></li><li><a
href="http://blog.xebia.fr/2009/06/03/seam-repenser-larchitecture-des-applications-web/#LasolutionSeam">La solution Seam</a></li><li><a
href="http://blog.xebia.fr/2009/06/03/seam-repenser-larchitecture-des-applications-web/#Comparatifdesdeuxsolutions">Comparatif des deux solutions</a><ul><li>Architecture applicative</li><li>Code technique</li><li>Délai et facilité de mise en œuvre</li><li>Solution</li></ul></li><li><a
href="http://blog.xebia.fr/2009/06/03/seam-repenser-larchitecture-des-applications-web/#Conclusion">Conclusion</a></li></ul><h3><a
name="PrsentationdeSeam"></a>Présentation de Seam</h3><p>Seam est un framework JEE 5 dont la première version est sortie en décembre 2005. Il se base essentiellement sur les standards EJB3 et JSF pour construire des applications web. L&#8217;objectif principal de Seam consiste à éliminer la complexité tant au niveau de l&#8217;architecture que de l&#8217;interface de programmation (API). Il se base sur les annotations JDK 1.5 et sur l&#8217;utilisation des POJO conformément à l&#8217;évolution de JAVA EE 5.</p><p>Il offre de nombreuses avantages :</p><ul><li>Meilleure Intégration (JSF/EJB3/JPA).</li><li>Nouveaux contextes : conversation, business process et page.</li><li>Gestion automatique des composants de l&#8217;application.</li><li>Intégration simple des flux de pages.</li><li>Intégration simple de JBoss JBPM.</li><li>Accès distant simplifié.</li></ul><p>Ce framework offre de nombreuses facilités au niveau de la mise en œuvre des applications web, et se présente de plus en plus comme un futur standard. Pour les utilisateurs qui ne sont pas encore prêts à utiliser les EJB, Seam supporte également des classes POJO et des classes Hibernate comme composants.</p><div
align="center"> <a
href="http://blog.xebia.fr/wp-content/uploads/2009/06/archi.png"><img
src="http://blog.xebia.fr/wp-content/uploads/2009/06/archi-300x104.png" alt="archi" title="archi" width="300" height="104" class="alignright size-medium wp-image-2114" /></a></div><p>Nous allons essayer de vérifier la pertinence des éléments avancées par les créateurs de Seam en menant une étude comparative entre deux prototypes, un se basant sur les EJB3 et JSF et un se basant sur le même socle technique mais utilisant Seam comme framework d&#8217;intégration des deux technologies.<br
/> Pour ceux qui veulent se documenter plus n&#8217;hésitez pas à <a
href="ftp://ftp-developpez.com/valtech/articles/java/javaee/jboss/seam/Jboss-Seam.pdf" title="consulter le billet suivant" >consulter le billet suivant</a>.</p><h3><a
name="LeprototypeContactBook"></a>Le prototype ContactBook</h3><p>Le prototype ContactBook est une application web de gestion des contacts. Son périmètre fonctionnel couvre les fonctionnalités essentielles d&#8217;une application de gestion. Ces fonctionnalités sont réparties en deux domaines :</p><ul><li>Gestion des utilisateurs.</li><li>Gestion des contacts.</li></ul><p>ContactBook est une application web relativement simple. Elle permet à un utilisateur de gérer ses contacts. Chaque utilisateur répond à un profil (nom, prénom, adresse mail et  numéro de téléphone). Chaque utilisateur doit s&#8217;identifier auprès du système pour utiliser l&#8217;application ContactBook.</p><p>ContactBook est une application internationale. Un utilisateur doit pouvoir choisir sa langue « de travail ». Un mécanisme de changement de gestion multilingue est donc proposé à l&#8217;utilisateur. Deux langues sont proposées : l&#8217;anglais et le français. La langue par défaut est le français.</p><h3><a
name="LasolutionJSFEJBJPA"></a>La solution JSF/EJB3/JPA</h3><p>cette solution se base sur une architecture 3 tiers avec jsf pour la couche présentation, ejb3 pour la couche métier et jpa pour la couche des données.<div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2009/06/archit_ejb3_jsf.png" border="0" alt="" /></div><p>La couche présentation est constituée d&#8217;un ensemble de composants JSF. Les JSF Backing Beans ou les Managed Beans sont utilisés pour faire le lien entre la couche présentation et la couche métier, ils permettent ainsi de récupérer les données saisies par les utilisateurs, les valider et les véhiculer à la couche métier. La couche métier est un ensemble de composants EJB session qui encapsulent le logique métier de l&#8217;application. Les EJB entités représentent le modèle des données. Ceux-ci seront directement persistés dans la base de données grâce à l&#8217;api de persistance utilisée.</p><h3><a
name="LasolutionSeam"></a>La solution Seam</h3><p>Cette solution se base sur les mêmes composants que l&#8217;architecture précédente mais utilise Seam comme framework d&#8217;intégration des différentes frameworks et technologies utilisés dans le projet.<div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2009/06/archi_jbs.png" border="0" alt="" /></div><p>La couche présentation est constituée d&#8217;un ensemble de composants JSF. Les EJB session jouent un double rôle puisqu&#8217;ils permettent l&#8217;échange des données entre la couche présentation et la couche métier, la validation des données, et la gestion des transactions et des sessions des utilisateurs. Les EJB entités représentent le modèle des données. Ceux-ci seront directement persistés dans la base de données grâce à l&#8217;api de persistance utilisée.</p><h3><a
name="Comparatifdesdeuxsolutions"></a>Comparatif des deux solutions</h3><h4>Architecture applicative</h4><p>Pour commencer, nous allons mener une comparaison au niveau de l&#8217;architecture applicative des deux solutions proposées :</p><table
cellspacing="0" cellpadding="5" style="border: 1px solid black"><tr><td
bgcolor="#663366" style="color: #ffffff; border: 1px solid black"><strong>Critère</strong></td><td
bgcolor="#663366" style="color: #ffffff; border: 1px solid black"><strong>JSF/EJB3/JPA</strong></td><td
bgcolor="#663366" style="color: #ffffff; border: 1px solid black"><strong>Seam</strong></td></tr><tr><td
style="border: 1px solid black"> <strong>Réutilisation des composants</strong></td><td
style="border: 1px solid black"> 3</td><td
style="border: 1px solid black"> 1</td></tr><tr><td
style="border: 1px solid black"> <strong>Facilité de mise en œuvre</strong></td><td
style="border: 1px solid black"> 2</td><td
style="border: 1px solid black"> 3</td></tr><tr><td
style="border: 1px solid black"> <strong>Intégration des composants déjà mis en place</strong></td><td
style="border: 1px solid black"> 4</td><td
style="border: 1px solid black"> 1</td></tr><tr><td
style="border: 1px solid black"> <strong>Investissement nécessaire</strong></td><td
style="border: 1px solid black"> 1</td><td
style="border: 1px solid black"> 3</td></tr><tr><td
style="border: 1px solid black"> <strong>Intégration avec d&#8217;autres technologies</strong></td><td
style="border: 1px solid black"> 1</td><td
style="border: 1px solid black"> 3</td></tr><tr><td
style="border: 1px solid black"> <strong>Evolutivité de l&#8217;architecture</strong></td><td
style="border: 1px solid black"> 3</td><td
style="border: 1px solid black"> 1</td></tr></table><p><em>Notation : Faible(1), Moyen(2), Élevé(3), Excellent(4)</em></p><p>Les dépendances introduites dans le code technique par Seam, ainsi que le modèle d&#8217;architecture imposé par ce framework rend la <strong>réutilisation de ses composants</strong> très faible par rapport aux composants sans Seam qui sont réutilisables dans l&#8217;état.</p><p>Seam couvre la plupart des besoins techniques liés au développement d&#8217;une application web, ce qui permet de <strong>simplifier le développement</strong> avec JEE5. Seam fournit aussi des outils pour faciliter la vie des développeurs. Sans Seam les développeurs doivent prendre en charge tout les problèmes liés à l&#8217;intégration des différentes briques JEE5.</p><p>Il est plus difficile d&#8217;<strong>intégrer des composants réutilisables</strong> dans une application Seam, car il faut les convertir en composants Seam. Sans Seam nous avons moins de contraintes pour intégrer des composants réutilisables dans l&#8217;application.</p><p>Seam est un framework complexe qui nécessite un grand cout d&#8217;entrée, mais qui permet de résoudre beaucoup de problèmes liés à l&#8217;<strong>intégration des différents frameworks</strong> du marché. Seam nous facilite la tâche en s&#8217;intégrant parfaitement avec plusieurs frameworks et implémentations des spécifications JEE5 (EJB3, JSF, Spring, GWT, IceFaces &#8230;).</p><p>L&#8217;<strong>architecture de la solution Seam est moins souple</strong> que l&#8217;architecture de la solution JSF/EJB3/JPA, c&#8217;est à la fois un avantage et un inconvénient. Un avantage car il y a moins de problèmes à résoudre lors de l&#8217;implémentation de la solution. Un inconvénient car le choix de Seam peut être impactant par la suite.  Par exemple il serait difficile de passer de JSF à un autre framework web qui n&#8217;est pas pris en charge par Seam, Ce qui freine l&#8217;évolutivité à long terme.</p><h4>Code technique</h4><p>Pour voir l&#8217;apport de l&#8217;intégration de Seam sur le code technique, nous avons utilisés le plugin Metrics pour calculer quelques<br
/> métriques :</p><table
cellspacing="0" cellpadding="5" style="border: 1px solid black"><tr><td
bgcolor="#663366" style="color: #ffffff; border: 1px solid black"><strong>Critère</strong></td><td
bgcolor="#663366" style="color: #ffffff; border: 1px solid black"><strong>JSF/EJB3/JPA</strong></td><td
bgcolor="#663366" style="color: #ffffff; border: 1px solid black"><strong>Seam</strong></td></tr><tr><td
style="border: 1px solid black"> <strong>Nombre de classes</strong></td><td
style="border: 1px solid black"> 20</td><td
style="border: 1px solid black"> 12</td></tr><tr><td
style="border: 1px solid black"> <strong>Nombre d&#8217;interfaces</strong></td><td
style="border: 1px solid black"> 7</td><td
style="border: 1px solid black"> 5</td></tr><tr><td
style="border: 1px solid black"> <strong>Nombre de méthodes</strong></td><td
style="border: 1px solid black"> 259</td><td
style="border: 1px solid black"> 138</td></tr><tr><td
style="border: 1px solid black"> <strong>Nombre de méthodes statiques</strong></td><td
style="border: 1px solid black"> 3</td><td
style="border: 1px solid black"> 1</td></tr><tr><td
style="border: 1px solid black"> <strong>Nombre d&#8217;attributs des méthodes</strong></td><td
style="border: 1px solid black"> 104</td><td
style="border: 1px solid black"> 82</td></tr><tr><td
style="border: 1px solid black"> <strong>Nombre de fichiers XML</strong></td><td
style="border: 1px solid black"> 5</td><td
style="border: 1px solid black"> 7</td></tr><tr><td
style="border: 1px solid black"> <strong>Nombre de lignes XML</strong></td><td
style="border: 1px solid black"> 177</td><td
style="border: 1px solid black"> 246</td></tr><tr><td
style="border: 1px solid black"> <strong>Nombre total de lignes de code</strong></td><td
style="border: 1px solid black"> 1605</td><td
style="border: 1px solid black"> 1080</td></tr></table><p>Nous avons constaté que l&#8217;intégration de Seam a permis de réduire considérablement la quantité du code technique. Comme il n&#8217;y a pas de distinction entre un composant backing bean et un composant Seam. Une page JSF peut donc invoquer directement un composant Seam sans passer par un backing bean ce qui permet de supprimer le code technique des backing beans.</p><p>Seam fournit aussi des annotations pour  JSF, le cycle de vie des composants, les exceptions, l&#8217;asynchronicité, le databinding, l&#8217;intégration avec plusieurs apis du monde JEE etc. Ces annotations permettent de produire un code élégant et très compact. Beaucoup prétendent que l&#8217;utilisation de Seam ne nécessite pas de configuration XML ce qui est faux, l&#8217;intégration des briques et des apis tierces avec Seam nécessitent leurs propres configurations.</p><p>Seam est un framework très productif qui permet de réduire considérablement la quantité du code technique nécessaire pour développer une application web mais les dépendances introduites par Seam rend le code technique difficile à maintenir et difficilement réutilisable sans Seam.</p><h4>Délai et facilité de mise en œuvre</h4><p>Cette comparaison va nous permettre de comparer les deux prototypes au niveau de la mise en œuvre :</p><table
cellspacing="0" cellpadding="5" style="border: 1px solid black"><tr><td
bgcolor="#663366" style="color: #ffffff; border: 1px solid black"><strong>Critère</strong></td><td
bgcolor="#663366" style="color: #ffffff; border: 1px solid black"><strong>JSF/EJB3/JPA</strong></td><td
bgcolor="#663366" style="color: #ffffff; border: 1px solid black"><strong>Seam</strong></td></tr><tr><td
style="border: 1px solid black"> <strong>Durée totale du projet en <em>jours/homme</em></strong></td><td
style="border: 1px solid black"> 21</td><td
style="border: 1px solid black"> 15</td></tr><tr><td
style="border: 1px solid black"> <strong>Préparation du projet</strong></td><td
style="border: 1px solid black"> 4</td><td
style="border: 1px solid black"> 1</td></tr><tr><td
style="border: 1px solid black"> <strong>Configuration</strong></td><td
style="border: 1px solid black"> 5</td><td
style="border: 1px solid black"> 3</td></tr><tr><td
style="border: 1px solid black"> <strong>Mise en œuvre</strong></td><td
style="border: 1px solid black"> 4</td><td
style="border: 1px solid black"> 2</td></tr></table><p><em>Notation : Très Facile (1), Facile (2), Moyen (3), Difficile (4), Très difficile(5)</em></p><p>La préparation du projet Seam est très simple car nous avons utilisés l&#8217;outil seam-gen pour générer la structure du projet avec des exemples de code fonctionnel. Avec Seam, la configuration est fournie dans le projet générée avec seam-gen ce qui n&#8217;est pas le cas dans le projet EJB3-JSF. La cohabitation des différentes briques JEE est prise en charge par Seam. Les backing beans n&#8217;existent plus, les pages JSF invoquent directement les composants Seam. Sans Seam, il faut coder tout les backing beans et les mapper avec les pages JSF. C&#8217;est un cout de développement de plus pour les développeurs. Néanmoins, il ne faut pas oublier que Seam introduit ses propres dépendances dans votre code ce qui le rend moins évolutif et difficilement réutilisable dans d&#8217;autres projets qui n&#8217;utilisent pas Seam.</p><h4>Solution</h4><p>Pour comparer les deux solutions développées, nous allons nous baser sur des critères spécifiques aux frameworks de présentation et des critères généraux :</p><p><strong>La solution JSF/EJB3/JPA</strong></p><table
cellspacing="0" cellpadding="5" style="border: 1px solid black"><tr><td
bgcolor="#663366" style="color: #ffffff; border: 1px solid black"><strong>Fonctionnalité</strong></td><td
bgcolor="#663366" style="color: #ffffff; border: 1px solid black"><strong>Oui/Non +/-</strong></td><td
bgcolor="#663366" style="color: #ffffff; border: 1px solid black"><strong>Description</strong></td><td
bgcolor="#663366" style="color: #ffffff; border: 1px solid black"><strong>Commentaires</strong></td></tr><tr><td
colspan="4" style="border: 1px solid black"> <strong>Critères spécifiques aux frameworks de présentation</strong></td></tr><tr><td
style="border: 1px solid black"> <strong>Validation des données</strong></td><td
style="border: 1px solid black"> Oui</td><td
style="border: 1px solid black"> JSF Validator</td><td
style="border: 1px solid black"> Solution éprouvée</td></tr><tr><td
style="border: 1px solid black"> <strong>Toolbox interface graphique</strong></td><td
style="border: 1px solid black"> Oui</td><td
style="border: 1px solid black"> Taglibs JSF</td><td
style="border: 1px solid black"> Solution éprouvée</td></tr><tr><td
style="border: 1px solid black"> <strong>Multi-langue</strong></td><td
style="border: 1px solid black"> Oui</td><td
style="border: 1px solid black"> Support i18n standard</td><td
style="border: 1px solid black"> Solution éprouvée</td></tr><tr><td
style="border: 1px solid black"> <strong>Implémentation MVC</strong></td><td
style="border: 1px solid black"> Oui</td><td
style="border: 1px solid black"></td><td
style="border: 1px solid black"> Solution éprouvée</td></tr><tr><td
style="border: 1px solid black"> <strong>Modèle événementiel</strong></td><td
style="border: 1px solid black"> Non</td><td
style="border: 1px solid black"></td><td
style="border: 1px solid black"></td></tr><tr><td
colspan="4" style="border: 1px solid black"> <strong>Critères généraux</strong></td></tr><tr><td
style="border: 1px solid black"> <strong>Maturité</strong></td><td
style="border: 1px solid black"> +</td><td
style="border: 1px solid black"></td><td
style="border: 1px solid black"> Standards JEE5.0</td></tr><tr><td
style="border: 1px solid black"> <strong>Evolutivité</strong></td><td
style="border: 1px solid black"> +</td><td
style="border: 1px solid black"></td><td
style="border: 1px solid black"> Architecture ouverte et flexible</td></tr><tr><td
style="border: 1px solid black"> <strong>Complexité de mise en œuvre</strong></td><td
style="border: 1px solid black"> &#8211;</td><td
style="border: 1px solid black"></td><td
style="border: 1px solid black"> Assez complexe à mettre en œuvre</td></tr><tr><td
style="border: 1px solid black"> <strong>Cout de développement</strong></td><td
style="border: 1px solid black"> -&nbsp;-</td><td
style="border: 1px solid black"></td><td
style="border: 1px solid black"> Couteux en temps de développement</td></tr><tr><td
style="border: 1px solid black"> <strong>Cout de maintenance</strong></td><td
style="border: 1px solid black"> -&nbsp;-</td><td
style="border: 1px solid black"></td><td
style="border: 1px solid black"> Couteux en maintenance</td></tr></table><p><strong>La solution Seam</strong></p><table
cellspacing="0" cellpadding="5" style="border: 1px solid black"><tr><td
bgcolor="#663366" style="color: #ffffff; border: 1px solid black"><strong>Fonctionnalité</strong></td><td
bgcolor="#663366" style="color: #ffffff; border: 1px solid black"><strong>Oui/Non +/-</strong></td><td
bgcolor="#663366" style="color: #ffffff; border: 1px solid black"><strong>Description</strong></td><td
bgcolor="#663366" style="color: #ffffff; border: 1px solid black"><strong>Commentaires</strong></td></tr><tr><td
colspan="4" style="border: 1px solid black"> <strong>Critères spécifiques aux frameworks de présentation</strong></td></tr><tr><td
style="border: 1px solid black"> <strong>Validation des données</strong></td><td
style="border: 1px solid black"> Oui</td><td
style="border: 1px solid black"> Hibernate Validator</td><td
style="border: 1px solid black"> Solution éprouvée</td></tr><tr><td
style="border: 1px solid black"> <strong>Toolbox interface graphique</strong></td><td
style="border: 1px solid black"> Oui</td><td
style="border: 1px solid black"> Taglibs JSF et librairies Seam</td><td
style="border: 1px solid black"> Solution éprouvée</td></tr><tr><td
style="border: 1px solid black"> <strong>Multi-langue</strong></td><td
style="border: 1px solid black"> Oui</td><td
style="border: 1px solid black"> Support i18n standard</td><td
style="border: 1px solid black"> Solution éprouvée</td></tr><tr><td
style="border: 1px solid black"> <strong>Implémentation MVC</strong></td><td
style="border: 1px solid black"> Oui</td><td
style="border: 1px solid black"></td><td
style="border: 1px solid black"> Solution éprouvée</td></tr><tr><td
style="border: 1px solid black"> <strong>Modèle événementiel</strong></td><td
style="border: 1px solid black"> Non</td><td
style="border: 1px solid black"></td><td
style="border: 1px solid black"></td></tr><tr><td
colspan="4" style="border: 1px solid black"> <strong>Critères généraux</strong></td></tr><tr><td
style="border: 1px solid black"> <strong>Maturité</strong></td><td
style="border: 1px solid black"> -&nbsp;-</td><td
style="border: 1px solid black"></td><td
style="border: 1px solid black"> Forums légers</td></tr><tr><td
style="border: 1px solid black"> <strong>Evolutivité</strong></td><td
style="border: 1px solid black"> -&nbsp;-</td><td
style="border: 1px solid black"></td><td
style="border: 1px solid black"> Très dépendant de l&#8217;évolution du framework</td></tr><tr><td
style="border: 1px solid black"> <strong>Complexité de mise en œuvre</strong></td><td
style="border: 1px solid black"> +</td><td
style="border: 1px solid black"></td><td
style="border: 1px solid black"> Assez facile à mettre en œuvre</td></tr><tr><td
style="border: 1px solid black"> <strong>Cout de développement</strong></td><td
style="border: 1px solid black"> +&nbsp;+</td><td
style="border: 1px solid black"></td><td
style="border: 1px solid black"> Framework très productif</td></tr><tr><td
style="border: 1px solid black"> <strong>Cout de maintenance</strong></td><td
style="border: 1px solid black"> &#8211;</td><td
style="border: 1px solid black"></td><td
style="border: 1px solid black"> Assez couteux en maintenance</td></tr></table><h3><a
name="Conclusion"></a>Conclusion</h3><p>Seam permet d&#8217;effondrer les couches artificielles entre la couche présentation et la couche métier. Il permet ainsi de rapprocher les composants métiers de la couche web.</p><p>Dans la solution JSF/EJB3/JPA, il est nécessaire d&#8217;utiliser des backing beans JSF pour lier la couche présentation à la couche métier. En Seam il n&#8217;y a plus de couches d&#8217;intégration, mais il faut voir les choses autrement car Seam s&#8217;appuie sur une architecture 2 tiers. Lorsque l&#8217;on a plusieurs niveaux, il est préférable de les séparer en plusieurs couches pour avoir une meilleure visibilité du code et une séparation des responsabilités. Un autre problème réside dans le fait que Seam introduit une forte dépendance entre les différentes couches de l&#8217;application.</p><p>Seam a apporté une vraie valeur ajoutée à notre projet JSF/EJB3/JPA et nous a permis de gagner en productivité. Toutefois, le modèle d&#8217;architecture imposé par Seam et les dépendances techniques introduites dans nos briques nous laissent à réfléchir, mais il reste une solution très envisageable pour développer des applications entreprises.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/06/03/seam-repenser-larchitecture-des-applications-web/feed/</wfw:commentRss> <slash:comments>6</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/12/29/revue-de-presse-xebia-89/</link> <comments>http://blog.xebia.fr/2008/12/29/revue-de-presse-xebia-89/#comments</comments> <pubDate>Mon, 29 Dec 2008 17:28:02 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[AppFuse]]></category> <category><![CDATA[Flex]]></category> <category><![CDATA[JPA]]></category> <category><![CDATA[JSF]]></category> <category><![CDATA[QA]]></category> <category><![CDATA[Seam]]></category> <category><![CDATA[Sonar]]></category> <category><![CDATA[Spring]]></category> <category><![CDATA[Tapestry]]></category> <category><![CDATA[Web Beans]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=1194</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposé par Xebia. Le coin de la technique Sonar en version 1.5 Version finale de Tapestry 5 Première implémentation de la JSR 299 : Web Beans RI 1.0.0.ALPHA1 Evènements de notre communauté en France et à l&#8217;étranger JavaLobby fait une restrospective des articles les plus lus en [...]]]></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/J2EE hebdomadaire proposé par Xebia.</em></p><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/12/29/revue-de-presse-xebia-89/#Sonarenversion">Sonar en version 1.5</a></li><li><a
href="http://blog.xebia.fr/2008/12/29/revue-de-presse-xebia-89/#VersionfinaledeTapestry">Version finale de Tapestry 5</a></li><li><a
href="http://blog.xebia.fr/2008/12/29/revue-de-presse-xebia-89/#PremireimplmentationdelaJSRWeb">Première implémentation de la JSR 299 : Web Beans RI 1.0.0.ALPHA1</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/12/29/revue-de-presse-xebia-89/#JavaLobbyfaitunerestrospective">JavaLobby fait une restrospective des articles les plus lus en 2008</a></li></ul><h3><a
name="Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="Sonarenversion"></a>Sonar en version 1.5</h4><p>SonarSource (spin off de la société Hortis dédiée au développement et au support de Sonar) a annoncé la sortie de la nouvelle version de Sonar.<br
/> Comme déjà présenté plus <a
title="en dtail sur ce blog" href="http://blog.xebia.fr/2008/10/29/controles-de-qualite-avec-sonar/">en détail sur ce blog</a>, Sonar est un outil open source qui collecte, consolide et présente les données Qualité d&#8217;un projet.<br
/> Dans les nouvelles fonctionnalités, il est à noter une volonté d&#8217;ouverture de l&#8217;API :</p><ul><li>Récupération des mesures à partir de services REST.</li><li>Possibilité d&#8217;écrire ses propres extensions via des plugins de collecte <em>(voir le tutorial</em> <a
title="ici" href="http://docs.codehaus.org/display/SONAR/Plugin+tutorial"><em>ici</em></a>).</li></ul><p>Des présentations graphiques des métriques et de l&#8217;évolution dans le temps ont été ajoutés :</p><ul><li>Suivi des règles sous forme de radar.</li><li>Couverture de code présenté en nuages de classe.</li><li>Amélioration de l&#8217;affichage des graphiques d&#8217;évolution du respects des règles <em>(Time machine)</em>.</li></ul><p>L&#8217;intégration avec les outils open source utilisés lors des collectes est aussi améliorée :</p><ul><li>Ajout des règles Findbugs portant à 600 le nombre de règles de codes contrôlables <em>(de la simple règle de nommage à l&#8217;anti-pattern)</em>.</li><li>Mise à jour des versions des plugins PMD et Clover.</li></ul><p>La release s&#8217;accompagne aussi de son lot de corrections de bugs.<br
/> Pour plus de détails, voir la <a
title="release note complte" href="http://sonar.codehaus.org/downloads/#1.5">release note complète</a>.</p><p>Sonar, avec cette nouvelle version, se positionne encore plus comme un incontournable dans la présentation de données liées à la qualité, loin devant le dashboard Maven.<br
/> De plus, la roadmap présentée <a
title="sur le site de Sonar" href="http://sonar.codehaus.org/roadmap/">sur le site de Sonar</a> propose des fonctionnalités intéressantes comme le regroupement de projets, le positionnement d&#8217;alerte sur indicateurs ou encore l&#8217;association de règles différentes selon les projets &#8230;</p><h4><a
name="VersionfinaledeTapestry"></a>Version finale de Tapestry 5</h4><p>Comme nous l&#8217;a fait remarquer un de nos lecteurs, <a
title="François Armand" href="http://fanf42.blogspot.com/">François Armand</a>, <a
title="Tapestry 50 est actuellement disponible en version finale" href="http://www.theserverside.com/news/thread.tss?thread_id=52462">Tapestry 5.0 est actuellement disponible en version finale</a>.</p><p>Tapestry 5 a nécessité près de 3 ans de développement afin d&#8217;avoir les améliorations suivantes (par rapport à la version 4) :</p><ul><li>Amélioration du modèle de programmation de Tapestry afin de pouvoir développer des composants &laquo;&nbsp;Tapestry&nbsp;&raquo; sous forme de classe POJO</li><li>Moins de configuration par XML, et plus de conventions de nommage (<a
title="principe de CoC Convention over Configuration" href="http://en.wikipedia.org/wiki/Convention_over_Configuration">principe de CoC, Convention over Configuration</a>), utilisation des nouveautés du langage Java 5 (annotation)</li><li>Amélioration de la productivité des développements avec la recharge à chaud des classes Java en cours de développement.</li></ul><p>Le rechargement à chaud de classe permet de ne plus avoir un cycle de développement suivant :</p><ul><li>Modification.</li><li>Compilation de l&#8217;application.</li><li>Packaging de l&#8217;application.</li><li>Déploiement de l&#8217;application.</li><li>Démarrage de l&#8217;application.</li><li>Test de l&#8217;application.</li></ul><p>Le cycle de développement suivant permet d&#8217;être plus productif car beaucoup plus court que le précédent :</p><ul><li>Modification d&#8217;une classe.</li><li>Compilation de la classe.</li><li>Rechargement de la classe dans le <em>Classloader</em> de l&#8217;application sans le redemarrage de l&#8217;application.</li><li>Test de l&#8217;application.</li></ul><p>Pour plus d&#8217;informations sur l&#8217;intérêt d&#8217;un cycle de développement allégé, je vous invite à découvrir ou redécouvrir l&#8217;article à propos de <a
title="JavaRebel" href="http://blog.xebia.fr/2008/11/14/javarebel/">JavaRebel</a>.</p><p>Je vous propose aussi à lire le <a
title="commentaire de Franois sur notre blog" href="http://blog.xebia.fr/2008/12/22/revue-de-presse-xebia-88/#comment-9698">commentaire de François sur notre blog</a>, qui fait un tour d&#8217;horizon et un retour d&#8217;expérience sur Tapestry. Encore une fois, merci François.</p><p>Matt Raible (Raible Design) avec l&#8217;aide de Serge Eby, ont mis à jour <a
title="AppFuse" href="http://appfuse.org/display/APF/Home">AppFuse</a> afin d&#8217;intégrer Tapestry 5. Ils notent d&#8217;ailleurs ce qu&#8217;ils apprécient dans Tapestry 5 : la configuration, qui est minimale, ainsi que les URLs claires. Pour plus d&#8217;informations sur AppFuse, voici une présentation du plugin : <a
title="AppFuse par lexemple" href="http://blog.xebia.fr/2008/09/18/appfuse-par-lexemple/">AppFuse par l&#8217;exemple</a>.</p><h4><a
name="PremireimplmentationdelaJSRWeb"></a>Première implémentation de la JSR 299 : Web Beans RI 1.0.0.ALPHA1</h4><p>A plusieurs reprises dans cette revue de presse, nous avons parlé de la spécification JSR 299, baptisée WebBeans :</p><ul><li><a
title="JSR299  Web Beans disponible en Public Review Draft" href="http://blog.xebia.fr/2008/11/10/revue-de-presse-xebia-82/#JSRWebBeansdisponibleenPublicR">JSR-299 : Web Beans disponible en Public Review Draft</a>.</li><li><a
title="Seam 3  les futures orientations de Seam" href="http://blog.xebia.fr/2008/11/24/revue-de-presse-xebia-84/#SeamlesfuturesorientationsdeSe">Seam 3 : les futures orientations de Seam</a>.</li></ul><p>Sur la <a
title="page consacrée à WebBeans" href="http://seamframework.org/WebBeans">page consacrée à WebBeans</a> sur le site de <a
title="Seam Framework" href="http://seamframework.org">Seam Framework</a>, une release de WebBeans est maintenant disponible : <a
title="Web Beans 1.0.0.ALPHA1 released!" href="http://in.relation.to/Bloggers/WebBeans100ALPHA1Released">Web Beans 1.0.0.ALPHA1 released!</a>.</p><p>Pour être plus précis sur l&#8217;avenir conjoint de Seam et WebBeans : Seam ne va pas devenir WebBeans. Il y aura un noyau WebBeans, et Seam utilisera ce noyau.</p><p>Le noyau WebBeans prend en charge le contexte de gestion de composants &laquo;&nbsp;WebBeans&nbsp;&raquo; ainsi que les mécanismes d&#8217;injection de dépendance.</p><p>Ainsi Seam embarquera ces propres fonctionnalités :</p><ul><li>Seam Security.</li><li>Rendu PDF / mail.</li><li>Intégration de moteur de workflow <em>(JBPM)</em>.</li><li>etc &#8230;</li></ul><p>Cette release est une première étape importante afin d&#8217;achever cette spécification JSR 299 avec une implémentation et sa documentation.<br
/> Cette première release vous permettra peut être d&#8217;avoir les idées plus claires sur cette spécification.</p><h3><a
name="EvnementsdenotrecommunautenFra"></a>Evènements de notre communauté en France et à l&#8217;étranger</h3><h4><a
name="JavaLobbyfaitunerestrospective"></a>JavaLobby fait une restrospective des articles les plus lus en 2008</h4><p>JavaLobby fait le bilan de l&#8217;année 2008 en nous montrant <a
title="les 10 articles les plus lus ces 12 derniers mois" href="http://java.dzone.com/articles/javalobbys-top-10-articles-200">les 10 articles les plus lus ces 12 derniers mois</a>. En tête, l&#8217;interview de John de Goes président de <a
title="NBRAIN" href="http://www.n-brain.net/">N-BRAIN</a> qui avoue que les produits open source deviennent de redoutables concurrents et annonce le passage en open source de leur plateforme UNA.<br
/> Rick Hightower dont l&#8217;un des articles fait partie du top 10 nous fait remarquer dans un commentaire la répartition des résultats en fonction des frameworks.<br
/> Voici le résultat :</p><ul><li>deux articles sur JSF dans le top 5 montrent que JSF a toujours le vent en poupe. L&#8217;un de ces articles parle d&#8217;ailleurs de <a
title="linterfaage JSFFlex" href="http://java.dzone.com/articles/using-jsf-and-flex-components-?mz=3006-jboss">l&#8217;interfaçage JSF/Flex</a>.</li><li>deux articles sur JPA/Hibernate</li><li>un article sur Spring.</li></ul><p>Rick Hightower nous précise aussi que les résultats ne prennent pas en compte l&#8217;âge des articles. En effet la majorité de ces articles a été publiée avant le mois de Mai.<br
/> Globalement, il est intéressant de voir que les frameworks tels JSF et JPA sont toujours aussi populaires et qu&#8217;ils intéressent toujours autant les lecteurs.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2008/12/29/revue-de-presse-xebia-89/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>AppFuse par l&#8217;exemple</title><link>http://blog.xebia.fr/2008/09/18/appfuse-par-lexemple/</link> <comments>http://blog.xebia.fr/2008/09/18/appfuse-par-lexemple/#comments</comments> <pubDate>Thu, 18 Sep 2008 09:37:14 +0000</pubDate> <dc:creator>Aurélien Maury</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[AppFuse]]></category> <category><![CDATA[Hibernate]]></category> <category><![CDATA[JSF]]></category> <category><![CDATA[Maven]]></category> <category><![CDATA[Spring]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=681</guid> <description><![CDATA[Les IDE d&#8217;antan &#8211; on pense tout particulièrement au vénérable JBuilder &#8211; proposaient un ensemble de &#171;&#160;wizards&#160;&#187;, permettant de générer en quelques clics le squelette de classes, de composants voir d&#8217;applications complètes. Rien à voir, bien sûr, avec les ambitions démesurées du MDA : les wizards se contentaient de générer un ensemble de sources plus [...]]]></description> <content:encoded><![CDATA[<p>Les IDE d&#8217;antan &#8211; on pense tout particulièrement au vénérable JBuilder &#8211; proposaient un ensemble de &laquo;&nbsp;wizards&nbsp;&raquo;, permettant de générer en quelques clics le squelette de classes, de composants voir d&#8217;applications complètes. Rien à voir, bien sûr, avec les ambitions démesurées du MDA : les wizards se contentaient de générer un ensemble de sources plus ou moins prêtes à l&#8217;emploi dans l&#8217;objectif d&#8217;accélérer certaines tâches de développement répétitives et peu valorisantes. Ruby on Rails a remis cette approche au goût du jour, et l&#8217;a baptisé du nom barbare de &laquo;&nbsp;<a
title="scaffolding" href="http://en.wikipedia.org/wiki/Scaffold_(programming)">scaffolding</a>&laquo;&nbsp;.</p><p>Le scaffolding fait le bonheur des rubyistes en leur permettant, au prix de l&#8217;exécution de quelques lignes de commandes, de disposer d&#8217;une application web opérationnelle, autorisant la manipulation élémentaire des données de leur modèle au travers d&#8217;écrans de saisie et de listes &#8211; charge au développeur d&#8217;enrichir ensuite le code généré pour implémenter un comportement plus sophistiqué.</p><p>Le projet <a
title="AppFuse" href="http://appfuse.org/display/APF/Home">AppFuse</a>, aujourd&#8217;hui dans sa version 2.0, s&#8217;appuie sur les archétypes Maven 2 pour offrir aux développeurs Java des fonctionnalités équivalentes. Dans cet article, nous vous proposons une introduction par l&#8217;exemple à AppFuse.</p><h3><a
name="Mavenrappels"></a>Maven : rappels</h3><p>Pour ceux qui ne sont pas encore familiers avec Maven, voici quelques rappels de base pour pouvoir suivre cet article.</p><p>Maven est un outil open-source de build pour les projets Java. Il a été conçu pour simplifier les tâches difficiles du processus de build. Maven offre la possibilité de démarrer un projet en utilisant des squelettes d&#8217;application. Ces squelettes, dans la terminologie Maven, sont appelés &laquo;&nbsp;archétypes&nbsp;&raquo;. Grâce à eux, une ligne de commande permet de démarrer avec une hiérarchie de répertoire standardisée (sources, resources, builds).</p><p>Tous les archétypes Maven comportent un fichier &laquo;&nbsp;pom.xml&nbsp;&raquo; contenant toutes les directives de construction du projet, ses dépendances et différents plugins accessibles. Les plugins Maven couvrent, entre autres, des outils d&#8217;analyse de code, de formatage et de génération de rapport.</p><p>Pour plus d&#8217;informations sur ces notions, je vous conseille de jeter un oeil sur les sites suivants :</p><ul><li>Maven : <a
href="http://maven.apache.org/">http://maven.apache.org/</a></li><li>Plugin d&#8217;intégration Maven/Eclipse : <a
href="http://m2eclipse.codehaus.org/">http://m2eclipse.codehaus.org/</a></li><li>Mojo Project (plugins Maven) : <a
href="http://mojo.codehaus.org/">http://mojo.codehaus.org/</a></li></ul><h3><a
name="AppFuse"></a>AppFuse</h3><h4><a
name="Concept"></a>Concept</h4><p>Initialement créé par Matt Raible, AppFuse est un projet open source pour développer des applications web J2EE. Il permet aux développeurs de démarrer rapidement et facilement en utilisant des technologies open-source telles que Spring, Hibernate et différents frameworks web (Struts2, Spring MVC, Tapestry, &#8230;).</p><p>AppFuse est un ensemble de scripts de génération de code permettant de faire le travail le plus pénible très rapidement, typiquement les écrans <a
title="CRUD" href="http://fr.wikipedia.org/wiki/CRUD">CRUD</a> (Create, Read, Update, Delete) de votre modèle de données.</p><h4><a
name="Utilisation"></a>Utilisation</h4><p>Initialement conçu avec Ant, Appfuse s&#8217;appuie, depuis sa version 2, sur Maven via des archétypes et des plugins de génération de code.</p><p><strong><a
name="ArchtypesMaven"></a>Archétypes Maven</strong></p><p>Les différents archétypes fournis par le projet AppFuse couvrent différents frameworks Web, couplés avec Hibernate et Spring :</p><ul><li><a
title="JSF" href="http://mbaron.ftp-developpez.com/javaee/jsf.pdf">JSF</a></li><li><a
title="Struts2" href="http://struts.apache.org/2.x/">Struts2</a></li><li><a
title="Spring MVC" href="http://springframework.org/node/277">Spring MVC</a></li><li><a
title="Tapestry" href="http://tapestry.apache.org/">Tapestry</a></li></ul><p>AppFuse propose pour tous ces outils de généré un projet d&#8217;application simple ou un projet multi-modules contenant un projet noyau et des projets modulaires. Il est également possible de générer uniquement le backend d&#8217;application. Vous pourrez brancher dessus votre framework préféré.</p><p>Chaque archétype AppFuse crée une application complète comprenant :</p><ul><li>la gestion de la sécurité</li><li>une interface d&#8217;administration des utilisateurs et des rôles.</li><li>plusieurs thèmes CSS</li><li>la création automatique de la base de données</li><li>la population automatique de la base avec un jeu de données de test.</li></ul><p><strong><a
name="Pluginsdegnrationdecode"></a>Plugins de génération de code</strong></p><p>Une fois votre projet démarré avec l&#8217;archétype de votre choix, vous pourrez ajouter vos beans de données et les mapping Hibernate associés selon la méthode que vous préférez (annotations ou fichiers hbm.xml).</p><p>Une fois votre modèle posé, le plugin Maven &laquo;&nbsp;appfuse:gen&nbsp;&raquo; s&#8217;occupera pour vous de créer les classes de DAO, Managers et vues correspondantes pour obtenir les écrans de gestion élémentaires (CRUD).<br
/> Chaque lancement du plugin se fait sur une classe du modèle de données et fournit :</p><ul><li>une vue avec un tableau triable contenant l&#8217;ensemble des instances persistées en base</li><li>un formulaire de saisie/suppression</li><li>un jeu de données pour les tests</li><li>les DAO et Managers associés</li></ul><p>Conformément aux principes du scaffolding, la génération de code et de configuration possède ses limites et il est souvent nécessaire d&#8217;effectuer quelques corrections manuelles lorsque le modèle de données est un peu évolué.</p><p>Par exemple, dans le cas de relations ManyToOne, le formulaire de saisie d&#8217;un bean doit comporter une liste permettant de sélectionner avec quel objets faire le lien. Ce cas nécessite de faire des modifications dans l&#8217;Action Struts pour que la liste s&#8217;affiche effectivement dans le formulaire web. Nous allons voir ce genre de manipulation dans la partie pratique.</p><h4><a
name="HandsonHibernateSpringStruts"></a>Hands-on : Hibernate, Spring, Struts2</h4><p>Un bon exemple valant souvent mieux qu&#8217;un long discours, nous vous proposons de créer pas à pas une application web simple, permettant de saisir des constructeurs automobiles et des voitures liées à ces constructeurs.</p><p>L&#8217;environnement technique est le suivant :</p><ul><li>Struts 2</li><li>Java 5</li><li>Maven (&gt;= 2.0.6 mais 2.0.9 est plus sûr pour les <a
title="corrections sur les classpaths" href="http://maven.apache.org/release-notes.html">corrections sur les classpaths</a> )</li><li>accès au web depuis le poste de développement</li></ul><h4><a
name="Dmarrageduprojet"></a>Démarrage du projet</h4><p>Création de notre squelette de projet avec l&#8217;archétype <strong>appfuse-basic-struts</strong> :</p><pre class="brush: java; title: ; notranslate">
mvn archetype:create -DarchetypeGroupId=org.appfuse.archetypes
-DarchetypeArtifactId=appfuse-basic-struts
-DremoteRepositories=http://static.appfuse.org/releases
-DarchetypeVersion=2.0.1
-DgroupId=fr.xebia.blog.voiture -DartifactId=voiture-app
</pre><p>Un répertoire &laquo;&nbsp;voiture-app&nbsp;&raquo; contenant notre squelette applicatif vient d&#8217;apparaître. Les amateurs d&#8217;Eclipse pourront ajouter :</p><pre class="brush: java; title: ; notranslate">
cd voiture-app
mvn eclipse:eclipse
</pre><p>&#8230; pour que Maven créé les fichiers indispensables à Eclipse pour importer le projet.</p><p>Les archétype AppFuse placent la majeure partie du code de l&#8217;application en dépendances dans le pom.xml.<br
/> Pour pouvoir modifier le comportement de l&#8217;application et avoir tout sous les yeux, nous devons couper ces dépendances avec AppFuse et rapatrier le code.</p><p>Cela se fait très simplement en lançant :</p><pre class="brush: java; title: ; notranslate">
mvn appfuse:full-source
</pre><h4><a
name="crituredumodle"></a>Écriture du modèle</h4><p>Ajoutons maintenant notre modèle de données. Pour plus de simplicité, nous allons y intégrer directement les annotations utiles à la persistance. Les classes que l&#8217;on souhaite passer au générateur de code doivent se trouver directement dans le package &laquo;&nbsp;model&nbsp;&raquo; du projet. Dans notre cas il s&#8217;agit de &laquo;&nbsp;fr.xebia.blog.voiture.model&nbsp;&raquo;.</p><p><strong><a
name="ClasseConstructeurAutomobile"></a>Classe : ConstructeurAutomobile</strong></p><p><strong>src/main/java/fr/xebia/blog/voiture/model/ConstructeurAutomobile.java</strong></p><pre class="brush: java; title: ; notranslate">
package fr.xebia.blog.voiture.model;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class ConstructeurAutomobile {
  private Long id;
  private String nom;
  @Id
  @GeneratedValue(strategy=GenerationType.IDENTITY)
  public Long getId() {
    return id;
  }
  public void setId(Long id) {
    this.id = id;
  }
  @Column(length=50)
  public String getNom() {
    return nom;
  }
  public void setNom(String nom) {
    this.nom = nom;
  }
}
</pre><p><strong><a
name="ClasseVoiture"></a>Classe : Voiture</strong></p><p><strong>src/main/java/fr/xebia/blog/voiture/model/Voiture.java</strong></p><pre class="brush: java; title: ; notranslate">
package fr.xebia.blog.voiture.model;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
@Entity
public class Voiture {
  private Long id;
  private String nom;
  private ConstructeurAutomobile constructeur;
  @Id
  @GeneratedValue(strategy=GenerationType.IDENTITY)
  public Long getId() {
    return id;
  }
  public void setId(Long id) {
    this.id = id;
  }
  @Column(length=50)
  public String getNom() {
    return nom;
  }
  public void setNom(String nom) {
    this.nom = nom;
  }
  @ManyToOne
  @JoinColumn(name=&quot;constructeur_id&quot;)
  public ConstructeurAutomobile getConstructeur() {
    return constructeur;
  }
  public void setConstructeur(ConstructeurAutomobile constructeur) {
    this.constructeur = constructeur;
  }
}
</pre><h4><a
name="GnrationdesCRUD"></a>Génération des CRUD</h4><p>Maintenant que nous disposons des classes, nous pouvons lancer la génération des écrans CRUD :</p><pre class="brush: java; title: ; notranslate">
mvn appfuse:gen -Dentity=ConstructeurAutomobile
mvn appfuse:gen -Dentity=Voiture
</pre><p><em>N.B. : Si vous omettez l&#8217;option -Dentity le nom de la classe ciblée est demandé en prompt.</em></p><p>Le générateur de code comporte cependant une lacune. Les classes sont bien ajoutées aux mappings Hibernate, mais pas pour les tests unitaires. Par conséquent, un <strong>mvn test</strong> tombera en erreur.</p><p>Le palliatif à cela est de copier les lignes de mapping dans :</p><p><strong>src/main/resources/hibernate.cfg.xml</strong></p><pre class="brush: java; title: ; notranslate">
&lt;hibernate-configuration&gt;
    &lt;session-factory&gt;
        &lt;mapping class=&quot;fr.xebia.blog.model.User&quot;/&gt;
        &lt;mapping class=&quot;fr.xebia.blog.model.Role&quot;/&gt;
&lt;!-- Les deux lignes suivantes nous intéressent --&gt;
        &lt;mapping class=&quot;fr.xebia.blog.voiture.model.ConstructeurAutomobile&quot;/&gt;
        &lt;mapping class=&quot;fr.xebia.blog.voiture.model.Voiture&quot;/&gt;
&lt;!-- Stop, pas plus loin, deux lignes seulement --&gt;
    &lt;/session-factory&gt;
&lt;/hibernate-configuration&gt;
</pre><p>et de les coller dans le fichier <strong>src/test/resources/hibernate.cfg.xml</strong> pour garder ces deux fichiers en phase.</p><p>Vous pouvez le vérifier par vous même en lançant :</p><pre class="brush: java; title: ; notranslate">
mvn clean test -P hsqldb
</pre><p>{quote}<br
/> Plusieurs profils de base de données sont disponibles dans le pom.xml fourni par AppFuse (MySQL, PostgreSQL, Oracle, etc). Par souci de simplicité nous utilisons ici <a
title="HSQLDB" href="http://hsqldb.org/">HSQLDB</a>.<br
/> {quote}</p><h4><a
name="SupportdulienManyToOne"></a>Support du lien ManyToOne</h4><p>Le générateur AppFuse, bien que pratique, n&#8217;est pas omnipotent. Nous avons donc quelques manipulations à réaliser manuellement pour que le formulaire de saisie d&#8217;une Voiture soit complet.</p><p>Dans le fichier <strong>src/main/webapp/WEB-INF/pages/voitureForm.jsp</strong> vous pouvez voir cette ligne :</p><pre class="brush: java; title: ; notranslate">
&lt;s:select name=&quot;voiture.constructeur.id&quot; list=&quot;constructeurList&quot; listKey=&quot;id&quot; listValue=&quot;id&quot;&gt;&lt;/s:select&gt;
</pre><p>Il s&#8217;agit du tag Struts qui affiche la liste de sélection des constructeurs. Cependant, la classe VoitureAction, générée, ne fournit pas cette liste à la JSP, qui restera en conséquence désespérément vide à l&#8217;exécution. Notons également que par défaut, AppFuse affiche l&#8217;identifiant de l&#8217;entité dans la liste &#8211; ce qui ne correspond qu&#8217;exceptionnellement au besoin. Remplaçons la valeur de l&#8217;attribut <em>listValue</em> du tag <em>select</em> par &laquo;&nbsp;nom&nbsp;&raquo;. Ainsi, le nom du constructeur sera présenté dans la liste de sélection, plutôt que son identifiant.</p><p>Attaquons-nous au support de cette fameuse liste. Nous allons rajouter ceci au fichier :</p><p><strong>src/main/java/fr/xebia/blog/voiture/webapp/action/VoitureAction.java</strong></p><pre class="brush: java; title: ; notranslate">
[...]
import fr.xebia.blog.voiture.model.ConstructeurAutomobile;
[...]
  private GenericManager constructeurAutomobileManager;
  public void setConstructeurAutomobileManager(GenericManager constructeurAutomobileManager) {
    this.constructeurAutomobileManager = constructeurAutomobileManager;
  }
  public List getConstructeurList () {
    return (List) constructeurAutomobileManager.getAll();
  }
[...]
</pre><p>Comme l&#8217;attribut que nous rajoutons respecte les conventions de nommage et que la configuration Spring générée par AppFuse est correcte, l&#8217;injection de dépendances se fait automatiquement pour le constructeur AutomobileManager.</p><p>La méthode getConstructeurList, quant à elle, sera appelée par la JSP pour obtenir le contenu de la liste de sélection.</p><h4><a
name="Dmarrage"></a>Démarrage</h4><p>Nous pouvons maintenant effectuer un premier lancement de notre application grâce au plugin Jetty de Maven.  :</p><pre class="brush: java; title: ; notranslate">
mvn jetty:run-war -P hsqldb
</pre><p>Je vous laisse faire le tour du propriétaire en allant avec votre navigateur web sur <em>localhost:8080</em> pour vous mettre l&#8217;eau à la bouche, voici une liste non exhaustive de tout ce que nous avons obtenu en une demi-heure de travail :</p><ul><li>filtres de sécurité</li><li>gestion des utilisateurs en base</li><li>envois de mail en cas d&#8217;oubli d&#8217;un mot de passe ou de création de compte</li><li>écrans CRUD pour les constructeurs automobiles</li><li>écrans CRUD pour les voitures</li><li>un jeu de données inséré à chaque lancement des tests</li><li>export des listes de constructeurs et de voitures en CSV, XLS, PDF ou XML (Merci à <a
title="DisplayTag" href="http://displaytag.sourceforge.net/11/">DisplayTag</a>)</li><li>une CSS propre (ça fait toujours plaisir)</li><li>une foule de plugins très utiles placés dans le pom.xml : Cobertura, PMD, DBunit et d&#8217;autres</li><li>le support de l&#8217;internationalisation</li></ul><p>Et j&#8217;en oublie.</p><h3><a
name="Conclusions"></a>Conclusions</h3><p>AppFuse est, à mon avis, un excellent plugin Maven pour démarrer un projet d&#8217;application Web classique. Il n&#8217;est pas très polyvalent mais permet de se libérer d&#8217;une part assez fastidieuse du développement web : l&#8217;écriture des CRUD.</p><p>Le squelette d&#8217;application standardisé permet de s&#8217;y retrouver rapidement quand on gère plusieurs applications et de respecter un bon découpage des fichiers de configuration.</p><p>En fait ce plugin en fournit presque trop : trois semaines après je trouvais encore des morceaux de code inutilisés provenant du squelette, et qui m&#8217;ont facilité la vie, notamment pour l&#8217;exposition de WebServices grâce à XFire.</p><p>À mon avis un très bon outil, bien ciblé, à essayer.</p><p>Quelques ressources complémentaires :</p><ul><li><a
title="Seven simple reasons to use AppFuse" href="https://www.ibm.com/developerworks/java/library/j-appfuse/">Seven simple reasons to use AppFuse</a> par Matt Raible</li><li><a
title="AppFuse QuickStart" href="http://appfuse.org/display/APF/AppFuse+QuickStart" target="_blank">AppFuse QuickStart</a></li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2008/09/18/appfuse-par-lexemple/feed/</wfw:commentRss> <slash:comments>9</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2008/08/11/revue-de-presse-xebia-69/</link> <comments>http://blog.xebia.fr/2008/08/11/revue-de-presse-xebia-69/#comments</comments> <pubDate>Mon, 11 Aug 2008 17:50:36 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Flex]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[JBoss]]></category> <category><![CDATA[JSF]]></category> <category><![CDATA[Méthodes agiles]]></category> <category><![CDATA[RIA]]></category> <category><![CDATA[Seam]]></category> <category><![CDATA[Silverlight]]></category> <category><![CDATA[Struts]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=570</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. Agilité Agile 2008 : La sagesse des foules RIA FXStruts Interopérabilité Java &#8211; Silverlight HTML immobilisé par les tergiversations &#8230; pendant que les RIA progressent Le coin de la technique Les nouveautés de Seam 2.1 Evènements de notre communauté en France et à l&#8217;étranger [...]]]></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>Agilité</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/08/11/revue-de-presse-xebia-69/#AgileLasagessedesfoules">Agile 2008 : La sagesse des foules</a></li></ul><p><strong>RIA</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/08/11/revue-de-presse-xebia-69/#FXStruts">FXStruts</a></li><li><a
href="http://blog.xebia.fr/2008/08/11/revue-de-presse-xebia-69/#InteroprabilitJavaSilverlight">Interopérabilité Java &#8211; Silverlight</a></li><li><a
href="http://blog.xebia.fr/2008/08/11/revue-de-presse-xebia-69/#HTMLimmobilisparlestergiversat">HTML immobilisé par les tergiversations &#8230; pendant que les RIA progressent</a></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/08/11/revue-de-presse-xebia-69/#LesnouveautsdeSeam">Les nouveautés de Seam 2.1</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/08/11/revue-de-presse-xebia-69/#JSFOneSeptembre">JSF One &#8211; Septembre 2008</a></li></ul><h3><a
name="Agilit"></a>Agilité</h3><h4><a
name="AgileLasagessedesfoules"></a>Agile 2008 : La sagesse des foules</h4><p>La conférence <a
href="http://www.agile2008.org/" title="Agile 2008" >Agile 2008</a> qui se déroulait à Toronto s&#8217;est terminée vendredi dernier. Avec près de 1600 participants et 400 présentations c&#8217;était la plus grande (<a
href="http://gojko.net/2008/08/08/agile-2008-the-end/" title="trop grande" >trop grande</a> ?) conférence Agile jamais organisée. Les retours sur le niveau des présentations semblent plutôt positifs bien que la qualité des sessions était <a
href="http://www.agilex.fr/2008/08/2eme-jour/" title="inégale" >inégale</a>, certaines déceptions venant parfois <a
href="http://blog.valtech.fr/wordpress/2008/08/10/agile-2008-cest-fini/" title="des stars" >des stars</a>.</p><p>La conférence a débuté avec un très bon discours de <a
href="http://en.wikipedia.org/wiki/James_Surowiecki" title="James Surowiecki" >James Surowiecki</a>, auteur du livre <a
href="http://en.wikipedia.org/wiki/Wisdom_of_the_crowds" title="The Wisdom of Crowds" >The Wisdom of Crowds</a> (La sagesse des foules). InfoQ <a
href="http://www.infoq.com/news/2008/08/wisdom-of-crowds" title="revient sur la thèse de ce livre" >revient sur la thèse de ce livre</a> : &laquo;&nbsp;<em>une décision prise par un groupe de personnes est souvent meilleure que la meilleure décision de n&#8217;importe quelle personne du groupe</em>&laquo;&nbsp;. Cette affirmation est toutefois soumise à quelques contraintes : un groupe <em>sage</em> est un groupe <strong>diversifié</strong>, où chaque membre prend une décision de façon <strong>indépendante</strong>, et qui sait <strong>agréger</strong> l&#8217;ensemble des décisions individuelles pour obtenir une décision collective.</p><p><a
href="http://en.wikipedia.org/wiki/Robert_Cecil_Martin" title="Robert C. Martin" >Robert C. Martin</a> &#8211; surnommé l&#8217;oncle Bob &#8211; a donné un discours intitulé <em>Quintessence</em> dans lequel il propose d&#8217;ajouter un <a
href="http://gojko.net/2008/08/08/the-fifth-element-of-the-agile-manifesto/" title="cinquième élément" >cinquième élément</a> au <a
href="http://agilemanifesto.org/" title="Manifeste Agile" >Manifeste Agile</a> : il appelle les développeurs à <a
href="http://www.agilex.fr/2008/08/troisieme-jour/" title="se laver les mains" >se laver les mains</a>, c&#8217;est-à-dire à écrire du code propre, à ne pas faire de compromis sur la qualité.<br
/> Il tire aussi une caricature des 2 méthodes Scrum et XP en les comparant à Obama et Mc Cain : Scrum à cause de son idéalisme et de ses certifications, et XP car la méthode est trop stricte. Il rappelle que la conférence Agile 2008 est une fusion de deux anciennes conférences respectivement sur Scrum et XP, ce qui confirme le fait que <a
href="http://gojko.net/2008/08/08/the-fifth-element-of-the-agile-manifesto/" title="les 2 méthodes ont fusionné en un seul ensemble de pratiques agiles" >les 2 méthodes ont fusionné en un seul ensemble de pratiques agiles</a>.</p><p><a
href="http://en.wikipedia.org/wiki/Alan_Cooper" title="Alan Cooper" >Alan Cooper</a> a clôturé la conférence avec sa présentation <a
href="http://www.cooper.com/journal/agile2008/" title="The Wisdom of experience" >The Wisdom of experience</a>. Il en a profité pour rappeler que sa conviction pour l&#8217;interêt de la conception détaillée par écrit ne fait pas de lui un adhérent à la méthode <a
href="http://en.wikipedia.org/wiki/Waterfall_model" title="Waterfall" >Waterfall</a>.</p><p>Voici quelques blogs parlant d&#8217;Agile 2008, dont certains sont cités précédemment. En français :</p><ul><li><a
href="http://www.agilex.fr/" title="Alexandre Boutin" >Alexandre Boutin</a></li><li><a
href="http://blog.valtech.fr/wordpress/2008/08/10/agile-2008-cest-fini/" title="Valtech" >Valtech</a></li></ul><p>En anglais :</p><ul><li><a
href="http://gojko.net/2008/08/08/agile-2008-the-end/" title="Gojko Adzic" >Gojko Adzic</a></li><li><a
href="http://blog.projectconnections.com/project_practitioners/2008/08/agile-2008-star.html" title="Kent McDonald" >Kent McDonald</a></li><li><a
href="http://www.agileadvice.com/2008/08/05/miscellaneous/first-day-of-agile-2008-conference/" title="Mishkin Berteig" >Mishkin Berteig</a></li><li><a
href="http://www.agilegamedevelopment.com/2008/08/agile-2008-conference.html" title="Klinton Keith" >Klinton Keith</a></li><li><a
href="http://lisacrispin.blogspot.com/2008/08/back-from-agile-2008-what-did-i-learn.html" title="Lisa Crispin" >Lisa Crispin</a></li><li><a
href="http://agiletools.wordpress.com/2008/08/04/agile-2008-day-1/" title="Tom Perry" >Tom Perry</a></li></ul><p>Rendez-vous l&#8217;année prochaine à <a
href="http://agilealliance.org/Agile2009/conference09.html" title="Chicago" >Chicago</a>.</p><h3><a
name="RIA"></a>RIA</h3><h4><a
name="FXStruts"></a>FXStruts</h4><p>Cet article nous présente un nouvelle librairie open source: <a
href="http://anirudhs.chaosnet.org/blog/2008.07.23.html" title="FXStruts" >FXStruts</a>. Cette dernière, développée, par Anirudh Sasikumar permet d&#8217;intégrer Flex dans la partie Vue de <a
href="http://struts.apache.org/1.3.8/index.html" title="Struts" >Struts</a>. Le principe est assez simple: cette librairie fonctionne sur le même principe du tag bean:write dont l&#8217;output sera de l&#8217;AMF ou du XML. Pour cela, deux tags sont disponibles :</p><ul><li>fx:write équivalent au tag bean:message.</li><li>fx:message équivalent au tag bean:write.</li></ul><p>Le code source est accessible sur le <a
href="http://code.google.com/p/fxstruts/" title="repository de google" >repository de google</a> et <a
href="http://code.google.com/p/fxstruts/wiki/MigratingExistingStrutsAppToFlex" title="des aides à la migration d'applications Struts en Flex" >des aides à la migration d&#8217;applications Struts en Flex</a> sont données.<br
/> Pour le moment, l&#8217;inconvénient majeur de cette libraire est qu&#8217;elle n&#8217;a été testée que pour la version <a
href="http://struts.apache.org/1.3.8/index.html" title="1.3.8 de Struts" >1.3.8 de Struts</a>.<br
/> Ce projet témoigne encore de l&#8217;engouement pour les technologies RIA et plus particulièrement de Flex. A quand un FXStruts pour Struts 2 ?</p><h4><a
name="InteroprabilitJavaSilverlight"></a>Interopérabilité Java &#8211; Silverlight</h4><p>Derrière le leader des RIA Flex, Microsoft s&#8217;accroche et tente d&#8217;imposer son RIA Silverlight.<br
/> En attendant la sortie de la version 2 et un billet plus complet sur ce blog, InfoQ présente <a
href="http://www.infoq.com/articles/silverlight-java-interop" title="un tutoriel pour interfacer Silverlight avec des Webservices Java" >un tutoriel pour interfacer Silverlight avec des Webservices Java</a> (SOAP, REST et RSS).</p><p>Nous retiendrons les conclusions de cet exercice :</p><ul><li>Les technologies de communication de prédilection de Silverlight pour accéder à des backends Java sont SOAP, REST (aka XML sur HTTP) et <a
href="http://en.wikipedia.org/wiki/RSS_(file_format)" title="RSS" >RSS</a></li><li>SOAP pose les classiques problèmes d&#8217;interopérabilité entre les mondes .Net et Java. Silverlight n&#8217;offre pour le moment que le support de <a
href="http://en.wikipedia.org/wiki/WS-I_Basic_Profile" title="WS-I Basic Profile" >WS-I Basic Profile</a> (<a
href="http://en.wikipedia.org/wiki/WS-I" title="WS-I Basic Security Profile" >WS-I Basic Security Profile</a>, n&#8217;est pas encore disponible).</li><li>Le support de REST manque de maturité. La documentation est obsolète voire erronée. Les implémentations RESTful qui utilisent simplement HTTP POST ou GET (plutôt que PUT et DELETE) sont celles qui fonctionnent le mieux avec Silverlight.</li><li>Si SOAP est un bon choix pour les accès en écriture, REST est en revanche plus simple à utiliser pour les accès en lecture.</li><li>L&#8217;accès à des flux RSS est facile à mettre en place.</li><li>Un des concepts fondamentaux à retenir est que Silverlight s&#8217;exécute dans un browser. C&#8217;est pourquoi il possède tous les problèmes inhérents aux composants &#8216;embarqués&#8217; dans le navigateur : les problèmes de cross domaines, les limitations sur le nombre de connexions au navigateur, le support des différents types MIME, etc. Ces problématiques doivent être abordées durant le développement.</li></ul><p>A noter, les références vers des objets JAXB devraient être supportées dans Silverlight 2 RTM de la même manière qu&#8217;elles le sont dans .NET Framework 3.5 SP1 (DataContractSerializer).</p><h4><a
name="HTMLimmobilisparlestergiversat"></a>HTML immobilisé par les tergiversations &#8230; pendant que les RIA progressent</h4><p>InfoQ revient sur les tergiversations autour des évolutions de HTML dans <a
href="http://www.infoq.com/news/2008/08/xhtml2html5" title="XHTML 2 and HTML 5 continue to diverge" >XHTML 2 and HTML 5 continue to diverge</a>.<br
/> Pour mémoire,</p><ul><li><a
href="http://www.w3.org/TR/xhtml2/" title="XHTML V2" >XHTML V2</a> est issu du W3C. Dans la veine du toujours confidentiel <a
href="http://en.wikipedia.org/wiki/Semantic_Web" title="Web Sémantique" >Web Sémantique</a> soutenu par le W3C, l&#8217;objectif principal de XHTML V2 est de renforcer la séparation entre le contenu et la présentation.</li><li><a
href="http://www.whatwg.org/specs/web-apps/current-work/" title="HTML V5" >HTML V5</a> est une proposition du <a
href="http://en.wikipedia.org/wiki/WHATWG" title="Web Hypertext Application Technology Working Group" >Web Hypertext Application Technology Working Group</a> (principalement Google, Apple, Mozilla et Microsoft) suite à un désaccord avec la direction prise par XHTML V2. HTML V5 se veut plus pragmatique et met l&#8217;emphase sur la dimension Rich Internet Application (interactions browser-serveur, édition de documents, drag&#038;drop, etc).</li></ul><p>Pendant ces hésitations, les éditeurs de RIA continuent à ajouter des fonctionnalités à leurs environnements graphiques et Adobe va même jusqu&#8217;à évoquer des applications web widget-centric qui ne passeraient même plus par des browsers mais directemment des liens sur le bureau du système d&#8217;exploitation.</p><p>Plus de détails dans <a
href="http://immike.net/blog/2008/02/06/xhtml-2-vs-html-5/" title="XHTML 2 vs. HTML 5" >XHTML 2 vs. HTML 5</a> par Vinny Carpenter.</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="LesnouveautsdeSeam"></a>Les nouveautés de Seam 2.1</h4><p>Peter Muir, JBoss, présente dans <a
href="http://java.dzone.com/articles/whats-new-seam-21-an-interview" title="DZone : What's New in Seam 2.1 - An interview with Peter Muir" >DZone : What&#8217;s New in Seam 2.1 &#8211; An interview with Peter Muir</a> les nouveautés de <a
href="http://seamframework.org/" title="Seam" >Seam</a> 2.1.</p><p>Pour rappel, Seam est un framework permettant le développement d&#8217;applications web d&#8217;entreprise. Seam intègre des technologies Java EE 5 comme JSF, EJB 3, JPA. Il fournit également un ensemble d&#8217;API et d&#8217;annotations afin de faciliter le développement avec ces technologies. Seam tente de prendre les meilleures idées de chacune des technologies pour que le développeur ait à faire le moins de couture¹ possible, c&#8217;est à dire du développement purement technique pour intégrer les différentes couches de l&#8217;application.</p><p>Seam pose les bases des <a
href="http://jcp.org/en/jsr/detail?id=299" title="spécifications <em>Web Beans</em>, JSR 299&#8243; >spécifications <em>Web Beans</em>, JSR 299</a>. Celles-ci ont pour objectif d&#8217;unifier le modèle de composant JSF (_Managed Bean_) avec le modèle de composant EJB pour obtenir un modèle de programmation plus simple et plus complet pour le développement d&#8217;applications Web.</p><p>Peter Muir annonce l&#8217;ajout d&#8217;un support <a
href="http://code.google.com/webtoolkit/" title="GWT" >GWT</a> et <a
href="http://wicket.apache.org/" title="Wicket" >Wicket</a> dans Seam 2.1. Le support GWT permettra à Seam de déléguer son rendu à celui-ci alors que le support de Wicket est plus complet. Wicket pourra directement utiliser des composants et des conversations Seam. Côté RIA, l&#8217;intégration de Flex est également à l&#8217;étude.</p><p>Les principaux changements que l&#8217;on peut attendre de Seam 2.1 sont :</p><ul><li> Les performances</li><li> La sécurité : gestion de l&#8217;identité, gestion des habilitations sur les écrans, les workflows, &#8230;</li><li> Amélioration du support REST : intégration de <a
href="http://www.jcp.org/en/jsr/detail?id=311" title="JAX-RS, JSR 311" >JAX-RS, JSR 311</a> et de RESTeasy, implémenté par un autre JBoss-ien : Bill Burke.</li></ul><p>Web Beans est une spécification Java EE. Cette spécification se base sur Seam mais aussi <a
href="http://code.google.com/p/google-guice/" title="Guice" >Guice</a>, le framework d&#8217;injection de dépendance de Google.</p><p>Voici quelques problématiques couvertes par Web Beans :</p><ul><li> Gestion des conversations</li><li> Injection des dépendances</li><li> Création de composants et la gestion de leurs cycles de vie</li><li> Intégration de transactions</li><li> Intégration de JPA</li><li> Mécanismes de validation (Formulaire, métier, donnée, &#8230;)</li></ul><p>La version 3 de Seam est actuellement en bêta. On peut espérer une sortie courant 2009. Cette version proposera un nouveau modèle de composant, à suivre &#8230;</p><p>¹ <em>Seam</em> signifie en français couture</p><h3><a
name="EvnementsdenotrecommunautenFra"></a>Evènements de notre communauté en France et à l&#8217;étranger</h3><h4><a
name="JSFOneSeptembre"></a>JSF One &#8211; Septembre 2008</h4><p>Du 4 au 6 septembre 2008 se tiendra une série de conférences autour de JSF : <a
href="http://www.jsfone.com/conference/washington_dc/2008/09/index.html" title="JSF One" >JSF One</a>.</p><p>Les principaux sujets abordés seront :</p><ul><li><a
href=" http://jcp.org/en/jsr/detail?id=314" title="JSF 2.0 (JSR 314)" >JSF 2.0 (JSR 314)</a> (sera embarqué dans Java EE 6)</li><li>Facelets</li><li><a
href="http://www.springframework.org/spring-integration" title="Spring Integration" >Spring Integration</a></li><li><a
href="http://seamframework.org/" title="Seam" >Seam</a></li><li>Développement Portlet</li><li>Test</li><li>Sripting JSF</li><li>Développement de composant</li><li>Suite de composant comme <a
href="http://www.jboss.org/jbossrichfaces/" title="RichFaces (JBoss)" >RichFaces (JBoss)</a>, <a
href="http://www.icefaces.org/main/home/index.jsp" title="ICEfaces" >ICEfaces</a>, &#8230;</li><li> Intégration des API Google</li></ul><p>Les principaux acteurs du marché seront représentés : Sun, Spring, JBoss, etc. Voici le détail du <a
href="http://www.jsfone.com/conference/washington_dc/2008/09/sessions.html" title="programme et des intervenants" >programme et des intervenants</a>.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2008/08/11/revue-de-presse-xebia-69/feed/</wfw:commentRss> <slash:comments>4</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2008/03/03/revue-de-presse-xebia-46/</link> <comments>http://blog.xebia.fr/2008/03/03/revue-de-presse-xebia-46/#comments</comments> <pubDate>Mon, 03 Mar 2008 18:32:16 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Aqualogic]]></category> <category><![CDATA[BEA]]></category> <category><![CDATA[EJB]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[JSF]]></category> <category><![CDATA[Méthodes agiles]]></category> <category><![CDATA[Mokito]]></category> <category><![CDATA[SOA]]></category> <category><![CDATA[Spring]]></category> <category><![CDATA[Tomcat]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/2008/03/03/revue-de-presse-xebia-46/</guid> <description><![CDATA[La revue de presse de l&#8217;actualité Java/J2EE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII Aqualogic Service Bus 3.0 (BEA) Spring Source arrive en France Agilité Les bons programmeurs en ont (de bons tests unitaires) Progression des méthodes Agiles ? SOA 2008, annus horribilis de la SOA ? Le coin de la technique Java EE [...]]]></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/03/03/revue-de-presse-xebia-46/#AqualogicServiceBus">Aqualogic Service Bus 3.0 (BEA)</a></li><li><a
href="http://blog.xebia.fr/2008/03/03/revue-de-presse-xebia-46/#SpringSource">Spring Source arrive en France</a></li></ul><p><strong>Agilité</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/03/03/revue-de-presse-xebia-46/#TestsUnitaires">Les bons programmeurs en ont (de bons tests unitaires)</a></li><li><a
href="http://blog.xebia.fr/2008/03/03/revue-de-presse-xebia-46/#MethodesAgiles">Progression des méthodes Agiles ?</a></li></ul><p><strong>SOA</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/03/03/revue-de-presse-xebia-46/#annusHorribilis">2008, annus horribilis de la SOA ?</a></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/03/03/revue-de-presse-xebia-46/#JavaEE6profiles">Java EE 6 : les profiles se dévoilent</a></li><li><a
href="http://blog.xebia.fr/2008/03/03/revue-de-presse-xebia-46/#LoadBalancingTomcatetApache">Load balancing avec Tomcat et Apache</a></li><li><a
href="http://blog.xebia.fr/2008/03/03/revue-de-presse-xebia-46/#Mockito">Tests unitaires : Mockito</a></li><li><a
href="http://blog.xebia.fr/2008/03/03/revue-de-presse-xebia-46/#JSF">JSF, répétition de la mésaventure des EJB 2 ?</a></li></ul><hr
/><h3>Actualité éditeurs / SSII</h3><h4><a
name="AqualogicServiceBus"></a>Aqualogic Service Bus 3.0 (BEA)</h4><p>Aqualogic Service Bus 3.0 (ALSB 3.0 pour les intimes) est maintenant disponible en <a
href="http://commerce.bea.com/showproduct.jsp?family=ALSB&amp;major=3.0&amp;minor=0">téléchargement</a>. La liste des fonctionnalités majeures de cette nouvelle version a déjà été abordée lors d’une <a
href="http://blog.xebia.fr/2007/12/10/revue-de-presse-xebia-35/#ALSB">précédente revue de presse</a>. On peut y ajouter une meilleure intégration avec la gamme Aqualogic (ALRR, le <em>repository</em>,ALBMP, le <em>moteur de processus</em> et ALSM, le <em>moniteur SOA) et une fonctionnalité de _Throttling</em>, un service qui permet d’éviter d’entrainer une surcharge vers les services métiers accédés.</p><p>La distribution comprend WebLogic Server 10, la surcouche ESB et BEA Workshop 10.2 l’IDE basé sur Eclipse pour le développement (Eclipse 3.2.2, Eclipse WTP 1.5.4,…)</p><ul><li>La <a
href="http://edocs.bea.com/alsb/docs30/">documentation</a></li><li>La <a
href="http://edocs.bea.com/alsb/docs30/relnotes/relnotes.html#whatsnew">Release Note</a></li></ul><h4><a
name="SpringSource"></a>Spring Source arrive en France</h4><p>Nous apprenons via cet <a
href="http://blog.developpez.com/index.php?blog=177&amp;p=5198&amp;more=1&amp;c=1&amp;tb=1&amp;pb=1#more5198">article</a> que SpringSource (anciennement Interface21) allait ouvrir une filiale en France. Un des premiers avantages est la prochaine disponibilité de formations Spring en français.</p><p>Il est déjà possible de s’inscrire sur le site de SpringSource, à cette <a
href="http://www.springsource.com/web/guest/contact/training-formMailer">adresse</a>.</p><h3>Agilité</h3><h4><a
name="TestsUnitaires"></a>Les bons programmeurs en ont (de bons tests unitaires)</h4><p>Dans <a
href="http://www.infoq.com/news/2008/03/cockburn-testing-guts">Real programmers avec GUTs</a>, Vikas Hazrati et Deborah Hartmann commentent le débat qui <a
href="http://www.infoq.com/interviews/coplien-martin-tdd">a eu lieu sur InfoQ mi-février entre Jim Coplien et Bob Martin</a> sur le sujet TDD (Test Driven Development), CDD (Contract Driven Development) et professionnalisme des développeurs.<br
/> Vikas et Deborah nous rappelle, qu’étrangement, l’idée d’avoir obligatoirement à utiliser la méthode TDD pour avoir de bons tests unitaires semble répandue. Or, l’important, c’est d’avoir de bons tests unitaires, et ce qu’ils soient développés avant ou après le code.</p><p>Pour rappel, TDD n’est pas une méthode de test, c’est bien une méthode de développement. L’effet produit est d’avoir de bons tests unitaires, mais ce n’est pas la seule méthode pour y parvenir !<br
/> La blogosphère agile <a
href="http://blog.troyd.net/Test+Supported+Development+TSD+Is+NOT+Test+Driven+Development+TDD.aspx">semble</a> <a
href="http://scruffylookingcatherder.com/archive/2008/01/31/tdd-or-pout.aspx">éprouver</a> le besoin irrépressible de trouver un acronyme pour “je code de <ins>bons</ins> tests unitaires <ins>après</ins> avoir développé mon code”. On n’y voit pas grand intérêt, mais si ceci a pour effet d’éviter la confusion ambiante sur TDD, pourquoi pas…<br
/> S’il n’utilise pas la méthode TDD, recommandons au lecteur de ne pas développer les tests unitaires “plus tard”, mais “le plus tôt possible”.</p><h4><a
name="MethodesAgiles"></a>Progression des méthodes Agiles ?</h4><p>Le site Methods And Tools a publié le résultat d’une étude qu’il a réalisé sur <a
href="http://www.methodsandtools.com/dynpoll/oldpoll.php?Agile2">l’adoption des méthodes agiles</a>. En voici les résultats (comparés à ceux d’une étude similaire réalisée en 2005) :</p><table
style="border: 1px solid black;" cellpadding="5" cellspacing="0"><tbody><tr><td
style="border: 1px solid black; color: rgb(255, 255, 255);" bgcolor="#663366"><strong>&nbsp;</strong></td><td
style="border: 1px solid black; color: rgb(255, 255, 255);" bgcolor="#663366"><strong>2008</strong></td><td
style="border: 1px solid black; color: rgb(255, 255, 255);" bgcolor="#663366"><strong>2005</strong></td></tr><tr><td
style="border: 1px solid black;">Not aware</td><td
style="border: 1px solid black;">13%</td><td
style="border: 1px solid black;">26%</td></tr><tr><td
style="border: 1px solid black;">Not using</td><td
style="border: 1px solid black;">13%</td><td
style="border: 1px solid black;">16%</td></tr><tr><td
style="border: 1px solid black;">Investigating</td><td
style="border: 1px solid black;">14%</td><td
style="border: 1px solid black;">14%</td></tr><tr><td
style="border: 1px solid black;">Analysed and rejected</td><td
style="border: 1px solid black;">4%</td><td
style="border: 1px solid black;">3%</td></tr><tr><td
style="border: 1px solid black;">Pilot projects</td><td
style="border: 1px solid black;">8%</td><td
style="border: 1px solid black;">4%</td></tr><tr><td
style="border: 1px solid black;">Partial implementation (adoption of some agile practices)</td><td
style="border: 1px solid black;">17%</td><td
style="border: 1px solid black;">17%</td></tr><tr><td
style="border: 1px solid black;">Partial deployment (some projects are using this approach)</td><td
style="border: 1px solid black;">14%</td><td
style="border: 1px solid black;">12%</td></tr><tr><td
style="border: 1px solid black;">Deployed (all new projects are using this approach)</td><td
style="border: 1px solid black;">17%</td><td
style="border: 1px solid black;">8%</td></tr></tbody></table><p>C’est encourageant : les méthodes agiles sont définitivement sorties de la confidentialité, et leur déploiement progresse assez rapidement. Reste à savoir ce qu’entendent précisément les sondés par méthodes agiles… On sait que dans le domaine, le wannabisme fait rage, et que l’adoption se résume souvent à quelques mesures cosmétiques, autrement appelées <a
href="http://en.wikipedia.org/wiki/Cowboy_coding">cowboy coding</a> (rappelez-vous le <a
href="http://agileconsortium.blogspot.com/2007/12/nokia-test.html">test Nokia</a>).<br
/> Scott Ambler apporte un commentaire (<a
href="http://www.ddj.com/architect/204200877">Scott Ambler’s 2007 Agile survey analyzed for Dr. Dobb’s : Is Agile really that successful?</a>) intéressant sur le sujet.</p><p>Et pour s’encourager, on peut toujours regarder la belle courbe de <a
href="http://www.indeed.com/jobtrends?q=agile%2C+scrum%2C+%22extreme+programming%22%2C+%22test+driven%22&amp;l=">Indeed.com</a></p><h3>SOA</h3><h4><a
name="annusHorribilis"></a>2008, annus horribilis de la SOA ?</h4><p>S’il ne faut pas tomber dans le sensationnalisme, on notera tout de même la crise de doute que traversent les SOAistes en ce début d’année.<br
/> Tout d’abord le chantre de la SOA, le Burton Group lui-même, qui se lance à la recherche de projets SOA qui ont vraiment marché (<a
href="http://www.infoq.com/news/2008/02/burton-soa">InfoQ : Burton On Real World SOA Experiences</a>) ; hélas, le “Rapport Burton” restera réservé aux clients payants.<br
/> Ensuite, la très officielle presse SOAiste <a
href="http://searchsoa.techtarget.com/">searchSOA.com</a> part à la recherche de bonnes utilisations de SOAP, si cela a existé, avec <a
href="http://www.theserverside.com/news/thread.tss?thread_id=48534">Looking for a few good WSDLs</a> . A quand “Looking for a few good WS-* uses” ?</p><p>Enfin, Steve Vinoski, héros de l’époque Corba, a profité de son changement d’employeur pour retourner sa veste et prôner l’approche RESTful dans <a
href="http://www.infoq.com/interviews/vinoski-qcon-interview">InfoQ : CORBA Guru Steve Vinoski on REST, Web Services, and Erlang</a>.<br
/> Rassurons-nous, rien de cela n’ébranlera les diseurs de bonne aventure SOA qui, après nous avoir gratifié des merveilleuses <a
href="http://tech.groups.yahoo.com/group/service-orientated-architecture/messages/9447?threaded=1&amp;m=e&amp;var=1&amp;tidx=1">prédictions du Yahoo SOA Group pour 2008</a>, débattent férocement de <a
href="http://tech.groups.yahoo.com/group/service-orientated-architecture/messages/9755?threaded=1&amp;m=e&amp;var=1&amp;tidx=1">UDDI v2, v3 and replication</a>.<br
/> Ne jetons tout de même pas bébé avec l’eau du bain. L’approche SOA apporte beaucoup de valeur lorsqu’elle est abordée avec pragmatisme à l’instar du site <a
href="http://www.enterpriseintegrationpatterns.com">Enterprise Integration Patterns</a> qui propose des documents de grande valeur comme <a
href="http://www.enterpriseintegrationpatterns.com/docs/hohpe_developing_in_soa_world.pdf">Developing in a Service-oriented World</a> de Gregor Hohpe (Google).</p><h3>Le coin de la technique</h3><h4><a
name="JavaEE6profiles"></a>Java EE 6 : les profiles se dévoilent</h4><p>Nous avions évoqué le <a
href="http://blog.xebia.fr/2008/01/21/revue-de-presse-xebia-40/#JEE6">Java EE Web Profile en Janvier</a>. Roberto Chinnici nous dévoile aujourd’hui dans <a
href="http://www.theserverside.com/news/thread.tss?thread_id=48522">Profiles in the Java EE 6 Platform</a> les différentes pistes pour le Web Profile si cher à Rod Jonhson.<br
/> C’est l’occasion pour chacun de donner son opinion éclairée sur le sujet. Les plus extrémistes demandent un Web Profile qui ne porterait que la Servlet API, d’autres demandent à corps et à cri leurs JSFs voire leurs Portlets pour les plus téméraires.<br
/> Nous seront moins péremptoires et nous nous limiterons pour le moment à quelques observations :</p><ul><li>Les équipes d’exploitation sont les grands oubliés, <a
href="http://jcp.org/en/jsr/detail?id=77">JSR-77 : J2EE Management</a> n’est pas au rendez-vous, la standardisation des API de monitoring et de supervision ne semblent intéresser personne. Nous ne sommes pas prêts d’avoir le monitoring des datasources inclu dans Tomcat <img
src="http://blog.xebia.fr/wp-includes/images/smilies/icon_sad.gif" alt=":-(" class="wp-smiley"></li><li>Pourquoi regrouper dans JSR 77 les statistiques de monitoring (JDBCStats, JMSStats, JCAStats, etc) plutôt que de les réintroduire dans chacune des JSR concernées ?</li><li>JMS n’a jamais été aussi aussi utilisé qu’aujourd’hui (merci à Spring-JMS et à ActiveMQ), quel dommage de le voir absent du Web Profile</li><li>L’utilisation de JMS sous tend le pooling des ressources (JCA) et les transactions distribuées (JTA). Cela tire beaucoup d’APIs pour les esprits minimalistes mais le scénario Message Driven Pojo + accès SGBD est chaque jour plus fréquent.</li><li>JTA embarqué dans le Web Profile demanderait un travail substantiel aux équipes de SpringSource qui veulent leur stack Tomcat+Spring certifiée Web Profile. Pour mémoire, JBoss n’a été vraiment satisfait de son Java Transaction Service qu’en version 4.</li><li>JAXB et JAXWS ne rentrent pas dans le débat car ils sont inclus dans le JDK 6.</li><li>On peut voir un <em>pruning</em> en douceur avec les Web Profiles (A) et (B) qui ne sont pas encombrés par les APIs désuètes.</li></ul><p><strong>Scénarios pour le Web Profile</strong></p><table
style="border: 1px solid black;" cellpadding="5" cellspacing="0"><tbody><tr><td
style="border: 1px solid black; color: rgb(255, 255, 255);" bgcolor="#663366"><strong>(A)</strong></td><td
style="border: 1px solid black; color: rgb(255, 255, 255);" bgcolor="#663366"><strong>(B)</strong></td><td
style="border: 1px solid black; color: rgb(255, 255, 255);" bgcolor="#663366"><strong>Java EE 6 Full platform</strong></td></tr><tr><td
style="border: 1px solid black;">Servlet 3.0<br
/> JSP 2.2<br
/> JSR-45</p><p> EL 1.2<br
/> JSTL 1.2<br
/> JSR-250</td><td
style="border: 1px solid black;">Servlet 3.0<br
/> JSP 2.2<br
/> JSR-45</p><p> EL 1.2<br
/> JSTL 1.2<br
/> JSR-250</td><td
style="border: 1px solid black;">Servlet 3.0<br
/> JSP 2.2<br
/> <a
href="http://jcp.org/en/jsr/detail?id=45">JSR-45: Debugging Support for Other Languages</a></p><p> EL 1.2<br
/> JSTL 1.2<br
/> <a
href="http://jcp.org/en/jsr/detail?id=250">JSR-250: Common Annotations for the JavaTM Platform</a></td></tr><tr><td
style="border: 1px solid black;"><br
clear="all"></td><td
style="border: 1px solid black;">EJB 3.1 (Lite)<br
/> JTA 1.1</p><p> JPA 2.0<br
/> JSF 2.0 *<br
/> Web Beans 1.0 *</td><td
style="border: 1px solid black;">EJB 3.1<br
/> JTA 1.1<br
/> JPA 2.0</p><p> JSF 2.0<br
/> Web Beans 1.0</td></tr><tr><td
style="border: 1px solid black;"><br
clear="all"></td><td
style="border: 1px solid black;"><br
clear="all"></td><td
style="border: 1px solid black;">JAX-RS 1.0<br
/> Connectors 1.6<br
/> JAX-WS 2.2</p><p> JAXB 2.2<br
/> <a
href="http://jcp.org/en/jsr/detail?id=109">JSR-109 1.2 :Implementing Enterprise Web Services</a><br
/> <a
href="http://jcp.org/en/jsr/detail?id=181">JSR-181 1.1 : Web Services Metadata for the JavaTM Platform</a><br
/> JMS 1.1<br
/> JAF 1.1<br
/> JavaMail 1.4</p><p> <a
href="http://jcp.org/en/jsr/detail?id=115">JSR-115 : Java Authorization Contract for Containers</a><br
/> <a
href="http://jcp.org/en/jsr/detail?id=196">JSR-196: Java Authentication Service Provider Interface for Containers</a><br
/> <a
href="http://jcp.org/en/jsr/detail?id=88">JSR-88 1.2: Java EE Application Deployment</a><br
/> <a
href="http://jcp.org/en/jsr/detail?id=77">JSR-77 1.1 : J2EE Management</a><br
/> JAX-RPC1.1<br
/> JAXR 1.0</td></tr></tbody></table><p><strong>Ressources complémentaires</strong></p><ul><li><a
href="http://www.infoq.com/news/2008/01/jee6">InfoQ : Java EE 6 Spec Lead Requests Community Feedback on Web Profile Options</a></li><li><a
href="http://blogs.webtide.com/janb/2008/02/28/1204179615319.html">Webtide (ie Jetty) blog: Java EE 6 Web Profile Should JSPs really be included? Do we even need a profile?</a></li><li><a
href="http://www.theserverside.com/news/thread.tss?thread_id=48522">TSS : Roberto Chinnici: Profiles in the Java EE 6 Platform</a></li></ul><h4><a
name="LoadBalancingTomcatetApache"></a>Load balancing avec Tomcat et Apache</h4><p>Avneet Mangat nous explique dans <a
href="http://www.theserverside.com/tt/knowledgecenter/knowledgecenter.tss?l=LoadBalancingTomcatApache">TSS : Load-balancing Tomcat with Apache</a> comment mettre en place un cluster Tomcat avec le serveur web Apache. Si la fiabilité de la solution n’a rien rien à envier aux serveurs d’applications sophistiqués pour les cas, très fréquents, qui ne nécessitent pas de réplication de session, on remarquera cependant que la mise en place du load-balancing avec Tomcat et Apache demande sensiblement plus de configuration par édition de fichier qu’avec un serveur commercial. De plus, on regrettera le manque de documentation sur le sujet.</p><p>Le load balancing Tomcat avec Apache, une solution prête pour la production ? Oui, mais surtout pour les équipes d’exploitation qui ont la culture du scripting et des technologies open source à la documentation parfois légère. Les équipes qui attendent des procédures packagées seront plus à l’aise avec un serveur d’applications plus complexe.</p><h4><a
name="Mockito"></a>Tests unitaires : Mockito</h4><p>Szczepan Faber nous présente dans <a
href="http://monkeyisland.pl/2008/02/01/deathwish/">expect-run-verify… Goodbye!</a> les raisons qui l’ont poussé à créer un nouveau framework de mocks &#8211; <a
href="http://code.google.com/p/mockito/">Mockito</a> &#8211; en partant d’un fork d’<a
href="http://www.easymock.org/">EasyMock</a>.<br
/> Il reproche aux autres frameworks de mocks d’utiliser le pattern expect-run-verify (description des attentes &#8211; exécution &#8211; vérification) :</p><ul><li>les attentes sont décrites avant l’exécution, ce qui n’est pas intuitif</li><li>les mocks nécessitent d’enregistrer des interactions pour fonctionner même si on n’a pas besoin de les tester</li><li>les tests sont fragiles, sont souvent cassés par l’ajout d’une fonctionnalité</li><li>les attentes (expect) et le bouchonnage (stub) sont mélangés, ce qui nuit à la lisibilité du code</li><li>si les attentes étaient remplacées par des assertions, il n’y aurait plus besoin de déchiffrer la pile d’exécution en cas d’erreur pour retrouver la ligne de code correspondante</li></ul><p>Mockito se veut plus souple et plus simple, comme le veut le principe <a
href="http://fr.wikipedia.org/wiki/KISS-principe">KISS</a> de la culture XP.<br
/> Cette <a
href="http://code.google.com/p/mockito/wiki/MockitoVSEasyMock">comparaison avec EasyMock</a> donne une idée du gain de lisibilité.</p><p>Côté limitations Mockito ne permet pas faire de mock sur :</p><ul><li>les classes ou méthodes final (Mockito s’appuie cglib)</li><li>les méthodes equals(), hashCode(), toString()</li></ul><p>On regrette toutefois que Mockito ne soit pas sur le repository maven (encore la <a
href="http://code.google.com/p/mockito/issues/detail?id=1">faute</a> de cglib) !</p><h4><a
name="JSF"></a>JSF, répétition de la mésaventure des EJB 2 ?</h4><p>Les EJB ont inauguré la série “Le pire du mal” avec <a
href="http://www.amazon.com/J2EE-AntiPatterns-Bill-Dudney/dp/0471146153">J2EE AntiPatterns</a> et autres <a
href="http://www.amazon.com/Bitter-EJB-Bruce-Tate/dp/1930110952/ref=pd_bxgy_b_img_a">Bitter EJB</a>. TheServerSide a trouvé un successeur avec <a
href="http://www.theserverside.com/news/thread.tss?thread_id=48457">JSF Anti-Patterns and Pitfalls</a>. On y découvre qu’on peut avoir mal au PhaseListener, qu’il y de nombreux faux-amis du thread-safe, que l’overdose de XML guette et qu’il ne faut pas oublier la “View State Encryption”.</p><p>Nous décernons le “JSF trick d’or” au “View State Encryption” pour <a
href="http://wiki.apache.org/myfaces/Secure_Your_Application">My Faces Wiki : Secure your application</a> qui nous recommande un merveilleux secret d’encryption qu’on choisit “au hasard”, puis que l’on passe à la moulinette base64, et que l’on stocke enfin en dur dans <tt>faces-config.xml</tt>. Mais attention ! la taille du secret doit être de huit caractères pour un chiffrement <a
href="http://fr.wikipedia.org/wiki/Data_Encryption_Standard">DES</a> ou de seize pour <a
href="http://fr.wikipedia.org/wiki/Blowfish">Blowfish</a>; pas un de moins, pas un de plus…<br
/> JSF condamné ? Il ne faut pas préjuger de l’avenir. Malgré les critiques innombrables, certains ténors voient toujours en JSF l’avenir des pages web en java. En revanche, si JSF venait à péricliter, personne ne pourra dire qu’il ne savait pas … et JSF 2 est prédit très incompatible avec JSF 1.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2008/03/03/revue-de-presse-xebia-46/feed/</wfw:commentRss> <slash:comments>4</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>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>
