Vous êtes sur la page 1sur 155

JSF et Seam

Matthieu Exbrayat, Universit d'Orlans


JSF et Seam - M. Exbrayat - 2009-2011

Introduction

Un framework pour la couche prsentation Monde Java (Java EE 5) JSF (Java Server Faces)

Annotation dans les JSP Code mtier dans des Java Beans Surcouche JSF Code mtier dans des EJB (par dfaut) Intgre de nombreux lments de gestion complmentaires (workflow, persistance, etc.)
2

JSF et Seam - M. Exbrayat - 2009-2011

Seam

(Quelques) sources

Mickael Baron : Tutorial JSF

http://www.jsftoolbox.com/documentation/seam http://docs.jboss.org/seam/latest/reference/enUS/html/tutorial.html http://www.jsftoolbox.com/documentation/seam

Jboss : Tutorial Seam

Documentation seam

JSF et Seam - M. Exbrayat - 2009-2011

JSF

Il s'agit d'une spec Sun


JSR-127 (version 1.1) puis JSR-252 (1.2) Sun Reference : http://java.sun.com/javaee/javaserverfaces Apache MyFaces : http://myfaces.apache.org Apache fournit une version augmente : Tomahawk

Il existe plusieurs implmentations, dont :


JSF et Seam - M. Exbrayat - 2009-2011

Principe

Ajout de balises JSP dans des JSP Invocation de page .jsf


il faut bloquer l'accs direct la jsp L'invocation de la jsp se fait en interne, avec interprtation des balises JSF http://localhost:8080/monappli/faces/acceuil.jsp http://localhost:8080/monappli/accueil.jsf

Autre option : /faces/...


JSF et Seam - M. Exbrayat - 2009-2011

Comme d'habitude, suppose une compilation sous forme de servlets


5

Principe (en dtail)


1. Construire le formulaire dans une page JSP en utilisant les balises JSF 2. Dvelopper un Bean qui effectue un Mapping avec les valeurs du formulaire 3. Modifier le formulaire pour spcifier laction et lassocier au Bean 4. Fournir des Converters et des Validators pour traiter les donnes du formulaire
JSF et Seam - M. Exbrayat - 2009-2011

5. Paramtrer le fichier faces-config.xml pour dclarer le Bean et les rgles de navigation 6. Crer les pages JSP correspondant chaque condition de retour 7. Protger les pages JSP utilises par le contexte JSF de faon viter dy accder directement

Configuration de web.xml

Paramtrer le contrleur (servlet principale)

javax.faces.webapp.FacesServlet javax.faces.application.CONFIG_FILES Exemple : /WEB-INF/faces-config.xml javax.faces.STATE_SAVING_METHOD : client ou server com.sun.faces.validateXml Valeurs possibles : true ou false (dfaut : false) com.sun.faces.verifyObjects : true ou false (dfaut : false)
7

Nom et le chemin du fichier de configuration


Spcifie ltat de lapplication doit tre sauv

JSF et Seam - M. Exbrayat - 2009-2011

Valider ou pas les fichiers XML


Cration de tous les objets au dploiement (dmarrage)

Paramtrage de l'appli JSF


... <context-param> <param-name>com.sun.faces.validateXml</param-name> <param-value>true</param-value> </context-param> <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> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.faces</url-pattern> </servlet-mapping> ... ou *.jsf
8

JSF et Seam - M. Exbrayat - 2009-2011

Blocage de l'accs direct aux JSP


... <context-param> <param-name>com.sun.faces.validateXml</param-name> <param-value>true</param-value> </context-param> ... <security-constraint> <web-resource-collection> <web-resource-name>No-JSF-JSP-Access</web-resource-name> <url-pattern>/welcome.jsp</url-pattern> <url-pattern>/form1.jsp</url-pattern> <url-pattern>/accepted.jsp</url-pattern> <url-pattern>/refused.jsp</url-pattern> <url-pattern>...</url-pattern> </web-resource-collection> <auth-constraint> <description>Pas de rles, donc pas daccs direct</description> </auth-constraint> </security-constraint> ...

JSF et Seam - M. Exbrayat - 2009-2011

Fichier de configuration : faces-config.xml

Plac dans le rpertoire WEB-INF

Fichier XML dcrit par une DTD (version 1.1) ou un schma (1.2). Balise de dpart : <faces-config> Beans manags <managed-bean> Rgles de navigation <navigation-rule> Ressources ventuelles suite des messages <messagebundle> Configuration de la localisation <resource-bundle> Configuration des Validators et des Converters <validator> <converter> Autres lments lis des nouveaux composants JSF <render-kit>
10

six principaux lments :


JSF et Seam - M. Exbrayat - 2009-2011

JSF et Seam - M. Exbrayat - 2009-2011

<?xml version='1.0' encoding='UTF-8'?> <?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE faces-config PUBLIC <!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN" "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN" "http://java.sun.com/dtd/web-facesconfig_1_1.dtd"> "http://java.sun.com/dtd/web-facesconfig_1_1.dtd"> <faces-config> <faces-config> <navigation-rule> <navigation-rule> ... ... </navigation-rule> </navigation-rule> <managed-bean> <managed-bean> ... ... </managed-bean> </managed-bean> </faces-config> </faces-config>

Pour plus de dtails :

http://www.horstmann.com/corejsf/faces-config.html
11

Rubrique JSF dans une JSP


CORE : vue HTML : composants JSF Tout composant JSF est encapsul dans une vue

<core:view> ....</core:view> http://java.sun.com/javaee/javaserverfaces/1.2_MR1/docs/tldd ocs http://www.horstmann.com/corejsf/jsf-tags.html

Refs :

JSF et Seam - M. Exbrayat - 2009-2011

Il existe des tags supplmentaires (eg tomahawk)

12

Structure de base de la JSP


<%@taglib uri="http://java.sun.com/jsf/core" prefix="core" %> <%@taglib uri="http://java.sun.com/jsf/html" prefix="html" %> ... <core:view> ... </core:view>

JSF et Seam - M. Exbrayat - 2009-2011

13

JSF et Tomcat
<web-app ...> <web-app ...> JSF 1.1 ... ... <listener> <listener> <listener-class> <listener-class> org.apache.myfaces.webapp.StartupServletContextListener org.apache.myfaces.webapp.StartupServletContextListener </listener-class> </listener-class> </listener> </listener> </web-app> </web-app> <web-app ...> <web-app ...> ... JSF 1.2 (Sun) ... <listener> <listener> <listener-class> <listener-class> com.sun.faces.config.ConfigureListener com.sun.faces.config.ConfigureListener </listener-class> </listener-class> </listener> </listener> <listener> <listener> <listener-class> <listener-class> com.sun.faces.application.WebappLifecycleListener com.sun.faces.application.WebappLifecycleListener </listener-class> </listener-class> </listener> </listener>
14

JSF et Seam - M. Exbrayat - 2009-2011

Premier exemple : insrer un texte...


<%@page contentType="text/html"%> <%@page contentType="text/html"%> <%@page pageEncoding="UTF-8"%> <%@page pageEncoding="UTF-8"%> <%@taglib uri="http://java.sun.com/jsf/core" prefix="core"%> <%@taglib uri="http://java.sun.com/jsf/core" prefix="core"%> <%@taglib uri="http://java.sun.com/jsf/html" prefix="html"%> <%@taglib uri="http://java.sun.com/jsf/html" prefix="html"%> <html> <html> <head> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Hello World avec JSF</title> <title>Hello World avec JSF</title> </head> </head> <body> <body> <core:view> <core:view> <h1><html:outputText value="Hello World avec JSF" /></h1><br> <h1><html:outputText value="Hello World avec JSF" /></h1><br> La mme chose avec du HTML : :<h1>Hello World avec JSF</h1> La mme chose avec du HTML <h1>Hello World avec JSF</h1> </core:view> </core:view> </body> </body> </html> </html>

JSF et Seam - M. Exbrayat - 2009-2011

15

Web.xml
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/webapp_ xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/webapp_ 2_4.xsd"> 2_4.xsd"> <servlet> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> <load-on-startup>1</load-on-startup> </servlet> </servlet> <servlet-mapping> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <servlet-name>Faces Servlet</servlet-name> <url-pattern>/faces/*</url-pattern> <url-pattern>/faces/*</url-pattern> </servlet-mapping> </servlet-mapping> <security-constraint> <security-constraint> <display-name>Constraint1</display-name> <display-name>Constraint1</display-name> <web-resource-collection> <web-resource-collection> <web-resource-name>No-JSP-JSF-Page</web-resource-name> <web-resource-name>No-JSP-JSF-Page</web-resource-name> <url-pattern>/welcomeJSF.jsp</url-pattern> <url-pattern>/welcomeJSF.jsp</url-pattern> </web-resource-collection> </web-resource-collection> <auth-constraint> <auth-constraint> <description>Pas de rles, donc pas daccs direct</description> <description>Pas </auth-constraint> de rles, donc pas daccs direct</description> </auth-constraint> </security-constraint> </security-constraint> </web-app> </web-app>

JSF et Seam - M. Exbrayat - 2009-2011

16

Faces-config.xml

Pour cet exemple, rien prciser...

JSF et Seam - M. Exbrayat - 2009-2011

<?xml version='1.0' encoding='UTF-8'?> <?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE faces-config PUBLIC <!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN" "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN" "http://java.sun.com/dtd/web-facesconfig_1_1.dtd"> "http://java.sun.com/dtd/web-facesconfig_1_1.dtd"> <faces-config> <faces-config> </faces-config> </faces-config>

17

Un formulaire...
<%@page contentType="text/html"%> <%@page contentType="text/html"%> <%@taglib uri="http://java.sun.com/jsf/core" prefix="core"%> <%@taglib uri="http://java.sun.com/jsf/core" prefix="core"%> <%@taglib uri="http://java.sun.com/jsf/html" prefix="html"%> <%@taglib uri="http://java.sun.com/jsf/html" prefix="html"%> <html> <html> <head> <head> <title>Premier formulaire avec JSF</title> <title>Premier formulaire avec JSF</title> </head> </head> <body> <body> <core:view> <core:view> <html:form> <html:form> <html:outputText value="Adresse Email " "/><html:inputText/><br> <html:outputText value="Adresse Email /><html:inputText/><br> <html:outputText value="Mot de Passe " "/><html:inputSecret/><br> <html:outputText value="Mot de Passe /><html:inputSecret/><br> <html:commandButton value="Connecter" /> <html:commandButton value="Connecter" /> </html:form> </html:form> </core:view> </core:view> </body> </body> </html> </html>

JSF et Seam - M. Exbrayat - 2009-2011

<html:inputText> : <input type= Text> <html:inputSecret> : <input type= password> <html:commandButton> : <input type=submit>

action pour navigation

18

Les Java Beans


Java Bean : constructeur vide + getters/setters Dans JSF :


stockage des donnes formulaire affichage des donnes de la couche mtier validation de valeurs messages (pour navigation)

JSF et Seam - M. Exbrayat - 2009-2011

Dclaration dans faces-config.xml Stockage dans WEB-INF/classes

19

Dclaration du bean manag

dans faces-config.xml
... ... <navigation-rule>...</navigation-rule> <navigation-rule>...</navigation-rule> <managed-bean> <managed-bean> <managed-bean-name>MyBean</managed-bean-name> <managed-bean-name>MyBean</managed-bean-name> <managed-bean-class>mypackage.MyFirstBean</managed-bean-class> <managed-bean-class>mypackage.MyFirstBean</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> <managed-bean-scope>session</managed-bean-scope> </managed-bean> </managed-bean> ... ...

scope = none, application, session, request

JSF et Seam - M. Exbrayat - 2009-2011

20

Expression language (EL)

expression dont la valeur est calcule lors du rendu de la page #{expression} Permet l'accs tous les beans visibles de la page (scope) #{NomBean.valeur}

JSF et Seam - M. Exbrayat - 2009-2011

accs l'attribut valeur du bean NomBean par son getter Bean composite : accs aux composants par .

#{NomBean.nomcomp.valeur}

21

Objets implicites dans EL

param : lments dfinis dans les paramtres de la requte HTTP param-values : les valeurs des lments param cookies : lments dfinis dans les cookies initParam : paramtres dinitialisation de lapplication requestScope : lments dfini dans la requte facesContext : instance de la classe FacesContext View : instance de UIViewRoot

JSF et Seam - M. Exbrayat - 2009-2011

22

Objets implicites : exemple


<html> <html> <...> <...> <body> <body> <core:view> <core:view> <p><html:outputText <p><html:outputText value="#{param.test}" /></p> value="#{param.test}" /></p> <p><html:outputText <p><html:outputText value="#{cookie.JSESSIONID.value}" /></p> value="#{cookie.JSESSIONID.value}" /></p> <p><html:outputText <p><html:outputText value="#{facesContext.externalContext.requestPathInfo}" /></p> value="#{facesContext.externalContext.requestPathInfo}" /></p> <p><html:outputText <p><html:outputText value="#{facesContext.externalContext.requestServletPath}" /></p> value="#{facesContext.externalContext.requestServletPath}" /></p> </core:view> </core:view> </body> </body> </html> </html>

JSF et Seam - M. Exbrayat - 2009-2011

faces

nom de la jsp
23

Lien Bean / composant

Utilisation des EL dans la dfinition de valeur des composants Dfinition des attributs correspondants + getters/setters dans le bean La mise est jour est automatique

JSF et Seam - M. Exbrayat - 2009-2011

24

Exemple
... ... <core:view> <core:view> <html:form> <html:form> <html:outputText value="Adresse Email "/> <html:outputText value="Adresse Email "/> <html:inputText value="#{registrationbean.email}"/><br> <html:inputText value="#{registrationbean.email}"/><br> <html:outputText value="Mot de Passe "/> <html:outputText value="Mot de Passe "/> <html:inputSecret value="#{registrationbean.password}"/><br> <html:inputSecret value="#{registrationbean.password}"/><br> <html:commandButton value="Connecter" /> <html:commandButton value="Connecter" /> </html:form> </html:form> </core:view> </core:view> </body> </body> </html> </html>
JSF et Seam - M. Exbrayat - 2009-2011

public class RegistrationBean { { public class RegistrationBean private String email =="user@host"; private String email "user@host"; private String password ==""; private String password ""; public String getEmail() { {return email; } } public String getEmail() return email; public void setEmail(String t)t){ {this.email ==t;t;} } public void setEmail(String this.email public String getPassword() { {return password; } } public String getPassword() return password; public void setPassword(String t)t){ {this.password ==t;t;} } public void setPassword(String this.password }}
25

Bean : initialisation des attributs


Directement dans le bean Dans le faces-config.xml


<managed-bean> <managed-property> <property-name> de type List, Map ou Value

Pour l'initialisation (dans faces-config.xml), on peut utiliser des EL (pour objets implicites ou autres Beans)

JSF et Seam - M. Exbrayat - 2009-2011

26

Exemple : valeur
<managed-bean> <managed-bean> ... ... <managed-property> <managed-property> <property-name>email</property-name> <property-name>email</property-name> <value>user@host</value> <value>user@host</value> </managed-property> </managed-property> <managed-property> <managed-property> <property-name>name</property-name> <property-name>name</property-name> <value>your name</value> <value>your name</value> </managed-property> </managed-property> <managed-property> <managed-property> <property-name>adress</property-name> <property-name>adress</property-name> <value>your adress</value> <value>your adress</value> </managed-property> </managed-property> </managed-bean> </managed-bean>

JSF et Seam - M. Exbrayat - 2009-2011

27

Exemple : List
<managed-bean> <managed-bean> ... ... <managed-property> <managed-property> <property-name>cities</property-name> <property-name>cities</property-name> <list-entries> <list-entries> <value-class>java.lang.String</value-class> <value-class>java.lang.String</value-class> <value>Poitiers</value> <value>Poitiers</value> <value>Limoges</value> <value>Limoges</value> <value>Viroflay</value> <value>Viroflay</value> </list-entries> </list-entries> </managed-property> </managed-property> </managed-bean> </managed-bean>

JSF et Seam - M. Exbrayat - 2009-2011

<value-class> : type du contenu de la liste

28

Exemple : Map
<managed-property> <managed-property> <property-name>prices</property-name> <property-name>prices</property-name> <map-entries> <map-entries> <key-class>java.lang.String</key-class> <key-class>java.lang.String</key-class> <value-class>java.lang.Integer</value-class> <value-class>java.lang.Integer</value-class> <map-entrie> <map-entrie> <key>SwimmingPool High Pressure</key> <key>SwimmingPool High Pressure</key> <value>250</value> <value>250</value> </map-entrie> </map-entrie> </map-entries> </map-entries> ... ...
JSF et Seam - M. Exbrayat - 2009-2011

<key-class> : classe des cls <value-class> : classe des valeurs


29

Exemple : initialisation avec EL


</managed-bean> </managed-bean> <managed-bean> <managed-bean> <managed-bean-name>registrationbeanbis</managed-bean-name> <managed-bean-name>registrationbeanbis</managed-bean-name> <managed-bean-class> <managed-bean-class> beanPackage.RegistrationBeanBis beanPackage.RegistrationBeanBis </managed-bean-class> </managed-bean-class> <managed-bean-scope>request</managed-bean-scope> <managed-bean-scope>request</managed-bean-scope> <managed-property> <managed-property> <property-name>email</property-name> <property-name>email</property-name> <value>#{registrationbean.email}</value> <value>#{registrationbean.email}</value> </managed-property> </managed-property> <managed-property> <managed-property> <property-name>adress</property-name> <property-name>adress</property-name> <value>Your Adress</value> <value>Your Adress</value> </managed-property> </managed-property> </managed-bean> </managed-bean>

JSF et Seam - M. Exbrayat - 2009-2011

30

Navigation

Fonctionnement du contrleur gr par facesconfig.xml

choix de la ressource excute

Les messages sont des chaines de caractres <navigation-rule> : paramtrage rgles de navigation <from-view-id> : indique la vue source (demande de redirection). La vue peut tre un :

JSF et Seam - M. Exbrayat - 2009-2011

Formulaire (action de soumission) Lien hypertext

Pour chaque valeur de message une page vue de direction est indique dans la balise <navigationcase>

<from-outcome> : la valeur du message <to-view-id> : la vue de direction


31

Modes de navigation

JSF implmente une machine tats pour grer la navigation entre des pages JSF Navigation statique

La valeur de loutcome est connue au moment de lcriture de la JSP La valeur de loutcome est inconnue au moment de lcriture de la JSP Elle peut tre calcule par un Bean Manag ou autre chose Valeur doutcome inconnue = la mme JSP recharge
32

Navigation dynamique

JSF et Seam - M. Exbrayat - 2009-2011

Remarque

Exemple
... ... <html> <html> <head> <head> <title>Redirection Statique partir dun formulaire</title> <title>Redirection Statique partir dun formulaire</title> </head> </head> <body> <body> <core:view> <core:view> <html:form> <html:form> <html:outputText value="Nom : :" "/> <html:outputText value="Nom /> <html:inputText value="#{beancontroller1.name}"/><br> <html:inputText value="#{beancontroller1.name}"/><br> <html:outputText value="Adresse email : :" "/> <html:outputText value="Adresse email /> <html:inputText value="#{beancontroller1.email}"/><br> <html:inputText value="#{beancontroller1.email}"/><br> <html:commandButton value="Connecter" action="register"/> <html:commandButton value="Connecter" action="register"/> </html:form> </html:form> </core:view> </core:view> </body> ... </body> ... </html> <faces-config> </html> <faces-config> <navigation-rule> <navigation-rule> <from-view-id>/form1.jsp</from-view-id> <from-view-id>/form1.jsp</from-view-id> <navigation-case> <navigation-case> <from-outcome>register</from-outcome> <from-outcome>register</from-outcome> <to-view-id>/accepted.jsp</to-view-id> <to-view-id>/accepted.jsp</to-view-id> </navigation-case> </navigation-case> </navigation-rule> </navigation-rule> </faces-config> </faces-config>
33

JSF et Seam - M. Exbrayat - 2009-2011

Redirection dynamique (bean)


package beanPackage; package beanPackage; public class BeanController2 { { public class BeanController2 private String email =="user@host"; private String email "user@host"; private String name ==""; private String name ""; ... ... public String loginConnect() { { public String loginConnect() ifif(this.email.isEmpty()) { { (this.email.isEmpty()) return "Rejected"; return "Rejected"; }} ifif(this.name.isEmpty()) { { (this.name.isEmpty()) return "Rejected"; return "Rejected"; }} return "Accepted"; return "Accepted"; }} ... ... }}

JSF et Seam - M. Exbrayat - 2009-2011

34

Redirection dynamique (xml)


<faces-config> <faces-config> <navigation-rule> <navigation-rule> <from-view-id>form2.jsp</from-view-id> <from-view-id>form2.jsp</from-view-id> <navigation-case> <navigation-case> <from-outcome>Accepted</from-outcome> <from-outcome>Accepted</from-outcome> <to-view-id>/accepted.jsp</to-view-id> <to-view-id>/accepted.jsp</to-view-id> </navigation-case> </navigation-case> <navigation-case> <navigation-case> <from-outcome>Rejected</from-outcome> <from-outcome>Rejected</from-outcome> <to-view-id>/rejected.jsp</to-view-id> <to-view-id>/rejected.jsp</to-view-id> </navigation-case> </navigation-case> </navigation-rule> </navigation-rule> <managed-bean> <managed-bean> <managed-bean-name>beancontroller2</managed-bean-name> <managed-bean-name>beancontroller2</managed-bean-name> <managed-bean-class> <managed-bean-class> beanPackage.BeanController2 beanPackage.BeanController2 </managed-bean-class> </managed-bean-class> ... ... </faces-config> </faces-config>

JSF et Seam - M. Exbrayat - 2009-2011

35

Redirection dynamique (jsp)


... ... <html> <html> <head> <head> <title>Redirection Dynamique partir dun formulaire</title> <title>Redirection Dynamique partir dun formulaire</title> </head> </head> <body> <body> <core:view> <core:view> <html:form> <html:form> <html:outputText value="Nom : :" "/> <html:outputText value="Nom /> <html:inputText value="#{beancontroller2.name}"/><br> <html:inputText value="#{beancontroller2.name}"/><br> <html:outputText value="Adresse email : :" "/> <html:outputText value="Adresse email /> <html:inputText value="#{beancontroller2.email}"/><br> <html:inputText value="#{beancontroller2.email}"/><br> <html:commandButton value="Connecter" <html:commandButton value="Connecter" action="#{beancontroller2.loginConnect}"/> action="#{beancontroller2.loginConnect}"/> </html:form> </html:form> </core:view> </core:view> </body> </body> </html> </html>

JSF et Seam - M. Exbrayat - 2009-2011

36

Balises HTML

Regroupements

selectOneListbox selectOneMenu selectOneRadio column message et messages dataTable outputText outputFormat outputLink graphicImage commandButton commandLink
37

form panelGroup panelGrid inputHidden inputSecret inputText inputTextArea selectBooleanCheckbox selectManyCheckbox selectManyListbox selectManyMenu

Sorties

Saisies

JSF et Seam - M. Exbrayat - 2009-2011

Commandes

Balises HTML

Trois types d'infos dans les balises


Proprits de base Attributs de prsentation du composant (HTML) Attributs de prsentation dynamique (DHTML)

Les attributs disponibles varient suivant balise

JSF et Seam - M. Exbrayat - 2009-2011

38

Attributs basiques

id : identifiant du composant binding : association avec un Bean Backing rendered : true composant affich, false cach styleClass : nom dune CSS appliquer au composant value : valeur du composant valueChangeListener : associer une mthode pour le changement de valeur converter : nom de la classe pour une conversion de donnes validator : classe pour validation de donnes required : true valeur obligatoire, false optionnelle
39

JSF et Seam - M. Exbrayat - 2009-2011

Attributs HTML (quelques)

alt : texte alternatif au cas o le composant ne s'affiche pas border : bordure du composant disabled : dsactive un composant de saisie ou un bouton maxlength : maximum de caractres pour un composant de texte readonly : mode lecture uniquement size : taille d'un champ de texte style : information du style target : nom de la frame dans lequel le document est ouvert
40

JSF et Seam - M. Exbrayat - 2009-2011

Dynamique

onblur : lment perd le focus onClick : clique souris sur un lment ondblClick : double clique souris sur un lment onfocus : lment gagne le focus onkeydown, onkeyup : touche enfonce, relche onkeypress : touche clavier presse puis relche onmousedown, onmouseup : bouton enfonc, relch onmouseout, onmouseover : curseur souris sort et entre onreset : formulaire est initialis onselect : texte est slectionn dans un champ de texte
41

JSF et Seam - M. Exbrayat - 2009-2011

PanelGrid / PanelGroup

<html:panelGrid>

organisation tabulaire des composants (~table) Attributs :


columns : nombre de colonnes de la grille bgcolor : couleur du fond cellpading, cellspacing : espacement entre les cellules border : bordure autour de la grille

JSF et Seam - M. Exbrayat - 2009-2011

<html:panelGroup>

regroupement de composants pratique dans un panelgrid... (une seule case)

42

Exemple
<h4> <h4> <html:panelGrid cellspacing="25" columns="2" >> <html:panelGrid cellspacing="25" columns="2" <html:outputText value="Nom : :" "/> <html:outputText value="Nom /> <html:panelGroup> <html:panelGroup> <html:inputText size="15" required="true" /> <html:inputText size="15" required="true" /> <html:inputText /> <html:inputText /> </html:panelGroup> </html:panelGroup> <html:outputText value="Mot de passe : :" "/> <html:outputText value="Mot de passe /> <html:inputSecret /> <html:inputSecret /> </html:panelGrid> </html:panelGrid> </h4> </h4>
JSF et Seam - M. Exbrayat - 2009-2011

43

DataTable : <html:dataTable>

Structurer les donnes sous forme tabulaire, avec enttes, en utilisant des listes de valeurs. Relier ou non les donnes affiches des objets beans. Attributs :

value : une collection de donnes (Array, List, ResultSet, ) var : nom donn la variable manipuler pour chaque ligne border, bgcolor, width : attributs pour l'affichage rowClasses, headerClass : attributs pour la gestion des styles (CSS)

JSF et Seam - M. Exbrayat - 2009-2011

Pour chaque colonne de la table, la valeur afficher est obtenue par la balise <html:column>
44

Exemple : les Beans


public class Personne { { public class Personne private String name; private String name; private String firstName; private String firstName; private String birthName; private String birthName; private String job; private String job; public Personne(String pN, String pF, String pB, String pJ) { { public Personne(String pN, String pF, String pB, String pJ) name ==pN; firstName ==pF; birthName ==pB, job ==pJ; name pN; firstName pF; birthName pB, job pJ; }} public String getName() { {return name; } } public String getName() return name; public void setName(String pName) { {name ==pName; } } public void setName(String pName) name pName; public String getFirstName() { {return firstName; } } public String getFirstName() return firstName; public void setFirstName(String pFirstName) { {firstName ==pFirstName; } } public void setFirstName(String pFirstName) firstName pFirstName; public class DataTableBean { { public class DataTableBean private List<Personne> refPersonne; private List<Personne> refPersonne; public List getPersonne() { { public List getPersonne() ifif(refPersonne == null) { { (refPersonne == null) refPersonne ==new ArrayList<Personne>(); refPersonne new ArrayList<Personne>(); refPersonne.add(new Personne("Baron", "Mickael", "17081976", "Dveloppeur")); refPersonne.add(new Personne("Baron", "Mickael", "17081976", "Dveloppeur")); refPersonne.add(new Personne("Dupont", "Marcel", "21041956", "Boucher")); refPersonne.add(new Personne("Dupont", "Marcel", "21041956", "Boucher")); ... ... }} return refPersonne; return refPersonne; }} }}

JSF et Seam - M. Exbrayat - 2009-2011

45

Exemple : JSP
<core:view> <core:view> <html:dataTable value="#{outputbean.personne}" var="pers" border="1" <html:dataTable value="#{outputbean.personne}" var="pers" border="1" cellspacing="4" width="60%" >> cellspacing="4" width="60%" <html:column> <html:column> <html:outputText value="#{pers.name}" /> <html:outputText value="#{pers.name}" /> </html:column> </html:column> <html:column> <html:column> <html:outputText value="#{pers.firstname}" /> <html:outputText value="#{pers.firstname}" /> </html:column> </html:column> <html:column> <html:column> <html:outputText value="#{pers.birthdata}" /> <html:outputText value="#{pers.birthdata}" /> </html:column> </html:column> <html:column> <html:column> <html:outputText value="#{pers.job}" /> <html:outputText value="#{pers.job}" /> </html:column> </html:column> </html:dataTable> </html:dataTable> </core:view> </core:view>

JSF et Seam - M. Exbrayat - 2009-2011

46

<core:facet>

Balise pour modification des en-tte et pied de page d'une table <core:facet> s'occupe d'effectuer une relation de filiation entre un composant et un autre

Filiation = associer le composant <core:facet> et un composant dfini dans le corps de <core:facet>

Attribut de <core:facet> : name (nom de la filiation) Pour le composant table deux filiations possibles

JSF et Seam - M. Exbrayat - 2009-2011

header : une filiation entre une colonne et le nom de la colonne footer : une filiation entre la table et un nom caption : une filiation entre le titre de la table et un nom

Le fils doit tre un composant JSF


47

Exemple : JSP
<core:view> <core:view> <html:dataTable value="#{outputbean.personne}" var="personne" border="1" <html:dataTable value="#{outputbean.personne}" var="personne" border="1" cellspacing="4" width="60%" >> cellspacing="4" width="60%" <html:column> <html:column> <core:facet name="header" >> <core:facet name="header" <html:ouputText value="Nom" /> <html:ouputText value="Nom" /> </core:facet> </core:facet> <html:outputText value="#{personne.name}" /> <html:outputText value="#{personne.name}" /> </html:column> </html:column> ... ... <html:column> <html:column> <core:facet name="header" >> <core:facet name="header" Date de naissance Date de naissance Problme? </core:facet> </core:facet> <html:outputText value="#{personne.birthdata}" /> <html:outputText value="#{personne.birthdata}" /> </html:column> </html:column> <html:facet name="footer"> <html:facet name="footer"> <html:outputText value="#{outputbean.caption}" /> <html:outputText value="#{outputbean.caption}" /> </html:facet> </html:facet> ... ... </html:dataTable> </html:dataTable> </core:view> </core:view>

JSF et Seam - M. Exbrayat - 2009-2011

48

Style des contenus


headerClass : style CSS pour la partie en-tte footerClass : style CSS pour le bas de page rowClasses : liste de styles CSS pour les lignes L'attribut rowClasses permet de dfinir une liste de style CSS applique pour chaque ligne et rpte autant de fois qu'il y a de lignes (dfinition d'un motif) Exemple :

JSF et Seam - M. Exbrayat - 2009-2011

Soit la dfinition suivante : rowClasses="row1, row2, row2" Rptition du motif row1, row2, row2, row1, row2,

49

Exemple
<head> <head> <...> <...> <link href="output.css" tel="stylesheet" type="text/css" >> <link href="output.css" tel="stylesheet" type="text/css" </head> </head> <body> <body> <core:view> <core:view> <html:dataTable value="#{outputbean.personne}" var="personne" border="1" <html:dataTable value="#{outputbean.personne}" var="personne" border="1" cellspacing="4" width="60%" rowClasses="row1,row2" cellspacing="4" width="60%" rowClasses="row1,row2" headerClass="heading" footerClass="footer" >> headerClass="heading" footerClass="footer" ... ... .heading { </html:dataTable> .heading { </html:dataTable> font-family: Arial, Helvetica, sans-serif; font-family: Arial, </core:view> font-weight: bold; Helvetica, sans-serif; </core:view>
JSF et Seam - M. Exbrayat - 2009-2011

font-weight: bold; font-size: 20px; font-size: 20px; color: black; color: black; background-color:silver; background-color:silver; text-align:center; } text-align:center; } .row1 { .row1 { background-color:#GFGFGF; } background-color:#GFGFGF; } .row2 { .row2 { Background-color:#CECECE; Background-color:#CECECE; .footer { .footer { background-color:#000009; background-color:#000009; Color:white; } Color:white; }

50

Avec des zones de saisie...


<core:view> <core:view> <html:dataTable value="#{outputbean.personne}" var="personne" border="1" <html:dataTable value="#{outputbean.personne}" var="personne" border="1" cellspacing="4" width="60%" rowClasses="..." >> cellspacing="4" width="60%" rowClasses="..." <html:column> <html:column> <core:facet name="header" >> <core:facet name="header" <html:outputText value="Nom" /> <html:outputText value="Nom" /> </core:facet> </core:facet> <html:inputText value="#{personne.name}" /> <html:inputText value="#{personne.name}" /> </html:column> </html:column> <html:column> <html:column> <core:facet name="header" >> <core:facet name="header" <html:verbatim>Prnom</verbatim> <html:verbatim>Prnom</verbatim> </core:facet> </core:facet> <html:outputText value="#{personne.firstname}" /> <html:outputText value="#{personne.firstname}" /> </html:column> </html:column> </html:dataTable> </html:dataTable> </core:view> </core:view>

JSF et Seam - M. Exbrayat - 2009-2011

51

<core:selectItem> (un parmi n)

Principaux attributs de la balise core:selectItem :

itemDescription : description (utilisable dans les outils uniquement) itemDisabled : active ou pas l'item value : valeur qui pointe vers un objet SelectItem itemLabel : le texte afficher itemValue : la valeur retourne au serveur SelectItem(Object value) : constructeur avec une valeur retourner et afficher SelectItem(Object value, String label) : constructeur avec une valeur retourner au serveur et une valeur afficher
52

JSF et Seam - M. Exbrayat - 2009-2011

Constructeurs :

Exemple
... ... <html:outputText value="Fruit prfr avec SelectItem : :" "/> <html:outputText value="Fruit prfr avec SelectItem /> <html:selectOneRadio layout="pageDirection" value="#{inputbean.oneRadioValue}" /> <html:selectOneRadio layout="pageDirection" value="#{inputbean.oneRadioValue}" /> <core:selectItem value="#{inputbean.bananeItem}" /> <core:selectItem value="#{inputbean.bananeItem}" /> <core:selectItem value="#{inputbean.orangeItem}" /> <core:selectItem value="#{inputbean.orangeItem}" /> <core:selectItem itemValue="Clmentine" /> <core:selectItem itemValue="Clmentine" /> <core:selectItem itemValue="Pomme" /> <core:selectItem itemValue="Pomme" /> <core:selectItem itemValue="Framboise" /> <core:selectItem itemValue="Framboise" /> </html:selectOneRadio> </html:selectOneRadio> ... ... public class InputBean { { public class InputBean private String oneRadioValue; private String oneRadioValue; public String getOneRadioValue() { { public String getOneRadioValue() return oneRadioValue; return oneRadioValue; }} public void setOneRadioValue(String p) { { public void setOneRadioValue(String p) oneRadioValue ==p; oneRadioValue p; }} public SelectItem getBananeItem() { { public SelectItem getBananeItem() return new SelectItem("Banane"); return new SelectItem("Banane"); }} ... ... }}
53

JSF et Seam - M. Exbrayat - 2009-2011

<core:selectItems>

La balise core:selectItems allge lcriture

une seule occurrence de core:selectItems remplace toutes les occurrences de core:selectItem

Lattribut value est une valeur binding qui pointe vers une structure de type SelectItem La structure de type SelectItem peut tre de type

instance unique map : les entres sont les itemLabels et itemValues de SelectItem collection tableau

JSF et Seam - M. Exbrayat - 2009-2011

54

selectItems et formats d'affichage


<h4><html:outputText value="Fruit prfr avec SelectItems : :" "/> <h4><html:outputText value="Fruit prfr avec SelectItems /> <html:selectOneRadio value="#{inputbean.oneRadioValue}" /> <html:selectOneRadio value="#{inputbean.oneRadioValue}" /> <code:selectItems value="#{inputbean.oneRadioItems}" /> <code:selectItems value="#{inputbean.oneRadioItems}" /> </html:selectOneRadio></h4> </html:selectOneRadio></h4> <h4><html:outputText value="Ajouter des priphriques : :" "/> <h4><html:outputText value="Ajouter des priphriques /> <html:selectManyCheckBox value="#{inputbean.manyCheckBoxValues}" /> <html:selectManyCheckBox value="#{inputbean.manyCheckBoxValues}" /> <code:selectItems value="#{inputbean.manyCheckBoxItems}" /> <code:selectItems value="#{inputbean.manyCheckBoxItems}" /> </html:selectManyCheckBox ></h4> </html:selectManyCheckBox ></h4> <h4><html:outputText value="Accessoire prfr : :" "/> <h4><html:outputText value="Accessoire prfr /> <html:selectOneListBox value="#{inputbean.oneListBoxValues}" /> <html:selectOneListBox value="#{inputbean.oneListBoxValues}" /> <code:selectItems value="#{inputbean.manyAndOneListBoxItems}" /> <code:selectItems value="#{inputbean.manyAndOneListBoxItems}" /> </html:selectOneListBox></h4> </html:selectOneListBox></h4> <h4><html:outputText value="Choisir quipements prfrs : :" "/> <h4><html:outputText value="Choisir quipements prfrs /> <html:selectManyListBox value="#{inputbean.manyListBoxValues}" /> <html:selectManyListBox value="#{inputbean.manyListBoxValues}" /> <code:selectItems value="#{inputbean.manyAndOneListBoxItems}" /> <code:selectItems value="#{inputbean.manyAndOneListBoxItems}" /> </html:selectManyListBox></h4> </html:selectManyListBox></h4> <h4><html:outputText value="Choisir une marque de voiture : :" "/> <h4><html:outputText value="Choisir une marque de voiture /> <html:selectOneMenu value="#{inputbean.oneMenuValue}" /> <html:selectOneMenu value="#{inputbean.oneMenuValue}" /> <code:selectItems value="#{inputbean.manyAndOneMenuItems}" /> <code:selectItems value="#{inputbean.manyAndOneMenuItems}" /> </html:selectOneMenu></h4> </html:selectOneMenu></h4> <h4><html:outputText value="Choisir plusieurs marques de voiture : :" "/> <h4><html:outputText value="Choisir plusieurs marques de voiture /> <html:selectManyMenu value="#{inputbean.manyMenuValue}" /> <html:selectManyMenu value="#{inputbean.manyMenuValue}" /> <code:selectItems value="#{inputbean.manyAndOneMenuItems}" /> <code:selectItems value="#{inputbean.manyAndOneMenuItems}" /> </html:selectManyMenu></h4> </html:selectManyMenu></h4>

JSF et Seam - M. Exbrayat - 2009-2011

55

Bean
public class InputBean { { public class InputBean private SelectItem[] manyCheckBoxItems ==new SelectItem[] { { private SelectItem[] manyCheckBoxItems new SelectItem[] new SelectItem("Clavier"), new SelectItem("Clavier"), new SelectItem("Souris"), new SelectItem("Souris"), new SelectItem("Ecran"), new SelectItem("Ecran"), new SelectItem("Unit Centrale"), new SelectItem("Unit Centrale"), new SelectItem("Haut Parleur") new SelectItem("Haut Parleur") };}; private String[] manyCheckBoxValues; private String[] manyCheckBoxValues; public SelectItem[] getManyCheckBoxItems() { { public SelectItem[] getManyCheckBoxItems() return manyCheckBoxItems; return manyCheckBoxItems; }} public String[] getManyCheckBoxValues() { { public String[] getManyCheckBoxValues() return this.manyCheckBoxValues; return this.manyCheckBoxValues; }} public void setManyCheckBoxValues(String[] p) { { public void setManyCheckBoxValues(String[] p) manyCheckBoxValues ==p; manyCheckBoxValues p; }} }}

JSF et Seam - M. Exbrayat - 2009-2011

56

JSF et Seam - M. Exbrayat - 2009-2011

Aspect

57

FacesContext

FacesContext est essentiellement utilis par les mcanismes internes de JSF. Toutefois il est possible d'en extraire des informations intressantes Un objet FacesContext est exploitable dans un Bean ou dans une JSP via son objet implicite associ Exemple : ExternalContext

accder aux lments de la requte et de la rponse

JSF et Seam - M. Exbrayat - 2009-2011

d'autres utilisations

58

Exemple
package beanPackage; package beanPackage; public class FacesContextBean { { public class FacesContextBean private String name; private String name; public String getName() { { public String getName() return name; return name; }} public void setName(String pValue) { { public void setName(String pValue) name ==pValue; name pValue; }} public void apply() { { public void apply() ExternalContext context ==FacesContext.getCurrentInstance().getExternalContext(); ExternalContext context FacesContext.getCurrentInstance().getExternalContext(); System.out.println(context.getRequestPathInfo()); System.out.println(context.getRequestPathInfo()); System.out.println(context.getRequestServletPath()); System.out.println(context.getRequestServletPath()); Iterator myIterator ==context.getRequestParameterNames(); Iterator myIterator context.getRequestParameterNames(); while(myIterator.hasNext()) { { while(myIterator.hasNext()) Object next ==myIterator.next(); Object next myIterator.next(); System.out.println("Nom du paramtre : :" "++next); System.out.println("Nom du paramtre next); Map requestParameterValuesMap ==context.getRequestParameterValuesMap(); Map requestParameterValuesMap context.getRequestParameterValuesMap(); Object tabParameter ==requestParameterValuesMap.get((String)next); Object tabParameter requestParameterValuesMap.get((String)next); ifif(tabParameter instanceof String[]) { { (tabParameter instanceof String[]) System.out.println("Valeur du paramtre : :" "++((String[])tabParameter)[0]); System.out.println("Valeur du paramtre ((String[])tabParameter)[0]); }} }} }} }}
59

JSF et Seam - M. Exbrayat - 2009-2011

Backing beans

On peut avoir des beans dont les attributs sont du type jsp correspondant des composants graphiques.

UIComponent

Permet de grer les attributs de ces composants sans les chercher dans la page...

JSF et Seam - M. Exbrayat - 2009-2011

60

Exemple (JSP)
... ... <body> <body> <core:view> <core:view> <html:form> <html:form> <html:inputText value="#{backingbean.name}" <html:inputText value="#{backingbean.name}" binding="#{backingbean.composantNom}" /> binding="#{backingbean.composantNom}" /> <html:commandButton value="Transformer" <html:commandButton value="Transformer" binding="#{backingbean.commandButton}" binding="#{backingbean.commandButton}" action="#{backingbean.doProcess}" /> action="#{backingbean.doProcess}" /> </html:form> </html:form> </core:view> </core:view> </body> </body>
JSF et Seam - M. Exbrayat - 2009-2011

61

Exemple (Bean)
package beanPackage; package beanPackage; public class BackingBean { { public class BackingBean private String nom =="Baron"; private String nom "Baron"; private HtmlInputText composantNom; private HtmlInputText composantNom; private HtmlCommandButton commandButton; private HtmlCommandButton commandButton; public String getName() {return name; } } public String getName() {return name; public void setName(String pName) {this.name ==pName; } } public void setName(String pName) {this.name pName; public void setComposantNom(HtmlInputText pCommand) { { public void setComposantNom(HtmlInputText pCommand) composantNom ==pCommand; } } composantNom pCommand; public HtmlInputText getComposantNom() { {return composantNom; } } public HtmlInputText getComposantNom() return composantNom; public void setcommandButton(HtmlCommandButton pCB) { { public void setcommandButton(HtmlCommandButton pCB) this.commandButton ==pCB; } } this.commandButton pCB; public HtmlCommandButton getCommandButton() { { public HtmlCommandButton getCommandButton() return this.commandButton; } } return this.commandButton; public void doProcess() { { public void doProcess() ifif(commandButton != null) { { (commandButton != null) this.commandButton.setDisabled(true); this.commandButton.setDisabled(true); }} ifif(composantNom != null) { { (composantNom != null) composantNom.setValue("Nouvelle Valeur"); composantNom.setValue("Nouvelle Valeur"); }} }} }}
62

JSF et Seam - M. Exbrayat - 2009-2011

Messages

On peut faire apparatre des messages dans une page Type java : FacesMessage

get/setSeverity

SEVERITY_INFO, SEVERITY_WARN, SEVERITY_ERROR et SEVERITY_FATAL

get/setSummary get/setDetail FacesContext.getCurrentInstance(). addMessage(id,message);

JSF et Seam - M. Exbrayat - 2009-2011

Ajout au contexte

id = id composant (eventullement null)

63

Exemple 1
<%@taglib prefix="core" uri="http://java.sun.com/jsf/core"%> <%@taglib prefix="core" uri="http://java.sun.com/jsf/core"%> <%@taglib prefix="html" uri="http://java.sun.com/jsf/html"%> <%@taglib prefix="html" uri="http://java.sun.com/jsf/html"%> <html> <html> ... ... <body> <body> <core:view> <core:view> <html:form> <html:form> <html:messages showDetail="true" layout="table" showSummary="true"/><br> <html:messages showDetail="true" layout="table" showSummary="true"/><br> <html:outputText value="Nom : :"/> <html:outputText value="Nom "/> <html:inputText value="#{beanmessages.name}"/><br> <html:inputText value="#{beanmessages.name}"/><br> <html:commandButton value="Valider" action="#{beanmessages.validAction}"/> <html:commandButton value="Valider" action="#{beanmessages.validAction}"/> <html:commandButton value="Annuler" action="#{beanmessages.cancelAction}"/> <html:commandButton value="Annuler" action="#{beanmessages.cancelAction}"/> </html:form> </html:form> </core:view> </core:view> </body> </body> </html> </html>

JSF et Seam - M. Exbrayat - 2009-2011

64

Exemple 2
<%@taglib prefix="core" uri="http://java.sun.com/jsf/core"%> <%@taglib prefix="core" uri="http://java.sun.com/jsf/core"%> <%@taglib prefix="html" uri="http://java.sun.com/jsf/html"%> <%@taglib prefix="html" uri="http://java.sun.com/jsf/html"%> <html> <html> ... ... <body> <body> <core:view> <core:view> <html:form id="logonForm"> <html:form id="logonForm"> <html:outputText value="Nom : :"/> <html:outputText value="Nom "/> <html:inputText id="myIdName" value="#{beanmessage.name}"/><br> <html:inputText id="myIdName" value="#{beanmessage.name}"/><br> <html:message for="myIdName" tooltip="true" showDetail="true <html:message for="myIdName" tooltip="true" showDetail="true showSummary="true"/><br> showSummary="true"/><br> <html:outputText value="Email : :"/> <html:outputText value="Email "/> <html:inputText id="myIdEmail" value="#{beanmessage.email}"/><br> <html:inputText id="myIdEmail" value="#{beanmessage.email}"/><br> <html:message for="myIdEmail" tooltip="true" showDetail="true <html:message for="myIdEmail" tooltip="true" showDetail="true showSummary="true"/><br> showSummary="true"/><br> <html:commandButton value="Valider" action="#{beanmessage.validAction}"/> <html:commandButton value="Valider" action="#{beanmessage.validAction}"/> <html:commandButton value="Annuler" action="#{beanmessage.cancelAction}"/> <html:commandButton value="Annuler" action="#{beanmessage.cancelAction}"/> </html:form> </html:form> </core:view> </core:view> </body> </body> </html> </html>
65

JSF et Seam - M. Exbrayat - 2009-2011

Le bean correspondant
public class BeanMessage { { public class BeanMessage private String name private String name private String email; private String email; public String getName() { {return name; } } public String getName() return name; public void setName(String p) { {this.name ==p; } } public void setName(String p) this.name p; public String getEmail() { {return email; } } public String getEmail() return email; public void setEmail(String p) { {this.email ==p; } } public void setEmail(String p) this.email p; public void validAction() { { public void validAction() FacesContext facesContext ==FacesContext.getCurrentInstance(); FacesContext facesContext FacesContext.getCurrentInstance(); facesContext.addMessage("logonForm:myIdName", new facesContext.addMessage("logonForm:myIdName", new FacesMessage(FacesMessage.SEVERITY_INFO, "Validation Name", "Nom FacesMessage(FacesMessage.SEVERITY_INFO, "Validation Name", "Nom saisi " "++this.name)); saisi this.name)); facesContext.addMessage("logonForm:myIdEmail", new facesContext.addMessage("logonForm:myIdEmail", new FacesMessage(FacesMessage.SEVERITY_INFO, "Validation Email", FacesMessage(FacesMessage.SEVERITY_INFO, "Validation Email", "Email saisi " "++this.email)); "Email saisi this.email)); }} ... ... }}

JSF et Seam - M. Exbrayat - 2009-2011

66

Conversion de donnes

Objets de type Converter Permet de transformer les paramtres HTML en format objet + complexe Permet de contrler la validit des donnes saisies Converters standards de la bibliothque JSF :

JSF et Seam - M. Exbrayat - 2009-2011

core:convertDateTime : pour la conversion de date et dheure core:convertNumber : pour la conversion de nombre Dfinir dans des beans

Autres converters

67

<core:convertNumber> : attributs

type : type de valeur (number, currency ou percent)


pattern : motif de formatage (max/min)FractionDigits : (int) nombre maxi/mini sur la dcimale (max/min)IntegerDigits : (int) nombre maxi/mini sur la partie entire integerOnly : (boolen) seule la partie entire est prise en compte groupingUsed : (boolen) prcise si les caractres de regroupement sont utiliss (exemple : , , ; , : , ) locale : dfinit la localisation de la conversion currencyCode : code de la monnaie utilise pour la conversion currencySymbol : spcifie le caractre (exclusif avec currencyCode)

JSF et Seam - M. Exbrayat - 2009-2011

68

Exemple
<html> <html> ... ... <body> <body> <core:view> <core:view> <html:form> <html:form> <html:outputText value="#{beanconverter1.price}"> <html:outputText value="#{beanconverter1.price}"> <core:convertNumber type="currency" currencyCode="EUR" <core:convertNumber type="currency" currencyCode="EUR" minFractionDigits="4" /> minFractionDigits="4" /> </html:outputText> </html:outputText> </html:form> </html:form> </core:view> </core:view> public class BeanConverter1 { { </body> public class BeanConverter1 </body> private double price; </html> private double price; </html> public BeanConverter1() { { public BeanConverter1() this.price ==50.50d; this.price 50.50d; }} public double getPrice() { { public double getPrice() return price; return price; }} public void setPrice(double pPrice) { { public void setPrice(double pPrice) this.price ==pPrice; this.price pPrice; }} }}
69

JSF et Seam - M. Exbrayat - 2009-2011

<core:convertDateTime> : attributs

type : type de valeur (date, time ou both) dateStyle : style possible de la date (short, medium, long, full, both) timeStyle : style possible de lheure (short, medium, long, full, both) Pattern : motif utilis pour une Date Locale : choix de la localisation Dans le bean

JSF et Seam - M. Exbrayat - 2009-2011

utiliser le format Date

70

Attribut immediate

Dans certain cas, on veut sauter la phase de conversion

Exemple: rinitialisation formulaire

Dans ce cas, ajouter l'attribut immediate= true au composant dclenchant (eg commandeButton)

JSF et Seam - M. Exbrayat - 2009-2011

71

Validators

Validation des donnes saisies Certaines prcodes


core:validateDoubleRange : donnes de type Double core:validateLongRange : donnes de type Long core:validateLength : longueur de type Integer Dans tous les cas, ces balises fournissent trois attributs

JSF et Seam - M. Exbrayat - 2009-2011

maximum : valeur maximale minimum : valeur minimale binding : value une instance du validator en question

Possibilit de personnaliser

implmenter l'interface Validator

72

Exemple
... ... <html:form> <html:form> <p> <p> <html:outputText value="Veuillez saisir votre numro de compte (10 <html:outputText value="Veuillez saisir votre numro de compte (10 chiffres) : :" "/> chiffres) /> <html:inputText id="compteId" value="#{validatorbean.compte}" >> <html:inputText id="compteId" value="#{validatorbean.compte}" <core:validateLength maximum="10" minimum="10" /> <core:validateLength maximum="10" minimum="10" /> </html:inputText><html:message for="compteId" /> </html:inputText><html:message for="compteId" /> </p> </p> <p> <p> <html:outputText value="Veuillez saisir votre taille (comprise entre 1.2 et <html:outputText value="Veuillez saisir votre taille (comprise entre 1.2 et 2.0) : :" "/> 2.0) /> <html:inputText id="tailleId" value="#{validatorbean.taille}" >> <html:inputText id="tailleId" value="#{validatorbean.taille}" <core:validateDoubleRange maximum="2.80" minimum="1.20"/> <core:validateDoubleRange maximum="2.80" minimum="1.20"/> </html:inputText><html:message for="tailleId" /><br> </html:inputText><html:message for="tailleId" /><br> <html:commandButton value="Envoyer" /> <html:commandButton value="Envoyer" /> </p> </p> </html:form> </html:form> ... ...

JSF et Seam - M. Exbrayat - 2009-2011

73

Validator personnalis

Dans faces-config.xml

<validator> <validator-id>myValidatorId</validator-id> <validator-class>beanPackage.MyValidator</validator-class> </validator> <html:inputText value="#{...}" ... > <core:validator validatorId="myValidatorId" /> </html:inputText> implements Validator public void validate(FacesContext fc, UIComponent comp, Object ref) throws ValidatorException { ValidatorException : peut passer un FacesMessage...
74

Dans la JSP

JSF et Seam - M. Exbrayat - 2009-2011

Le bean

Exemple de bean
public class PersoValidator implements Validator { { public class PersoValidator implements Validator public void validate(FacesContext fc, UIComponent comp, Object ref) public void validate(FacesContext fc, UIComponent comp, Object ref) throws ValidatorException { { throws ValidatorException String myValue ==null; String myValue null; ifif(fc == null ||||comp == null ||||ref == null) { { (fc == null comp == null ref == null) throw new NullPointerException(); throw new NullPointerException(); }} myValue ==ref.toString(); myValue ref.toString(); final String magicNumber =="123456789"; final String magicNumber "123456789"; ifif(!myValue.equals(magicNumber)) { { (!myValue.equals(magicNumber)) throw new ValidatorException(new throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, FacesMessage(FacesMessage.SEVERITY_ERROR, "Problme de validation", "numro magique erron")); "Problme de validation", "numro magique erron")); }}

JSF et Seam - M. Exbrayat - 2009-2011

}}

75

Accs par attribut validator

plutt que la balise <core:Validator>, on peut utiliser l'attribut validator de l'input validator= #{bean.methode} le nom de la mthode est libre

doit respecter signature de validate

JSF et Seam - M. Exbrayat - 2009-2011

76

immediate

Comme pour conversion, on peut souhaiter ne pas faire les validations attribut immediate= true

ne fait pas de validations avant Permet de produire le rsultat sans faire le reste des contrles ne fait pas de validations aprs

FacesContext.getCurrentInstance.renderResponse()

JSF et Seam - M. Exbrayat - 2009-2011

77

Affichage

<html:messages> (tous) ou <html:message> (associs au composant) Balises


for : indique lid du composant (uniquement pour message) showDetail : boolen qui prcise si le message est dtaill showSummary : boolen qui prcise si le message est rsum tooltip : boolen qui prcise si une bulle daide est affiche layout : prcise la manire dafficher les messages. Valeurs possibles table ou list (par dfaut)

JSF et Seam - M. Exbrayat - 2009-2011

78

Gestion d'vnements

Similaire aux listeners (genre swing et awt) deux type d'vnements


changement de valeur : ValueChangeEvent action (bouton) : ActionEvent

On rfrence une mthode de bean capable de les traiter

implements ValueChangeListener / ActionListener (balise) mthode avec l'vnement en paramtre


JSF et Seam - M. Exbrayat - 2009-2011

void processValueChange(ValueChangeEvent e) void processAction(ActionEvent e) nom libre avec attribut

accs aux attributs (exemples) : getComponent(), getOldValue(), getNewValue()...


79

Dclaration par attribut / par balise

Attribut

valueChangeListener= #{bean.methode} actionListener= #{bean.methode} nom libre, signature standard <core:valueChangeListener type= bean /> <core:actionListener type= bean /> nom et signature standard

Balise

JSF et Seam - M. Exbrayat - 2009-2011

throws AbortProcessingException

classe implements ...Listener

80

Seam

Passerelle Jboss entre JSF et les EJB3

Avec JSF direct, il restait des choses faire la main (eg persistance) Seam met une surcouche A terme, est cens fonctioner aussi avec d'autres frameworks que JSF

JSF et Seam - M. Exbrayat - 2009-2011

Ecriture simplifie (moins de xml) Utilisation intensive des annotations... Des outils pour faciliter le dveloppement (ouf)

seamgen jbosstools
81

Principes de base

JSP possible, mais plutt facelets

.xhtml

Comme pour JSF, on fournit un contrleur (.seam) Le modle est gr par des EJB3.0

JSF et Seam - M. Exbrayat - 2009-2011

82

Contextes

Contexte = espace de nommage


similaire aux sessions des servlets stockage (rfrence) de composants Stateless context Event (or request) context Page context Conversation context Session context Business process context Application context

De multiples niveaux suivant la porte des composants


JSF et Seam - M. Exbrayat - 2009-2011

Sont normalement grs par seam de faon transparente


83

Contextes (2)

Stateless context

Pour les objets hors contexte (eg Session stateless) Dure le temps du traitement d'une requte Associ une instance d'une page donne Utile pour des pages avec des actions internes (genre ajax...) Contexte au sens servlet Infos statiques porte globale
84

Event (or request) context

Page context

JSF et Seam - M. Exbrayat - 2009-2011

Application context

Contexte (3)

Conversation context

Enchanement de requtes Similaire au use case Par dfaut, pour la dure de la session Session d'un utilisateur loggu Ne devrait contenir que les infos globales sur l'utilisateur Tche mtier longue (workflow) Dfinition externe du cycle de vie (BPM, process definition language) Partag entre utilisateurs
85

Session context

JSF et Seam - M. Exbrayat - 2009-2011

Business process context


Annotations contexte (principales)

@Begin

avant une mthode dbut de conversation longue si la mthode retourne normalement (join=true/false) dmarre si pas de conv. en cours (nested=true/false) sous-conversation fin de la conversation la fin de la mthode (si retour normal)

JSF et Seam - M. Exbrayat - 2009-2011

@End

86

Quels types de composants ?

Tous les EJB 3.0

Session Stateless

stateless context par dfaut, conversation. page et stateless possibles par dfaut, conversation Hors contexte !

Session Stateful

Entity

JSF et Seam - M. Exbrayat - 2009-2011

Message Driven

Les Java Beans

stateless

87

A la recherche du composant perdu...

Les composants sont rcuprs par EL ou par injection, faon EJB 3.0 Ils sont alors recherchs, suivant leur nom, travers les contextes dans l'ordre suivant :

Event context Page context Conversation context Session context Business process context Application context

JSF et Seam - M. Exbrayat - 2009-2011

Il existe @JndiName pour dfinir le nom la main


88

Les tags de base


Chaque composant est annot @Name( ... )


Le nom d'invocation, indispensable! nom court, ou hirarchis pour hirarchie, possibilit de crer un alias

Dans components.xml <factory name="alias" scope="..." value="#{nomcomplet}"/>

JSF et Seam - M. Exbrayat - 2009-2011

@Scope

contexte (notamment pour valeur hors dfaut) tag @Role(name= ... ,SCOPE) + @Roles

Dfinitions de noms secondaires avec contextes diffrents

89

Mcanisme de bijection

Accs aux composants dans le contexte @In : injection


dclaration ou setter (value= EL ) : rcupration d'un attribut plutt que d'un comp. (create=true) : crer si besoin

peut tre remplac par @Autocreate dans la df du composant inject

JSF et Seam - M. Exbrayat - 2009-2011

(required=false) : peut tre null outjection dpt dans le contexte dclaration ou getter
90

@Out

@In @Out cumulables

Exemple
@Name( monappli.mesejbs.MonSuperBean ) @Name( monappli.mesejbs.MonSuperBean ) @Statefull @Statefull @Scope(SESSION) @Scope(SESSION) public class MonBean { { public class MonBean @In(create=true) @In(create=true) Adress addr; Adress addr; @Out @Out Email email; Email email; ... ... }}
JSF et Seam - M. Exbrayat - 2009-2011

91

Traage

@Logger

eg : @Logger private Log log; log.debug( .... ); pas besoin de tester si on est dans le niveau debug! le texte peut contenir des EL pour rcuprer des attributs des paramtres de la mthodes (si ce sont des composants dans le scope)

JSF et Seam - M. Exbrayat - 2009-2011

92

Annotations de cycle de vie


EJB : annotations classiques Pour les java beans aussi! +


@Create : instanciation @Destroy : destruction du contexte contenant le composant @Remove : idem, obligatoire pour session stateful spcifie instanciation au lancement (dploiement) pour les contextes application et session

JSF et Seam - M. Exbrayat - 2009-2011

@Startup

93

Assez parl, du concret !


Exemple 1 : Authentification Exemple 2 : Datatable

JSF et Seam - M. Exbrayat - 2009-2011

94

Authentification

Un entity : utilisateur Un session : contrle d'identit Un xhtml : l'ihm quelques xml... Le tout dans un ear

JSF et Seam - M. Exbrayat - 2009-2011

95

JSF et Seam - M. Exbrayat - 2009-2011

A quoi a ressemble ?

96

JSF et Seam - M. Exbrayat - 2009-2011

97

JSF et Seam - M. Exbrayat - 2009-2011

98

Utilisateur

package org.domain.monprojet.entity; package org.domain.monprojet.entity; import java.io.Serializable; import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Id; import javax.persistence.GeneratedValue; import javax.persistence.GeneratedValue; import javax.persistence.Version; import javax.persistence.Version; import org.hibernate.validator.Length; import org.hibernate.validator.Length; import org.jboss.seam.ScopeType; import org.jboss.seam.ScopeType; import org.jboss.seam.annotations.Name; import org.jboss.seam.annotations.Name; import org.jboss.seam.annotations.Scope; import org.jboss.seam.annotations.Scope; @Entity @Entity @Name("utilisateur") @Name("utilisateur") @Scope(ScopeType.SESSION) @Scope(ScopeType.SESSION) public class Utilisateur implements Serializable public class Utilisateur implements Serializable { { // seam-gen attributes (you should probably edit these) // seam-gen attributes (you should probably edit these) private Long id; private Long id; private Integer version; private Integer version; private String login; private String login; private String password; private String password; @Id @GeneratedValue @Id @GeneratedValue public Long getId() { public Long getId() { return id; return id; } } public void setId(Long id) { public void setId(Long id) { this.id = id; this.id = id; } }
99

JSF et Seam - M. Exbrayat - 2009-2011

@Version @Version public Integer getVersion() { public Integer getVersion() { return version; return version; } } private void setVersion(Integer version) { private void setVersion(Integer version) { this.version = version; this.version = version; } } @Length(min=5, max = 10, message="Longueur entre 5 et 10 caractres") @Length(min=5, max = 10, message="Longueur entre 5 et 10 caractres") public String getLogin() { public String getLogin() { return login; return login; } } public void setLogin(String login) { public void setLogin(String login) { this.login = login; this.login = login; } } @Length(min=8, max=16) @Length(min=8, max=16) public String getPassword() { public String getPassword() { return password; return password; } } public void setPassword(String password) { public void setPassword(String password) { this.password = password; this.password = password; } } } }

JSF et Seam - M. Exbrayat - 2009-2011

100

Toctoc
package org.domain.monprojet.session; package org.domain.monprojet.session; import javax.ejb.Local; import javax.ejb.Local; @Local @Local public interface Toctoc public interface Toctoc {{ public void verifier(); public void verifier(); public void destroy(); public void destroy(); ////add additional interface methods here add additional interface methods here }}
JSF et Seam - M. Exbrayat - 2009-2011

101

ToctocBean
import ... import ... @Stateful @Stateful @Name("toctoc") @Name("toctoc") public class ToctocBean implements Toctoc public class ToctocBean implements Toctoc { { @Logger private Log log; @Logger private Log log; @PersistenceContext @PersistenceContext EntityManager em; EntityManager em; public void verifier() public void verifier() { { List existing = em.createQuery( List existing = em.createQuery( "select login from Utilisateur where login=#{utilisateur.login}") "select login from Utilisateur where login=#{utilisateur.login}") .getResultList(); .getResultList(); if (existing.size()==0) if (existing.size()==0) { { FacesMessages.instance().add("Un petit trou de mmoire ?"); FacesMessages.instance().add("Un petit trou de mmoire ?"); } else { } else { FacesMessages.instance().add("Bienvenu #{utilisateur.login} !"); FacesMessages.instance().add("Bienvenu #{utilisateur.login} !"); } } } } @Destroy @Remove @Destroy @Remove public void destroy() {} public void destroy() {} } }
102

JSF et Seam - M. Exbrayat - 2009-2011

toctoc.xhtml

<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" <!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <ui:composition xmlns="http://www.w3.org/1999/xhtml" <ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:s="http://jboss.com/products/seam/taglib" xmlns:s="http://jboss.com/products/seam/taglib" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:f="http://java.sun.com/jsf/core" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:h="http://java.sun.com/jsf/html" xmlns:rich="http://richfaces.org/rich" xmlns:rich="http://richfaces.org/rich" xmlns:a="http://richfaces.org/a4j" xmlns:a="http://richfaces.org/a4j" template="layout/template.xhtml"> template="layout/template.xhtml"> <ui:define name="body"> <ui:define name="body"> <h:form id="toctocForm"> <h:form id="toctocForm"> <rich:panel> <rich:panel> <f:facet name="header">Qui est l ?</f:facet> <f:facet name="header">Qui est l ?</f:facet> <s:decorate id="loginField" template="layout/edit.xhtml"> <s:decoratename="label">Ton petit nom : </ui:define> <ui:define id="loginField" template="layout/edit.xhtml"> <ui:define name="label">Ton petit nom <h:inputText id="login" required="true" : </ui:define> <h:inputText id="login" required="true" value="#{utilisateur.login}"/> value="#{utilisateur.login}"/> </s:decorate> </s:decorate> <s:decorate id="passwordField" template="layout/edit.xhtml"> <s:decoratename="label">Ton mot de passe : </ui:define> <ui:define id="passwordField" template="layout/edit.xhtml"> <ui:define name="label">Ton mot de passe <h:inputSecret id="password" required="true": </ui:define> <h:inputSecret id="password" required="true" value="#{utilisateur.password}"/> value="#{utilisateur.password}"/> </s:decorate> </s:decorate> <div style="clear:both"/> <div style="clear:both"/> </rich:panel> </rich:panel> <div class="actionButtons"> <div class="actionButtons"> <h:commandButton id="toctoc" value="verifier" <h:commandButton id="toctoc" value="verifier" action="#{toctoc.verifier}"/> </div> action="#{toctoc.verifier}"/> </div> </h:form> </h:form> </ui:define> </ui:define> </ui:composition> </ui:composition>

JSF et Seam - M. Exbrayat - 2009-2011

103

ejb-jar.xml
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?> <ejb-jar xmlns="http://java.sun.com/xml/ns/javaee" <ejb-jar xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd" http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd" version="3.0"> version="3.0"> <interceptors> <interceptors> <interceptor> <interceptor> <interceptor<interceptorclass>org.jboss.seam.ejb.SeamInterceptor</interceptor-class> class>org.jboss.seam.ejb.SeamInterceptor</interceptor-class> </interceptor> </interceptor> </interceptors> </interceptors> <assembly-descriptor> <assembly-descriptor> <interceptor-binding> <interceptor-binding> <ejb-name>*</ejb-name> <ejb-name>*</ejb-name> <interceptor<interceptorclass>org.jboss.seam.ejb.SeamInterceptor</interceptor-class> class>org.jboss.seam.ejb.SeamInterceptor</interceptor-class> </interceptor-binding> </interceptor-binding> </assembly-descriptor> </assembly-descriptor> </ejb-jar> </ejb-jar>
104

JSF et Seam - M. Exbrayat - 2009-2011

web.xml (extrait)
<listener> <listener> <listener-class>org.jboss.seam.servlet.SeamListener</listener-class> <listener-class>org.jboss.seam.servlet.SeamListener</listener-class> </listener> </listener> <filter> <filter> <filter-name>Seam Filter</filter-name> <filter-name>Seam Filter</filter-name> <filter-class>org.jboss.seam.servlet.SeamFilter</filter-class> <filter-class>org.jboss.seam.servlet.SeamFilter</filter-class> </filter> </filter> <filter-mapping> <filter-mapping> <filter-name>Seam Filter</filter-name> <filter-name>Seam Filter</filter-name> <url-pattern>/*</url-pattern> <url-pattern>/*</url-pattern> </filter-mapping> </filter-mapping>

JSF et Seam - M. Exbrayat - 2009-2011

105

faces-config.xml
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?> <faces-config <faces-config xmlns="http://java.sun.com/xml/ns/javaee" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd" http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd" version="1.2"> version="1.2"> <application> <application> <view-handler>com.sun.facelets.FaceletViewHandler</view-handler> <view-handler>com.sun.facelets.FaceletViewHandler</view-handler> <locale-config> <locale-config> <default-locale>en</default-locale> <default-locale>en</default-locale> <supported-locale>bg</supported-locale> <supported-locale>bg</supported-locale> <supported-locale>de</supported-locale> <supported-locale>de</supported-locale> <supported-locale>en</supported-locale> <supported-locale>en</supported-locale> <supported-locale>fr</supported-locale> <supported-locale>fr</supported-locale> <supported-locale>tr</supported-locale> <supported-locale>tr</supported-locale> </locale-config> </locale-config> </application> </application> </faces-config> </faces-config>
106

JSF et Seam - M. Exbrayat - 2009-2011

persistence.xml
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?> <!-- Persistence deployment descriptor for dev profile --> <!-- Persistence deployment descriptor for dev profile --> <persistence xmlns="http://java.sun.com/xml/ns/persistence" <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0"> version="1.0"> <persistence-unit name="monprojet"> <persistence-unit name="monprojet"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <provider>org.hibernate.ejb.HibernatePersistence</provider> <jta-data-source>java:/monprojetDatasource</jta-data-source> <jta-data-source>java:/monprojetDatasource</jta-data-source> <properties> <properties> <property name="hibernate.dialect" <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/> value="org.hibernate.dialect.HSQLDialect"/> <property name="hibernate.hbm2ddl.auto" value="update"/> <property name="hibernate.hbm2ddl.auto" value="update"/> <property name="hibernate.show_sql" value="true"/> <property name="hibernate.show_sql" value="true"/> <property name="hibernate.format_sql" value="true"/> <property name="hibernate.format_sql" value="true"/> <property name="jboss.entity.manager.factory.jndi.name" <property name="jboss.entity.manager.factory.jndi.name" value="java:/monprojetEntityManagerFactory"/> value="java:/monprojetEntityManagerFactory"/> </properties> </properties> </persistence-unit> </persistence-unit> </persistence> </persistence>
107

JSF et Seam - M. Exbrayat - 2009-2011

Datatables

Une liste de personnes, prsente de deux faons

Non cliquable, non modifiable on pourrait ajouter des fonctionnalits...

modifiable, cliquable, ajout d'utilisateur...

Utilisation d'un DataModel

liste d'objets pour le datatable Un ejb session sert de gestionnaire une de ses mthodes est annot pour initialiser la liste attention : ne pas oublier de la rafrachir s'il y a des ajouts...

JSF et Seam - M. Exbrayat - 2009-2011

Gnration par factory


108

JSF et Seam - M. Exbrayat - 2009-2011

Aspect

109

Le gestionnaire

package org.domain.monprojet.session; package org.domain.monprojet.session; public interface UtilisateurManager { public interface UtilisateurManager { public void findUtils(); public void findUtils(); public void delete(); public void delete(); public void destroy(); public void destroy();
JSF et Seam - M. Exbrayat - 2009-2011

110

package org.domain.monprojet.session; package org.domain.monprojet.session; import... import... @Stateful @Stateful @Name("utilmgr") @Name("utilmgr") @Scope(ScopeType.SESSION) @Scope(ScopeType.SESSION) public class UtilisateurManagerBean implements public class UtilisateurManagerBean implements Serializable,UtilisateurManager{ Serializable,UtilisateurManager{ @DataModel @DataModel private List<Utilisateur> utils; private List<Utilisateur> utils; @DataModelSelection @DataModelSelection @Out(required=false) @Out(required=false) private Utilisateur util; private Utilisateur util; @PersistenceContext @PersistenceContext private EntityManager em; private EntityManager em;
JSF et Seam - M. Exbrayat - 2009-2011

@Factory("utils") @Factory("utils") public void findUtils(){ public void findUtils(){ utils=em.createQuery("select util from Utilisateur util").getResultList(); utils=em.createQuery("select util from Utilisateur util").getResultList(); } } public void delete(){ public void delete(){ utils.remove(util); utils.remove(util); em.remove(util); em.remove(util); util=null; util=null; } } @Destroy @Destroy @Remove @Remove public void destroy() {} public void destroy() {}

111

xhtml

JSF et Seam - M. Exbrayat - 2009-2011

<ui:define name="body"> <ui:define name="body"> <h:form id="utilisateurForm"> <h:form id="utilisateurForm"> <h:dataTable var="util" value="#{utils}" <h:dataTable var="util" value="#{utils}" rendered="#{utils.rowCount>0}"> rendered="#{utils.rowCount>0}"> <h:column> <h:column> <f:facet name="header"> <f:facet name="header"> <h:outputText value="Id"/> <h:outputText value="Id"/> </f:facet> </f:facet> <h:outputText value="#{util.id}"/> <h:outputText value="#{util.id}"/> </h:column> </h:column> <h:column> <h:column> <f:facet name="header"> <f:facet name="header"> <h:outputText value="Login"/> <h:outputText value="Login"/> </f:facet> </f:facet> <h:outputText value="#{util.login}"/> <h:outputText value="#{util.login}"/> </h:column> </h:column> <h:column> <h:column> <f:facet name="header"> <f:facet name="header"> <h:outputText value="Mot de passe :-o"/> <h:outputText value="Mot de passe :-o"/> </f:facet> </f:facet> <h:outputText value="#{util.password}"> <h:outputText value="#{util.password}"> </h:outputText> </h:outputText> </h:column> </h:column> </h:dataTable> </h:dataTable> </h:form> </h:form> </ui:define> </ui:define> </ui:composition> </ui:composition>

112

Mettre en place Seam avec seamgen


Installer jboss-seam-... Avec Jboss 4.2.x ou Jboss 5

Modifier les paramtres de dmarrage :

-Xms512m -Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=512, ou au moins : -Xms256m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=256

JSF et Seam - M. Exbrayat - 2009-2011

Avec JDK 5 ou 6

113

seam setup (1/2)


SEAM_HOME: /usr/java/jboss-seam-2.1.1.GA Using seam-gen sources from: /usr/java/jboss-seam-2.1.1.GA/seam-gen Buildfile: /usr/java/jboss-seam-2.1.1.GA/seam-gen/build.xml init: setup: [echo] Welcome to seam-gen :-) [input] Enter your Java project workspace (the directory that contains your Seam projects) [C:/Projects] [C:/Projects] /home/exbrayat/seamws [input] Enter your JBoss AS home directory [C:/Program Files/jboss-4.2.3.GA] [C:/Program Files/jboss-4.2.3.GA] /usr/java/jboss-4.2.3.GA [input] Enter the project name [myproject] [myproject] premier [echo] Accepted project name as: premier [input] Do you want to use ICEfaces instead of RichFaces [n] (y, [n])

JSF et Seam - M. Exbrayat - 2009-2011

[input] skipping input as property icefaces.home.new has already been set. [input] Select a RichFaces skin [classic] (blueSky, [classic], deepMarine, DEFAULT, emeraldTown, japanCherry, ruby, wine) [input] Is this project deployed as an EAR (with EJB components) or a WAR (with no EJB support) [ear] ([ear], war) [input] Enter the Java package name for your session beans [com.mydomain.premier] [com.mydomain.premier] premier [input] Enter the Java package name for your entity beans [premier] [premier] [input] Enter the Java package name for your test cases [premier.test] [premier.test]

114

seam setup (2/2)


[input] What kind of database are you using? [hsql] ([hsql], mysql, oracle, postgres, mssql, db2, sybase, enterprisedb, h2) [input] Enter the Hibernate dialect for your database [org.hibernate.dialect.HSQLDialect] [org.hibernate.dialect.HSQLDialect] [input] Enter the filesystem path to the JDBC driver jar [/usr/java/jboss-seam-2.1.1.GA/lib/hsqldb.jar] [/usr/java/jboss-seam-2.1.1.GA/lib/hsqldb.jar] [input] Enter JDBC driver class for your database [org.hsqldb.jdbcDriver] [org.hsqldb.jdbcDriver] [input] Enter the JDBC URL for your database [jdbc:hsqldb:.] [jdbc:hsqldb:.] [input] Enter database username [sa] [sa] [input] Enter database password [] [] [input] Enter the database schema name (it is OK to leave this blank) [] []

JSF et Seam - M. Exbrayat - 2009-2011

[input] Enter the database catalog name (it is OK to leave this blank) [] [] [input] Are you working with tables that already exist in the database? [n] (y, [n]) [input] Do you want to drop and recreate the database tables and data in import.sql each time you deploy? [n] (y, [n]) [propertyfile] Creating new property file: /usr/java/jboss-seam-2.1.1.GA/seam-gen/build.properties [echo] Installing JDBC driver jar to JBoss AS [copy] Copying 1 file to /usr/java/jboss-4.2.3.GA/server/default/lib [echo] Type './seam create-project' to create the new project BUILD SUCCESSFUL Total time: 1 minute 23 seconds

115

seam new-project
SEAM_HOME: /usr/java/jboss-seam-2.1.1.GA Using seam-gen sources from: /usr/java/jboss-seam-2.1.1.GA/seam-gen Buildfile: /usr/java/jboss-seam-2.1.1.GA/seam-gen/build.xml init: init-properties: [echo] /usr/java/jboss-4.2.3.GA [......] file-copy-ear: [echo] Copying resources needed for EAR deployment to the /home/exbrayat/seamws/premier/resources directory... [copy] Copying 1 file to /home/exbrayat/seamws/premier/resources/WEB-INF [copy] Copying 1 file to /home/exbrayat/seamws/premier [......] file-copy: [copy] Copying 1 file to /home/exbrayat/seamws/premier [copy] Copying 3 files to /home/exbrayat/seamws/premier/resources [......] create-project: [echo] A new Seam project named 'premier' was created in the /home/exbrayat/seamws directory [echo] Type './seam explode' and go to http://localhost:8080/premier [echo] Eclipse Users: Import the project using File > Import... > Existing Projects into Workspace, set the root directory to /home/exbrayat/seamws, then select the project named premier [echo] NetBeans Users: Open the project using File > Open project... and select the project folder /home/exbrayat/seamws/premier [echo] IDEA Users: Open the project using File > Open project... and select the file /home/exbrayat/seamws/premier/premier.ipr new-project: BUILD SUCCESSFUL Total time: 5 seconds [pcd-exbrayat]jboss-seam-2.1.1.GA>

JSF et Seam - M. Exbrayat - 2009-2011

116

Ce qui est gnr...


[pcd-exbrayat]~> cd seamws/ [pcd-exbrayat]seamws> ls premier [pcd-exbrayat]seamws> ls premier/ bootstrap deployed-jars-war.list premier.launch build-dev.properties explode.launch resources build-prod.properties hibernate-console.properties seam-gen.properties build.properties lib src build.xml nbproject validate.xml debug-jboss-premier.launch premier.iml view deployed-jars-ear.list premier.ipr [pcd-exbrayat]seamws> ls premier/src/ hot main test

JSF et Seam - M. Exbrayat - 2009-2011

117

Dmarrer eclipse...

Crer un nouveau projet :


File / New / Other / General / Project ... Next saisir le nom du projet (ici, premier) Probablement un message d'erreur au dmarrage (pas grave)

JSF et Seam - M. Exbrayat - 2009-2011

118

JSF et Seam - M. Exbrayat - 2009-2011

Eclipse : vue de dpart

119

Crer une action


[pcd-exbrayat]jboss-seam-2.1.1.GA> ./seam new-action SEAM_HOME: /usr/java/jboss-seam-2.1.1.GA [......] action-input: [input] Enter the Seam component name hello [input] Enter the local interface name [Hello] [Hello] [input] Enter the bean class name [HelloBean] [HelloBean] [input] Enter the action method name [hello] [hello] [input] Enter the page name [hello] [hello] setup-filters:

JSF et Seam - M. Exbrayat - 2009-2011

new-action-ear: [echo] Creating a new stateless session bean component with an action method [copy] Copying 1 file to /home/exbrayat/seamws/premier/src/hot/premier [copy] Copying 1 file to /home/exbrayat/seamws/premier/src/hot/premier [copy] Copying 1 file to /home/exbrayat/seamws/premier/src/test/premier/test [copy] Copying 1 file to /home/exbrayat/seamws/premier/src/test/premier/test [copy] Copying 1 file to /home/exbrayat/seamws/premier/view [echo] Type './seam restart' and go to http://localhost:8080/premier/hello.seam new-action-war: new-action: BUILD SUCCESSFUL Total time: 18 seconds

120

L'EJB Gnr
package premier; package premier; import javax.ejb.Stateless; import javax.ejb.Stateless; import org.jboss.seam.annotations.Name; import org.jboss.seam.annotations.Name; import org.jboss.seam.annotations.In; import org.jboss.seam.annotations.In; import org.jboss.seam.annotations.Logger; import org.jboss.seam.annotations.Logger; import org.jboss.seam.log.Log; import org.jboss.seam.log.Log; import org.jboss.seam.international.StatusMessages; import org.jboss.seam.international.StatusMessages; @Stateless @Stateless @Name("hello") @Name("hello") public class HelloBean implements Hello public class HelloBean implements Hello { { @Logger private Log log; @Logger private Log log; @In StatusMessages statusMessages; @In StatusMessages statusMessages; public void hello() { public void hello() { // implement your business logic here // implement your business logic here log.info("hello.hello() action called"); log.info("hello.hello() action statusMessages.add("hello");called"); } statusMessages.add("hello"); } // add additional action methods // add additional action methods } }
121

package premier; package premier;


JSF et Seam - M. Exbrayat - 2009-2011

import javax.ejb.Local; import javax.ejb.Local; @Local @Local public interface Hello { public interface Hello { // seam-gen method // seam-gen method public void hello(); public void hello(); // add additional interface methods here // add additional interface methods here } }

La page xhtml gnre...


<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 <!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <ui:composition xmlns="http://www.w3.org/1999/xhtml" <ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:s="http://jboss.com/products/seam/taglib" xmlns:s="http://jboss.com/products/seam/taglib" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:f="http://java.sun.com/jsf/core" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:h="http://java.sun.com/jsf/html" xmlns:rich="http://richfaces.org/rich" xmlns:rich="http://richfaces.org/rich" xmlns:a="http://richfaces.org/a4j" xmlns:a="http://richfaces.org/a4j" template="layout/template.xhtml"> template="layout/template.xhtml"> <ui:define name="body"> <ui:define name="body"> <rich:panel> <rich:panel> <f:facet name="header">hello</f:facet> <f:facet name="header">hello</f:facet>
JSF et Seam - M. Exbrayat - 2009-2011

<h:form id="helloForm"> <h:form id="helloForm"> <h:commandButton id="hello" value="hello!" <h:commandButton id="hello" value="hello!" action="#{hello.hello}"/> action="#{hello.hello}"/> </h:form> </h:form> </rich:panel> </rich:panel> </ui:define> </ui:define> </ui:composition> </ui:composition>
122

JSF et Seam - M. Exbrayat - 2009-2011

L'aspect...

123

JSF et Seam - M. Exbrayat - 2009-2011

Authentification

124

Code source ...


<!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"> <head> <script type='text/javascript' src='/premier/a4j/g/3_2_2.SR1/org/ajax4jsf/framework.pack.js'></script><script type='text/javascript' src='/premier/a4j/g/3_2_2.SR1/org/richfaces/ui.pack.js'></script><link class='component' rel='stylesheet' type='text/css' href='/premier/a4j/s/3_2_2.SR1/org/richfaces/skin.xcss/DATB/eAFrvajdHLp8hjQAEgwDt A__;jsessionid=25DCA3D369B3E7346CD76E1B7A6722C7' /><link class='user' rel='stylesheet' type='text/css' href='/premier/a4j/s/3_2_2.SR1stylesheet/theme.xcss/DATB/eAFrvajdHLp8hjQAEgwDtA __;jsessionid=25DCA3D369B3E7346CD76E1B7A6722C7' /><link class='user' rel='stylesheet' type='text/css' href='/premier/stylesheet/theme.css;jsessionid=25DCA3D369B3E7346CD76E1B7A6722 C7' /><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>premier</title> <link rel="shortcut icon" href="/premier/favicon.ico" /> </head> <body><table border="0" cellpadding="0" cellspacing="0" class="dr-toolbar-ext richtoolbar " id="j_id5" width="100%"><tr valign="middle"><td class="dr-toolbar-int richtoolbar-item " style=";">premier:</td><td class="dr-toolbar-int rich-toolbar-item "

JSF et Seam - M. Exbrayat - 2009-2011

125

Dans jboss...

premier-ds.xml

Datasources pour le projet autosuffisant (plein de libs) sous forme d'un rpertoire... pour mettre sous forme d'un ear :

premier.ear

JSF et Seam - M. Exbrayat - 2009-2011

seam unexplode seam deploy Mieux vaut rester en explode durant le dveloppement...

126

Autres fonctionnalits

seam new-form

Gnre une page avec un formulaire contenant un champ de saisie (et contrleur de longueur) Cre des ejb entity partir des tables de la base Gnre toute l'interface ncessaire Cre des pages partir des entities...

seam generate-entities

JSF et Seam - M. Exbrayat - 2009-2011

seam generate-ui

127

Seam avec JBossTools

Plus simple (seamgen est surtout pdagogique...)

utiliser de prfrence eclipse ganymede SR2, Jboss4.2.3 Toujours jboss-seam... Ajouter les sites (visibles) :

http://download.jboss.org/jbosstools/updates/nightly/trunk/ http://download.eclipse.org/releases/ganymede/ http://download.eclipse.org/birt/update-site/2.3/

JSF et Seam - M. Exbrayat - 2009-2011

Installer jbosstools on peut s'en passer pour l'instant :-)

La doc seam conseille d'installer TestNG...

La stabilit reste contestable...


128

JSF et Seam - M. Exbrayat - 2009-2011

Installer JbossTools

129

Crer un projet...

File > new > other > seam > seam web project Pour Jboss, on procde comme d'habitude...

JSF et Seam - M. Exbrayat - 2009-2011

130

pas de pas de majuscules! majuscules! pas de pas de numros! numros!

JSF et Seam - M. Exbrayat - 2009-2011

131

JSF et Seam - M. Exbrayat - 2009-2011

132

JSF et Seam - M. Exbrayat - 2009-2011

http://www.seamframework.org/Seam2/Downloads

133

JSF et Seam - M. Exbrayat - 2009-2011

134

JSF et Seam - M. Exbrayat - 2009-2011

135

JSF et Seam - M. Exbrayat - 2009-2011

136

JSF et Seam - M. Exbrayat - 2009-2011

Ensuite, next... jusqu' la fin

137

JSF et Seam - M. Exbrayat - 2009-2011

138

Crer un formulaire simple...

File > new > seam form

JSF et Seam - M. Exbrayat - 2009-2011

139

JSF et Seam - M. Exbrayat - 2009-2011

140

Crer un entity...

File > new > seam entity

JSF et Seam - M. Exbrayat - 2009-2011

141

JSF et Seam - M. Exbrayat - 2009-2011

142

Crer un ejb entity

Attention : sans dfinir le scope SESSION, l'accs se fait par le biais de l'ejb session Home , cr par jbosstools

xxxHome.instance.attribut
... ... <ui:define name="body"> <ui:define name="body"> <h:form id="premEntForm"> <h:form id="premEntForm"> <rich:panel> <rich:panel> <f:facet name="header">premEnt</f:facet> <f:facet name="header">premEnt</f:facet> <s:decorate id="nameField" template="layout/edit.xhtml"> <s:decorate id="nameField" template="layout/edit.xhtml"> <ui:define name="label">Name</ui:define> <ui:define name="label">Name</ui:define> <h:inputText id="name" required="true" <h:inputText id="name" required="true" value="#{premEntHome.instance.name}"/> value="#{premEntHome.instance.name}"/> </s:decorate> </s:decorate> <div style="clear:both"/> <div style="clear:both"/> ... ...
143

JSF et Seam - M. Exbrayat - 2009-2011

structure xhtml
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" <!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <ui:composition xmlns="http://www.w3.org/1999/xhtml" <ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:s="http://jboss.com/products/seam/taglib" xmlns:s="http://jboss.com/products/seam/taglib" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:f="http://java.sun.com/jsf/core" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:h="http://java.sun.com/jsf/html" xmlns:rich="http://richfaces.org/rich" xmlns:rich="http://richfaces.org/rich" xmlns:a="http://richfaces.org/a4j" xmlns:a="http://richfaces.org/a4j" template="layout/template.xhtml"> template="layout/template.xhtml">
JSF et Seam - M. Exbrayat - 2009-2011

<ui:define name="body"> <ui:define name="body"> <h:form id="xxxxxxx"> <h:form id="xxxxxxx"> .... .... </h:form> </h:form> </ui:define> </ui:define> </ui:composition> </ui:composition>
144

principaux tags

<h:form>

id, target, on... permet d'afficher des messages si pb de validation id, template (xhtml)

<s:decorate>

<s:button> <s:fileUpload> <s:link>

JSF et Seam - M. Exbrayat - 2009-2011

target

<s:selectDate>
145

Principaux tags (2)

<s:span> et <s:div>

Pour les subdivisions du texte pour les listes d'lments (objet pass dans value) sortie de message Faces

<s:enumItem>

<s:message>

JSF et Seam - M. Exbrayat - 2009-2011

<s:convertDateTime> <s:convertEnum>

146

converter et validator dans pages.xml

si l'on ne souhaite pas directement indiquer ces lments dans le xhtml (ou autre) converterId= classe ou converter= EL validatorId= classe ou validator= EL Exemple :

JSF et Seam - M. Exbrayat - 2009-2011

<pages> <page view-id="/blog.xhtml"> <param name="date" value="#{blog.date}" validatorId="com.my.blog.PastDate" required="true"/> </page> </pages>

147

JSF et Seam - M. Exbrayat - 2009-2011


JSF

PageFlow

jPDL

Seam

148

JSF
<navigation-rule> <navigation-rule> <from-view-id>/numberGuess.jsp</from-view-id> <from-view-id>/numberGuess.jsp</from-view-id> <navigation-case> <navigation-case> <from-outcome>guess</from-outcome> <from-outcome>guess</from-outcome> <to-view-id>/numberGuess.jsp</to-view-id> <to-view-id>/numberGuess.jsp</to-view-id> <redirect/> <redirect/> </navigation-case> </navigation-case> <navigation-case> <navigation-case> <from-outcome>win</from-outcome> <from-outcome>win</from-outcome> <to-view-id>/win.jsp</to-view-id> <to-view-id>/win.jsp</to-view-id> <redirect/> <redirect/> </navigation-case> </navigation-case> <navigation-case> <navigation-case> <from-outcome>lose</from-outcome> <from-outcome>lose</from-outcome> <to-view-id>/lose.jsp</to-view-id> <to-view-id>/lose.jsp</to-view-id> <redirect/> <redirect/> </navigation-case> </navigation-case> </navigation-rule> </navigation-rule>

JSF et Seam - M. Exbrayat - 2009-2011

149

Seam : pages.xml
<page view-id="/numberGuess.jsp"> <page view-id="/numberGuess.jsp"> <navigation> <navigation> <rule if-outcome="guess"> <rule if-outcome="guess"> <redirect view-id="/numberGuess.jsp"/> <redirect view-id="/numberGuess.jsp"/> </rule> </rule> <rule if-outcome="win"> <rule if-outcome="win"> <redirect view-id="/win.jsp"/> <redirect view-id="/win.jsp"/> </rule> </rule> <rule if-outcome="lose"> <rule if-outcome="lose"> <redirect view-id="/lose.jsp"/> <redirect view-id="/lose.jsp"/> </rule> </rule> </navigation> </navigation> </page> </page>

JSF et Seam - M. Exbrayat - 2009-2011

150

Seam : sans indirection

directement dans la mthode action

de type String retourne le nom de la page atteindre...

JSF et Seam - M. Exbrayat - 2009-2011

151

Gestion du retour en arrire avec Seam

perte de conversation >> retour au point d'accueil

<page view-id="/checkout.xhtml" no-conversation-view-id="/main.xhtml"/> peut tre dfinie globalement

JSF et Seam - M. Exbrayat - 2009-2011

152

jPDL

JSF et Seam - M. Exbrayat - 2009-2011

<pageflow-definition name="numberGuess"> <pageflow-definition name="numberGuess"> <start-page name="displayGuess" view-id="/numberGuess.jsp"> <start-page name="displayGuess" view-id="/numberGuess.jsp"> <redirect/> <redirect/> <transition name="guess" to="evaluateGuess"> <transition name="guess" to="evaluateGuess"> <action expression="#{numberGuess.guess}" /> <action expression="#{numberGuess.guess}" /> </transition> </transition> </start-page> </start-page> <decision name="evaluateGuess" <decision name="evaluateGuess" expression="#{numberGuess.correctGuess}"> expression="#{numberGuess.correctGuess}"> <transition name="true" to="win"/> <transition name="true" to="win"/> <transition name="false" to="evaluateRemainingGuesses"/> <transition name="false" to="evaluateRemainingGuesses"/> </decision> </decision> <decision name="evaluateRemainingGuesses" <decision name="evaluateRemainingGuesses" expression="#{numberGuess.lastGuess}"> expression="#{numberGuess.lastGuess}"> <transition name="true" to="lose"/> <transition name="true" to="lose"/> <transition name="false" to="displayGuess"/> <transition name="false" to="displayGuess"/> </decision> </decision> <page name="win" view-id="/win.jsp"> <page name="win" view-id="/win.jsp"> <redirect/> <redirect/> <end-conversation /> <end-conversation /> </page> </page> <page name="lose" view-id="/lose.jsp"> <page name="lose" view-id="/lose.jsp"> <redirect/> <redirect/> <end-conversation /> <end-conversation /> </page> </page> </pageflow-definition> </pageflow-definition>

153

Exceptions

Les classes exceptions peuvent tre annots pour un traitement graphique matris @Redirect : redirection vers une page donne

viewId : nom de la page de redirection message : message afficher (par dfaut msg de l'exception) end : fin de conversation (defaut = false) errorCode : code erreur http message end
154

JSF et Seam - M. Exbrayat - 2009-2011

@HttpError : redirection vers page d'erreur standard


Et encore...

on peut utiliser des intercepteurs... on peut faire du workflow on peut s'interfacer avec des pages excell on peut s'interfacer avec Spring produire des pdf grer l'internationalisation ...

JSF et Seam - M. Exbrayat - 2009-2011

155