Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
enseignement:d35:tp:jsf [2018/11/09 10:21] Emmanuel Brunoenseignement:d35:tp:jsf [2023/09/20 18:52] (Version actuelle) – modification externe 127.0.0.1
Ligne 1: Ligne 1:
 +====== 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
 +<konsole>
 +git clone git@github.com:emmanuelbruno/simplejsf.git simplejsf
 +cd simplejsf
 +</konsole>
 +
 +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. [[maven:archetypegenerate]] pour plus de détails)
 +<konsole>
 +mvn clean archetype:create-from-project
 +cd target/generated-sources/archetype
 +</konsole>
 +
 +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. [[maven:mavenrepository]]).
 +<konsole>
 +mvn clean install
 +</konsole>
 +
 +Ensuite autant de projets que l'on souhaite peuvent être créés à partir de l'archetype, ** A partir d'un autre répertoire ** :
 +<code>
 +mvn archetype:generate \
 +    -DarchetypeCatalog=local \
 +    -DgroupId=fr.univtln.d35.hellojsf \
 +    -DartifactId=hellojsf  \
 +    -Dversion=1.0-SNAPSHOT \
 +    -DarchetypeGroupId=fr.univtln.d35.hellojsf \
 +    -DarchetypeArtifactId=hellojsf-archetype
 +</code>
 +
 +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é. 
 +
 +<note warning>
 +Attention actuellement, une incompatibilité oblige l'utilisation de [[http://mir2.ovh.net/ftp.apache.org/dist/maven/maven-3/3.0.5/binaries/apache-maven-3.0.5-bin.tar.gz|maven 3.0.5]]
 +<konsole>
 +export MAVEN_HOME=~/apache-maven-3.0.5
 +export PATH=$MAVEN_HOME/bin:$PATH
 +mvn -version
 +</konsole>
 +</note>
 +
 +L'exécution est très simple. La première exécution prend du temps à cause de téléchargement de nombreuses librairies.
 +<konsole>
 +cd hellojsf
 +mvn package embedded-glassfish:run
 +</konsole>
 +
 +<note tip>
 +Exécuter et tester l'appliction HelloJSF. Elle est accessible à l'adresse http://localhost:7070/hellojsf
 +</note>
 +
 +===== 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.
 +<code java>
 +public void logout() throws IOException {
 +        ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
 +        ec.invalidateSession();
 +        ec.redirect(ec.getRequestContextPath() + "/index.html");
 +    }
 +</code>
 +
 +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.
 +
 +<konsole>
 +mvn package && asadmin redeploy --name hellojsf target/hellojsf.war                 
 +</konsole>
 +
 +<note tip>
 +Déployer l'application sur le serveur glassfish que vous avez installé (via l'interface web ou en ligne de commande). 
 +</note>
 +
 +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é [[http://cargo.codehaus.org/Maven2+plugin|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]] :
 +<code>
 + mvn archetype:generate \
 +    -DarchetypeCatalog=local \
 +    -DgroupId=fr.univtln.d35.hellojsf \
 +    -DartifactId=hellojsf  \
 +    -Dversion=1.0-SNAPSHOT \
 +    -DarchetypeGroupId=fr.univtln.d35.hellojsf \
 +    -DarchetypeArtifactId=hellojsf-archetype
 +</code>
 +
 +<note>
 +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. </note>
 +
 +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.
 +
 +<note>
 +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é.
 +</note>
 +
 +
 +===== Pour aller plus loin =====
 +Vous pouvez maintenant approfondir vos connaissances en suivant les parties suivantes du tutoriel de JavaEE7 :
 +
 +  * https://docs.oracle.com/javaee/7/tutorial/jsf-intro.htm
 +  * https://docs.oracle.com/javaee/7/tutorial/jsf-facelets.htm
 +  * https://docs.oracle.com/javaee/7/tutorial/jsf-el.htm
 +
 +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. 
 +
 +{{tag>D35 TP Java JavaEE Glassfish }}
 +
  
 ---- struct data ---- ---- struct data ----