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

USER
git clone git@github.com:emmanuelbruno/simplejsf.git simplejsf cd simplejsf

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)

USER
mvn clean archetype:create-from-project cd target/generated-sources/archetype

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)).

USER
mvn clean install

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é.

Attention actuellement, une incompatibilité oblige l’utilisation de maven 3.0.5
USER
export MAVEN_HOME=~/apache-maven-3.0.5 export PATH=$MAVEN_HOME/bin:$PATH mvn -version

L’exécution est très simple. La première exécution prend du temps à cause de téléchargement de nombreuses librairies.

USER
cd hellojsf mvn package embedded-glassfish:run

Exécuter et tester l’appliction HelloJSF. Elle est accessible à l’adresse http://localhost:7070/hellojsf

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 :

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 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).

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.

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.

Dans ce cadre de ces TP nous utiliserons le serveur d’application JEE glassfish.

USER
mvn package && asadmin redeploy –name hellojsf target/hellojsf.war

Déployer l’application sur le serveur glassfish que vous avez installé (via l’interface web ou en ligne de commande).

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.

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
Ajouter le projet EJB comme une dépendance du projet JSF. Injecter une instance de 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.

Transformer la classe 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é.

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.