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
Aucun trackbacks pour l'instant