versions-maven-plugin : notification des mises a jour de librairies et plugins
Actuellement je bosse sur des application web jsf2 et/ou java EE 6. Les librairies ne sont pas encore figées, donc de nombreux mises à jour arrivent régulièrement.
Le plugin maven version-maven-plugin peut vous informer facilement des mises à jour. de librairies, et même des plugins
Celui-ci a été releasé le 23 août dernier en version final 1.0.
Je vous propose maintenant de mettre en place ce plugin lors de l'execution du goal install sur vos projets.
Ecriture d'un plugin maven en groovy

J'ai eu la chance d'avoir il y a peu une formation à la création de plugin maven par arnaud grand gourou maven. Cependant, je n'avais pas encore eu l'occasion de mettre vraiment la main à la pâte. Je dois bosser la semaine prochaine sur un plugin maven codé en groovy et j'ai besoin de passer par la case départ pour bien comprendre comment cela fonctionne. Cet article est ma case départ...
Webapp avec maven et JSF
Pourquoi JSF ?
Si je n’avais droit qu’à une phrase pour répondre à cette question, je dirais “Simplifier le développement rapide d’interface riche, tout en facilitant la maintenance”. Et maintenant que je ne suis plus limité à une seule phrase, je dirais :
Système de templating évolué (myFaces),
Rendre une application web riche (R.I.A.) avec RichFaces,
Développement rapide grâce aux composants html fournis (liste extensible)
Application M.V.C
Bien d’autres encore…
Mise en place de la servlet JSF
web.xml
… <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.htm</url-pattern> </servlet-mapping>
Dans la plupart des exemples, on peut voir des patterns d’urls du types *.faces, je ne vois pas vraiment l’intérêt de faire connaître à nos visiteurs le type de technologie utilisées. Question sécurité de l’application, mieux vaut en dire le moins possibles, donc, j’ai utilisés *.htm (même si ce n’est pas du contenu statique).
Les dépendances suivantes sont à ajouter dans pom de la webapp (nécessaires pour le bon fonctionnement de la servlet
Pom.xml (webapp)
… <dependency> <groupId>javax.faces</groupId> <artifactId>jsf-impl</artifactId> <version>1.2_08</version> </dependency> <dependency> <groupId>javax.faces</groupId> <artifactId>jsf-api</artifactId> <version>1.2_08</version> </dependency> …
Première page JSF helloWorld (index.jsp)
<%@ taglib uri=”http://java.sun.com/jsf/html” prefix=”h” %> <%@ taglib uri=”http://java.sun.com/jsf/core” prefix=”f” %> <html> <head> <title>Hello World</title> </head> <body> <f:view> <h1>Hello world</h1> </f:view> </body> </html>
Mettre en place une redirection pour la première page
Lorsque l’on tape dans son navigateur http://localhost:8080/seriestv-war/, et si notre première page JSF s’appelle index.jsp, le serveur essaye de nous afficher directement la page index.jsp, ce qui nous envoie au final l’exception java.lang.RuntimeException : Cannot find FacesContext. En gros, il nous manque le contexte JSF, un peu normal, nous ne sommes pas passé par la servlet (pour rappel le filtre est *.htm), mettre le filtre à *.jsp ne fonctionne pas non plus. Nous allons donc ajouter deux choses pour que cela fonctionne :
web.xml
… <welcome-file-list> <welcome-file>default.jsp</welcome-file> </welcome-file-list> …
et le code de notre page default.jsp
<jsp:forward page=”index.htm”/>
Afficher la valeur d’un managed bean dans une page JSF
Afin de pouvoir afficher les valeurs des propriétés d’un managed bean dans une page JSF il faut auparavant déclarer celui-ci dans le fichier de configuration JSF (faces-config.xml)
… <managed-bean> <managed-bean-name>serieBean</managed-bean-name> <managed-bean-class>com.cestpasdur.seriestv.managedbeans.SerieBean</managed-bean-class> <managed-bean-scope>request</managed-bean-scope> </managed-bean> …
Ensuite ce managed bean doit être un pojo, donc ces propriétés doivent être accessibles via … des accesseurs.
Vous pouvez ajouter une propriété bidon ainsi que ses accesseurs dans notre managed bean afin de vérifier que notre application JSF fonctionne correctement.
…
private String test="damien";
public String getTest() {
return test;
}
public void setTest(String test) {
this.test = test;
…
}
Maintenant que tout est prêt, nous devons maintenant afficher cette propriétés dans notre page JSF :
<h:outputText value="#{serieBean.test}"/>
Pas besoin de redémarrer le serveur, normalement jetty a pris en compte à chaud vos modifications, actualisez la page, ca marche.
C’est ok, sur jetty, mais nous voudrions voir si c’est portable sur un serveur d’application plus usité en production comme jboss
Au démarrage du serveur, nous obtenons l’exception suivante :
java.lang.ClassCastException : com.sun.faces.config.WebConfiguration
Boss inclut déjà dans son classPath sa propre implémentation de JSF, mais jetty lui en a besoin pour fonctionner. Afin que les deux cas fonctionnent, nous allons ajouter un profil, qui nous permettra selon son activation ou non, de faire certaines adaptations. Pour jboss, nous devons juste surcharger le scope qui est a compile par defaut avec les lignes suivantes dans le pom du war :
<profiles>
<!–- profil permettant de surcharger les scopes lors de la création du war pour jboss -–>
<profile>
<id>jboss</id>
<dependencies>
<dependency>
<groupId>javax.faces</groupId>
<artifactId>jsf-impl</artifactId>
<version>1.2_08</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>1.2_08</version>
<scope>provided</scope>
</dependency>
</dependencies>
</profile>
</profiles>
Afin de l’utiliser, nous allons utiliser la commande suivante :
mvn clean install -Pjboss
Le war passe de 1 Mo à 8 ko, je pense que c’est bon. Si on teste sur jboss, désormais, çà fonctionne…
A ce point je vous encourage à continuer et ajouter une dataTable dans votre page JSF ainsi que les données correspondantes dans le managed bean.
Ajouter le support de richFaces
Ajouter le repository suivant dans le pom parent du projet :
<!–- Needed for RichFaces -–> <repository> <id>jboss.org</id> <url>http://repository.jboss.org/maven2/</url> </repository>
Afin de récupérer les dépendances dont nous avons besoin, nous devons ajouter dans le pom du war :
<!-- dependances richfaces --> <dependency> <groupId>org.richfaces.ui</groupId> <artifactId>richfaces-ui</artifactId> <version>3.2.0.GA</version> </dependency>
Afin de nettoyer le classPath et télécharger les dépendances nécessaires :
mvn clean eclipse:eclipse
… <!-- Filter added for richfaces --> <filter> <display-name>RichFaces Filter</display-name> <filter-name>richfaces</filter-name> <filter-class>org.ajax4jsf.Filter</filter-class> </filter> <filter-mapping> <filter-name>richfaces</filter-name> <servlet-name>Faces Servlet</servlet-name> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> <dispatcher>INCLUDE</dispatcher> </filter-mapping> …
Maintenant afin ajouter dans notre page un composant que je trouve assez sympa sur richfaces, le calendar, nous devons ajouter une taglib à celui-ci :
<%@taglib uri=”http://richfaces.org/rich” prefix=”rich”%>
Et maintenant, afin d’afficher le calendar dans la page JSF, nous ajouterons :
… <f:view> … <rich:calendar></rich:calendar> … </f:view> …
Je vous invite à consulter le 3 ème lien en référence afin de voir la démo de ce que l’on peut faire avec richfaces Accès au code source :
Le code source complet est disponible ici :
- http://www.cestpasdur.com/svn/webapp-maven-jsf/trunk/
- login : anonymous
- mot de passe : guest
- copie en ligne de commande : svn co http://www.cestpasdur.com/svn/webapp-maven-jsf/trunk/
Références :
http://www.lulu.com/items/volume_62/1080000/1080910/2/print/Java-Maven-Eclipse-JSF-Tutorial.pdf
http://www.exadel.com/tutorial/jsf/jsftutorial-kickstart.html
http://livedemo.exadel.com/richfaces-demo/index.jsp
Webapp avec maven, JSF, facelets
Ce tutorial est dans la logique des précédents. Nous allons ajouter une difficulté supplémentaire qui vous permettra ensuite d’utiliser les fonctionnalités puissantes de templating. Maintenant que j’y ai goûté, j’aurais du mal à m’en passer.
Code
Ajouter dans le pom du war
<!-- Dependances facelets -–> <dependency> <groupId>com.sun.facelets</groupId> <artifactId>jsf-facelets</artifactId> <version>1.1.9</version> </dependency>
Entêtes des pages xhtml
Toutes les pages xhtml étant du xml, si vous souhaitez utiliser des taglibs au sein de cell-ci, il va falloir les déclarer, mais pas de la manière habituelle utilisée dans les JSP (non valide xml)
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html">
Ajout dans le faces-config.xml, celui ci indique que facelets est défini comme gestionnaire de vue.
<application>
<view-handler>com.sun.facelets.FaceletViewHandler</view-handler>
</application>
L’élèment html est utilisé pour déclarer tous les namespaces. L’exemple indiqué est loin d’être exaustif. Pour info, cette notation et prise en compte différement selon l’IDE. MyEclipse (dans sa version 6) ne le comprend pas. Je vous conseille d’utiliser jboss-tools, surtout si vous voulez ensuite utiliser les librairies de richfaces.
Découpage des pages web en templates & includes
- default.jsp : page de redirection
- index.xhtml page “templatées” que nous souhaitons afficher
- Layout.xhtml : template de page mettant en place les includes ci-dessous
- header.xhtml : entête de page réutilisable
- menu.xhtml : menu réutilisable
- footer.xhtml : pied de page réutilisables
Index.xhtml
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Strict//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”
xmlns:ui=”http://java.sun.com/jsf/facelets”
xmlns:h=”http://java.sun.com/jsf/html”>
<ui:composition template=”/WEB-INF/templates/layout.xhtml”>
<ui:define name=”titre”>Tutorial facelets</ui:define>
<p><strong>Appel au managed bean : <h:outputText
value=”#{serieBean.test}”></h:outputText></strong></p>
<ui:define name=”contenu”>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
Nulla erat. Proin augue metus, vulputate at, ullamcorper eu, accumsan non, leo. Sed eu magna nec massa consectetuer consequat. Mauris ipsum dolor, ullamcorper sed, lacinia eget, sagittis non, mauris. Sed molestie, augue id fermentum consequat, nibh tellus fermentum est, id gravida nunc nisi in diam. Vestibulum eu dui sed nibh posuere faucibus. Donec tristique elementum leo. Integer tellus. Nunc malesuada eros non purus. Mauris ac lectus. Proin venenatis libero vel eros. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin tortor turpis, elementum a, ornare in, vulputate eget, tellus. </ui:define>
</ui:composition>
</html>
ui:composition va spécifier le template que nous allons utiliser
ui:define transmet à ce layout une valeur qui va pouvoir utiliser pour valoriser la variable associée
Layout.xhtml
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Strict//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd”> <html xmlns=”http://www.w3.org/1999/xhtml” xmlns:ui=”http://java.sun.com/jsf/facelets”> <head> <title><ui:insert name=”titre”>Default title</ui:insert></title> </head> <body> <ui:include src="header.xhtml"/> <ui:include src="menu.xhtml"/> <div id=”contenu”><ui:insert name=”contenu”> </ui:insert></div> <ui:include src=”footer.xhtml”/> </body> </html>
ui:include comme vous l’aurez compris est un simple include (mais doit rester valide xml)
ui:insert est associé à un:define, celui ci va réutiliser la variable fournie, et l’afficher.
Accès au code source :
Le code source de l’application est disponible ici :
http://www.cestpasdur.com/svn/webapp-maven-jsf-facelets/trunk/
Références
https://facelets.dev.java.net/nonav/docs/dev/docbook.html
http://www-128.ibm.com/developerworks/java/library/j-facelets/
