Java Server Faces LPRO CMSII Olivier FLAUZAC [email protected] http://cosy.univ-reims.fr/flauzac 1 lundi 5 décembre 11 Plan • Présentation • Managed Bean • Génération de composants et navigation 2 lundi 5 décembre 11 Présentation 3 lundi 5 décembre 11 JSF ? • Java Server Faces • Conception dirigées par : • les composants • les événements • les beans gérés • les interactions • Conception non dirigée par : • les requêtes • les réponses 4 lundi 5 décembre 11 Objectifs • Simplifier le développement • Accélérer la conception • Offrir un ensemble de composants graphiques : • listes • zones de textes • composants • Mise en place d’une approche RAD 5 lundi 5 décembre 11 Architecture • Intégration des techniques de visualisation • Construction des pages selon des templates 6 lundi 5 décembre 11 Cycle de vie 7 lundi 5 décembre 11 Moteur de rendu Faces Servlet Fonctionnement XHTML composant composant composant bean géré configuration 8 lundi 5 décembre 11 convertisseur validateur Facesservlet • Servlet «système» • Instancié par le système • Gestion des requêtes • Intégration dans la configuration (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>/faces/*</url-pattern> </servlet-mapping> 9 lundi 5 décembre 11 TECHNOLOGIES CONNEXES • Convertisseurs • assure la conversion des chaînes issus des formulaires vers d’autres données : • String -> int • String -> float • ... • Validateurs • valide les données entrées dans les formulaires • Bean Gérés • données instanciées par le système 10 lundi 5 décembre 11 Managed Bean 11 lundi 5 décembre 11 Managed bean • Bean java instanciés par le système • intégré dans la configuration • géré par le moteur • associé à une portée • Accessible dans sa portée par une expression EL • Assure le modèle de l’application • Lié aux tags des facelets 12 lundi 5 décembre 11 Exemple le Managed Bean package MB; import javax.inject.Named; import javax.enterprise.context.SessionScoped; import java.io.Serializable; @Named(value = "hello") @SessionScoped public class Hello implements Serializable { private String s; public Hello() { s = "Salut les amis"; } String getS() { return s; } public void setS(String s) { this.s = s; } } 13 lundi 5 décembre 11 Le JSF associé <?xml version='1.0' encoding='UTF-8' ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html"> <h:head> <title>Facelet Title</title> </h:head> <h:body> Le bean géré dit : #{hello.s} </h:body> </html> 14 lundi 5 décembre 11 Structure des managed Bean • Structure simple • types de bases • constructeur par défaut • setter / getter • Composition • composition d’objets • nécessité de construire les objets composés • setter / getter de l’objet et de ses objets composés 15 lundi 5 décembre 11 Managed Bean complexe • Bean Utilisateur • nom , prénom , adresse • panier • préférences • ... 16 lundi 5 décembre 11 Génération de composants et navigation 17 lundi 5 décembre 11 Création de JSF • Utilisation de tags spécifiques (facelets) • Tag : • aspect graphique • traitement associé • Utilisation des EL • Vers un code sans HTML • Génération possible de HTML, XUL ... 18 lundi 5 décembre 11 Bibliothèques de tag Bibliothèque JSF HTML Tag Bibliothèque http://java.sun.com/jsf/html prefix Contenu h: composants html actions personnalisées JSF Core Tag http://java.sun.com/jsf/core f: JSTL Core tag lib http://java.sun.com/jsp/jstl/core c: JSTL function tag lib http://java.sun.com/jsp/jstl/functions 19 lundi 5 décembre 11 fn: Exemples <h:outputLink value="http://www.google.Fr"> vers google </h:outputlink> <h:graphicImage id="monImage" url="fichierIMage"/> <h:outputLabel value="Salut les amis"/> 20 lundi 5 décembre 11 Le cas des actions de formulaires • Possibilité de définir dans le tag l’action sur un bean • exécution d’une méthode d’un bean • appel à un setter • Définition de la navigation • dans le tag • dans l’action du bean 21 lundi 5 décembre 11 Une simple navigation Ajout à Hello.java public String deplacement(){ s = "Hello les copains"; return "icietla"; } Ajout au fichier xhtml <h:commandButton value="hop" action="#{hello.deplacement}"/> 22 lundi 5 décembre 11 Une simple navigation : la destination icietla.xhtml ... <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html"> <h:head> </h:head> <h:outputLabel value="#{hello.s}":> </h:body> </html> ... 23 lundi 5 décembre 11 Accès aux éléments Le bean personne @Named(value = "personne") @SessionScoped public class Personne implements Serializable { private String nom; private String prenom; private int naissance; public Personne() { this.nom = null; this.prenom = null; this.naissance = 0; } public String getNom() { return nom; } public void setNom(String nom) { this.nom = nom; } public String getPrenom() { return prenom; } public void setPrenom(String prenom) { this.prenom = prenom; } public int getNaissance() { return naissance; } public void setNaissance(int naissance) { this.naissance = naissance; } } 24 lundi 5 décembre 11 Accès aux éléments Le formulaire <h:form> <h:inputText value="#{personne.nom}"/> <h:inputText value="#{personne.prenom}"/> <h:inputText value="#{personne.naissance}"/> <h:commandButton value="hop" action="affich"/> </h:form> • Utilisation implicite d’un convertisseur : • String --> int pour naissance • Convertisseurs de types élémentaires 25 lundi 5 décembre 11 Accès aux éléments affich.xhtml <ul> <li> #{personne.nom} </li> <li> #{personne.prenom} </li> <li> #{personne.naissance} </li> </ul> 26 lundi 5 décembre 11 Actions • Accès aux propriétés des bean • Invocation de méthodes d’EJB • Invocation de Web Services • Accès à des données : • bases de données • fichiers • annuaires 27 lundi 5 décembre 11 Validation • Possibilité de définir les règles de validation dans la déclaration • champ obligatoire • fourchette de valeur • ... <h:form> <h:inputText label="nom" value="#{personne.nom}" required="true"/> <h:inputText label="prénom" value="#{personne.prenom}" required="true"/> <h:inputText label="Date de naissance" value="#{personne.naissance}" required="true"> <f:validateLongRange maximum="2011" minimum="1900"/> </h:inputText> <h:commandButton value="hop" action="affich"/> </h:form> 28 lundi 5 décembre 11