D35 - TP4 - JSF
L’objectif de ce TP est d’être une premier contact avec les applications JEE au travers de JSF et de CDI.
Quand des projets présentent une structure complexe et répétitive (ce qui est le cas avec JEE), Maven offre un outils très puissant les archetypes (modèles de projets). Nous allons voir qu’il est très simple de créer ses propres modèles.
Il faut tout d’abord obtenir ou créer un projet qui servira de modèle
Ce projet de base de peut ensuite être modifié pour être un modèle le plus général possible. La création d’un archetype est très simple (cf. Fabriquer un archetype Maven pour plus de détails)
L’archetype doit être installé dans le repository local avec d’être utilisé. Dans l’idéal l’archetype est publié sur un repository maven central ou privé (cf. Utiliser un repository Maven (Artifactory)).
Ensuite autant de projets que l’on souhaite peuvent être créés à partir de l’archetype, A partir d’un autre répertoire :
mvn archetype:generate \ -DarchetypeCatalog=local \ -DgroupId=fr.univtln.d35.hellojsf \ -DartifactId=hellojsf \ -Dversion=1.0-SNAPSHOT \ -DarchetypeGroupId=fr.univtln.d35.hellojsf \ -DarchetypeArtifactId=hellojsf-archetype
Pour pouvoir exécuter cette application web, il faut maintenant la déployer dans un serveur d’application. Une approche classique pour effectuer des tests est d’utiliser maven pour déployer automatiquement l’application dans un serveur d’application embarqué.
L’exécution est très simple. La première exécution prend du temps à cause de téléchargement de nombreuses librairies.
Etude de Hello JSF
Le projet qui vient d’être créé peut être ouvert dans votre IDE.
La configuration de base de projet est indiquée dans le pom.xml
. Regarder en particulier les dépendances javax:javaee-web-api
et org.primefaces:primefaces
.
JSF s’appuie sur le modèle MVC, nous allons balayer les différents composants :
Le modèle
Habituellement le modèle est composé de POJO Java, d’entités (au sens JPA) et d’entreprise Java Beans qui implantent les aspects métiers. Dans cet exemple simple, il n’y a pas de modèle, celui-ci sera étudié dans le prochain cours.
Le contrôleur
Le contrôleur est composé de deux parties.
Un servlet Java qui assure la communication Navigateur web/Java. Celle-ci est générée automatiquement et configurée dans le fichier src/main/webapp/WEB-INF/web.xml
.
La classe src/main/java/fr/univtln/d35/hellojsf/HelloBean.java
implante la partie contrôleur associée à un composant de la vue. Il s’agit ici d’un CDI Bean annoté par @Named
qui peut être injecté ailleurs dans l’application et en particulier dans la vue au travers du langage EL. Il est aussi possible d’utiliser un backing bean (annoté par ManagedBean) mais son utilisation est moins générale et n’est plus recommandée. Attention, en cas d’utilisation de CDI, l’application ne peux plus être déployée directement dans de simples serveurs d’application web (tomcat par exemple) sans y ajouter les librairies nécessaire à CDI.
La cycle de vie du bean est annoté par @SessionScoped
(cf. https://docs.oracle.com/javaee/7/tutorial/cdi-basic008.htm).
La vue
Avec JSF, la vue est composé de documents HTML utilisant un langage étendu et extensible. Ces documents sont appelés des facelets.
Le document src/main/webapp/welcome.xhtml
présente un composant de la vue. Il est intégré dans un template (src/main/webapp/templates/mainTemplate.xhtml
)) partagé entre plusieurs composants. <h:outputLabel value=“#{helloBean.message}”/>
est un widget et fait appel au langage EL pour faire un lien entre la vue et la valeur de l’attribut message d’une instance de la classe nommée HelloBean.
Le document src/main/webapp/changeMessage.xhtml
montre comment un formulaire peut être défini et validé (côté client). Nous verrons plus tard qu’il est aussi possible de valider côté serveur via le bean.
Un exercice : ajouter un Logout
Ajouter la méthode suivante au contrôleur.
public void logout() throws IOException { ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext(); ec.invalidateSession(); ec.redirect(ec.getRequestContextPath() + "/index.html"); }
Modifier la vue pour ajouter un bouton logout dans le template qui appelle cette méthode sur une instance du contrôleur.
Mise en place de l'environnement de travail
Dans ce cadre de ces TP nous utiliserons le serveur d’application JEE glassfish.
Il est aussi possible d’utiliser le plugin maven pour glassfish pour paramétrer une instance autonome de glassfish et déployer automatiquement https://maven-glassfish-plugin.java.net/examples/complete.html.
Pour une utilisation avancée, un framework appelé cargo fourni un plugin maven qui offre une interface unifiée entre différents serveurs d’applications.
JSF et EJBs
Créer un projet JSF à partir de l’archetype utilisé dans tp3 :
mvn archetype:generate \ -DarchetypeCatalog=local \ -DgroupId=fr.univtln.d35.hellojsf \ -DartifactId=hellojsf \ -Dversion=1.0-SNAPSHOT \ -DarchetypeGroupId=fr.univtln.d35.hellojsf \ -DarchetypeArtifactId=hellojsf-archetype
NewSessionBean
(soit avec @Inject
en indiquant que la variable est transient
, soit avec @EJB
) dans le backing bean du projet JSF pour fournir le message d’origine.
Le projet peut être testé avec mvn package embedded-glassfish:run
et en consultant : http://localhost:7070/hellojsf
. Il peut aussi être déployé sur un glassfish autonome.
NewSessionBean
pour gérer le compteur et le changement de message.
Adapter le backing bean pour supprimer tout les traitement “métiers” qui seront délégués au bean injecté.
Pour aller plus loin
Vous pouvez maintenant approfondir vos connaissances en suivant les parties suivantes du tutoriel de JavaEE7 :
En utilisant les concepts étudiés mettez en place une Ihm Web permettant de créer des instances, de consulter et d’interagir avec les classes que vous avez mises en place lors du TP de révision ou pour votre mini projet.