JSF Java Server Faces
JSF Java Server Faces
JSF Java Server Faces
SERLI : www.serli.com
Société de services en informatique
Fondée en 1981
Située sur le site du Futuroscope, Poitiers
Réalisation de logiciels et assistance technique
Domaines de compétences
Systèmes d’informations
Embarqué et temps réel
Systèmes et réseaux
Gestion Electronique de Document (GED, PDM / PLM)
keulkeul.blogspot.com
FAQ : http://wiki.java.net/bin/view/Projects/JavaServerFacesSpecFaq
Exemples et composants
Exemples JSF (AJAX, composants) : http://jsftutorials.net
Communauté JSF : http://www.jsfcentral.com JSF - M. Baron - Page 386
Bibliothèque …
http://localhost/myAppli/faces/index.jsp
http://localhost/myAppl/index.jsf
web.xml
JSF - M. Baron - Page 393
Configuration : accès restreints aux pages JSP
Quand une page JSP utilise des composants JSF elle doit être
traitée obligatoirement par la Servlet principale
http://localhost/myAppli/faces/index.jsp : appel de la page index.jsp
Solutions
Utiliser la balise security-constraint dans le fichier web.xml
Déclarer chaque page JSP qui doit être protégée (celles qui utilisent
des composants JSF) 394
JSF - M. Baron - Page
Configuration : accès restreints aux pages JSP
<faces-config>
<navigation-rule>
...
Description de fonctionnement
</navigation-rule>
de l’application JSF
<managed-bean>
...
keulkeul.blogspot.com
</managed-bean>
</faces-config>
Globale à
WEB-INF web.xml l’application jsf-api.jar
MyApp faces-config.xml
lib
keulkeul.blogspot.com
jsf-impl.jar
classes ... jstl-1.2.jar
jsf-api.jar …
jsf-impl.jar
lib
jstl-1.2.jar
…
conf
Locale à Tomcat
classes
l’application
JSF - M. Baron - Page 399
Configuration : JSF et Tomcat
com.sun.faces.config.ConfigureListener
</listener-class>
</listener>
<listener>
<listener-class>
com.sun.faces.application.WebappLifecycleListener
</listener-class>
</listener>
</web-app>
JSF - M. Baron - Page 400
Le premier exemple « Hello World avec JSF »
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Hello World avec JSF</title>
</head>
<body>
<core:view>
<h1><html:outputText value="Hello World avec JSF" /></h1><br>
La même chose avec du HTML : <h1>Hello World avec JSF</h1>
</core:view>
</body>
keulkeul.blogspot.com
</html>
welcomeJSF.jsp du projet
HelloWorld
JSF - M. Baron - Page 401
Le premier exemple « Hello World avec JSF »
<url-pattern>/welcomeJSF.jsp</url-pattern>
</web-resource-collection>
<auth-constraint>
<description>Pas de rôles, donc pas d’accès direct</description>
</auth-constraint>
</security-constraint>
</web-app>
<faces-config>
</faces-config>
keulkeul.blogspot.com
faces-config.xml
Dans cet exemple aucune configuration du projet
est nécessaire. Nous verrons dans la HelloWorld
suite les règles de navigation et la
déclaration de Bean managés
JSF - M. Baron - Page 405
Bean Managé : principe
Un Bean managé est un Bean dont la vie est gérée par JSF
et déclaré dans le fichier de configuration faces-config.xml
Définir la durée de vie (scope) d’un Bean
Initialiser les propriétés d’un Bean
A la différence des Beans utilisés dans Struts, les Beans
managés de JSF n’héritent pas d’une classe particulière
Les classes sont stockées dans le répertoire WEB-INF/classes
*.html, *.jsp, ...
classes Beans
<managed-bean>
<managed-bean-name>MyBean</managed-bean-name>
<managed-bean-class>mypackage.MyFirstBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
...
faces-config.xml JSF - M. Baron - Page 408
Bean managé : JSP, Bean et Expression Language (EL)
Un formulaire JSF doit être construit dans un groupe défini
par la balise <html:form> ... </html:form>
ACTION est automatiquement à SELF (URL courante)
METHOD est obligatoirement POST
beanform1.jsp du projet
ManagedBean
#{expression}
${expression}
...
implicitobjects.jsp du
projet ImplicitObjects
return password;
}
public void setPassword(String t) {
this.password = t;
}
}
beanform2.jsp du projet
ManagedBean
Affichage de la valeur
d’initialisation du Bean
JSF - M. Baron - Page 417
Bean managé : modifier/afficher la propriété d’un Bean
<faces-config>
<managed-bean>
<managed-bean-name>
Identifiant utilisé pour accéder
registrationbean
</managed-bean-name> au Bean défini par la classe
<managed-bean-class> beanpackage.RegistrationBean
beanpackage.RegistrationBean
</managed-bean-class>
<managed-bean-scope>
request
</managed-bean-scope>
</managed-bean>
keulkeul.blogspot.com
</faces-config>
faces-config.xml du projet
ManagedBean
JSF - M. Baron - Page 418
Bean managé : initialisation des propriétés d’un Bean
<managed-bean>
...
<managed-property>
<property-name>cities</property-name>
<list-entries>
<value-class>java.lang.String</value-class>
keulkeul.blogspot.com
<value>Poitiers</value>
<value>Limoges</value>
<value>Viroflay</value>
</list-entries>
</managed-property>
</managed-bean>
<property-name>prices</property-name>
<map-entries>
<map-entrie>
<key>SwimmingPool High Pressure</key>
<value>250</value>
</map-entrie>
</map-entries>
<managed-property>
<property-name>adress</property-name> projet
<value>your adress</value> ManagedBean
</managed-property>
</managed-bean>
JSF - M. Baron - Page 422
Bean managé : initialisation des propriétés d’un Bean
</managed-property>
</managed-bean>
faces-config.xml du projet
ManagedBean
JSF - M. Baron - Page 423
Bean managé : initialisation des propriétés d’un Bean
beanform3.jsp du projet
ManagedBean
Réponse Réponse
Complète Complète
Erreurs de Conversion
Erreurs de Conversion
et / ou de Validation
Détaillé au fur et à mesure : conversion,
validation, événements, … JSF - M. Baron - Page 425
Cycle de vie d’une JSF : généralités
form1.jsp du projet
Navigation
<html>
... acceptedSimple.jsp
keulkeul.blogspot.com
<body>
du projet Navigation
<core:view>
<h1><html:outputText value="Redirection Réussie" /></h1>
</core:view>
</body>
</html>
N’oubliez pas de protéger toutes les pages
JSP : form1.jsp et acceptedSimple.jsp JSF - M. Baron - Page 430
Navigation dynamique : exemples
return "Accepted";
} la validation des informations
} saisies dans un formulaire. Nous
approfondirons cet aspect dans la
BeanController2.java partie Validators
du projet Navigation JSF - M. Baron - Page 431
Navigation dynamique : exemples
<managed-bean-class>
beanPackage.BeanController2 faces-config.xml du
</managed-bean-class> projet Navigation
...
</faces-config>
</body> beancontroller2 et à la
</html> méthode loginConnect
form2.jsp du projet
Navigation
JSF - M. Baron - Page 433
Navigation dynamique : exemples
<html> accepted.jsp du
<head> projet Navigation
<title>Résultat du traitement du formulaire</title>
</head>
<body>
<core:view>
<h1><html:outputText value="Connexion de : "/>
<html:outputText value="#{beancontroller2.name}" /></h1>
</core:view>
</body>
keulkeul.blogspot.com
</html>
Pour exploiter les composants JSF dans les pages JSP, des
balises personnalisées sont utilisées … JSF - M. Baron - Page 435
Composants graphiques : balises CORE
selectBooleanCheckbox graphicImage
selectManyCheckbox Famille des commandes
selectManyListbox commandButton
selectManyMenu commandLink
JSF - M. Baron - Page 438
Composants graphiques : balises HTML saisis
selectManyCheckbox
selectBooleanCheckbox
intputText
intputSecret
selectManyMenu
selectOneListbox
keulkeul.blogspot.com
selectManyListbox
selectOneMenu
intputTextarea
selectOneRadio JSF - M. Baron - Page 439
Composants graphiques : balises HTML sorties et
commandes
commandButton
commandLink
outputText
graphicImage
dataTable
outputLink
keulkeul.blogspot.com
panelGrid
valeur
converter : nom de la classe pour une conversion de données
validator : nom de la classe pour une validation de données
required : true valeur obligatoire, false valeur optionnelle
JSF - M. Baron - Page 442
Composants graphiques : détail balises HTML
outputcomponent.jsp
du projet
GraphicalComponents
</core:facet>
<html:outputText value="#{personne.birthdata}" />
</html:column>
<html:facet name="footer">
<html:outputText value="#{outputbean.caption}" />
</html:facet> datatablecomponent2.jsp
...
</html:dataTable> du projet
</core:view> GraphicalComponents
JSF - M. Baron - Page 451
Composants graphiques : <html:dataTable>
background-color:#GFGFGF;
}
.row2 {
Background-color:#CECECE;
.footer { output.css
background-color:#000009;
du projet
Color:white;
} GraphicalComponents
JSF - M. Baron - Page 453
Composants graphiques : <html:dataTable>
datatablecomponent4.jsp
du projet
GraphicalComponents
instance unique
map : les entrées sont les itemLabels et itemValues de SelectItem
collection
tableau JSF - M. Baron - Page 458
Composants graphiques : <core:selectItems>
html:selectOneRadio html:selectManyListbox
html:selectManyCheckbox
html:selectOneMenu
keulkeul.blogspot.com
html:selectOneListbox
html:selectManyMenu
}
Utilisée pour
public void setManyCheckBoxValues(String[] p) { modifier la valeur
manyCheckBoxValues = p; sélectionnée
} courante
}
balise
outputText
HtmlInputText HtmlCommandButton
HtmlOutputText Associée à la
balise
intputText JSF - M. Baron - Page 463
FacesContext : principe
facescontext.jsp
du projet
FacesContext
keulkeul.blogspot.com
backingbean1.jsp
du projet
Un bouton activé BackingBean
Une valeur dans un
composant texte Un bouton
keulkeul.blogspot.com
désactivé
} BackingBean.java
if (composantNom != null) {
du projet
composantNom.setValue("Nouvelle Valeur");
} BackingBean
}
}
BeanMessages du
projet Messages JSF - M. Baron - Page 475
Message : manipulation et affichage
<html>
Affichage sous la
...
<body> forme d’un tableau
<core:view>
<html:form>
<html:messages showDetail="true" layout="table" showSummary="true"/><br>
<html:outputText value="Nom : "/>
<html:inputText value="#{beanmessages.name}"/><br>
<html:commandButton value="Valider" action="#{beanmessages.validAction}"/>
<html:commandButton value="Annuler" action="#{beanmessages.cancelAction}"/>
</html:form>
</core:view>
</body>
</html>
keulkeul.blogspot.com
form1.jsp du projet
Messages
BeanMessage.java du
projet Messages JSF - M. Baron - Page 478
Message : Internationalisation
<message-bundle>resources.ApplicationMessage</message-bundle>
<locale-config>
<default-locale>en</default-locale>
<supported-locale>fr</supported-locale>
<supported-locale>sp</supported-locale>
</locale-config>
faces-config.xml
</application>
JSF - M. Baron - Page 479
Message : Internationalisation
<html>
<head> Solution pour
<title>Formulaire JSF avec un Bean Managé</title> la version 1.1
de JSF
</head>
<body>
<core:view>
<core:loadBundle basename="CoursesMessages" var="bundle" />
<html:form>
<html:outputText value="#{bundle.EMAIL_ADRESS_MESSAGE}"/>
<html:inputText value="#{registrationbean.email}"/><br>
<html:outputText value="#{bundle.PASSWORD_MESSAGE}" />
<html:inputSecret value="#{registrationbean.password}"/><br>
keulkeul.blogspot.com
<application>
<resource-bundle>
<base-name>resources.ApplicationMessage</base-name>
Solution pour
<var>bundle</var> la version 1.2
</resource-bundle> de JSF
</application>
Réponse Réponse
Complète Complète
Réponse Réponse
Complète Complète
6 5 2
Réponse Update
Render Process Invoke Process
Response Model
Faces Events Application Events
Values
keulkeul.blogspot.com
4
Erreurs de Conversion
3
Erreurs de Conversion
et / ou de Validation
Ensemble de méthodes
(accesseurs et modifieurs) pour la
manipulation de ces propriétés
JSF - M. Baron - Page 488
Conversion de données : cycle de vie (via l'API)
phase Process
Nous décrirons la classe Validations peut récupérer
Converter au moment de la les valeurs qui étaient issues
création de notre propre des paramètres
converter
JSF - M. Baron - Page 489
Conversion de données : cycle de vie (via l'API)
modèle
return price;
}
public void setPrice(double pPrice) {
this.price = pPrice;
}
}
BeanConverter1 du
projet Converters JSF - M. Baron - Page 492
Conversion de données : tag convertNumber
converters2.jsp du
Après la conversion
keulkeul.blogspot.com
projet Converters
Avant la conversion, au
moment de la saisie …
JSF - M. Baron - Page 493
Conversion de données : tag convertDateTime
<html:outputText value="#{packageBean.facturedate}">
<core:convertDateTime type="date" dateStyle="long"/>
</html:outputText>
</core:view>
</body>
</html>
public BeanConverter2() {
tickets = 50;
name = "Mon Nom";
date = new Date();
}
BeanConverter2.java
du projet Converters
JSF - M. Baron - Page 496
Conversion de données : messages
...
<html:outputText value="Prix : " />
<html:intputText id="priceId" value="#{beanconverter1.price}" >
<core:convertNumber minFractionDigits="2" />
</html:inputText><html:message for="priceId" /><br>
<html:commandButton value="Envoyer" />
...
JSF - M. Baron - Page 497
Conversion de données : messages
</core:view>
</body>
</html>
...
javax.faces.convert.NumberConverter.CONVERSION = Problème pour le champs
"Nombre de tickets"
Javax.faces.convert.NumberConverter.CONVERSION_detail = "{0}" : La donnée
n'est pas un nombre valide
...
web.xml
MyApp
WEB-INF
faces-config.xml MyMessages.properties
classes MyMessages.properties
Réponse Réponse
Complète Complète
Quand
immediate == true
Réponse Réponse
Complète Complète
Réponse Update
Render Process Invoke Process
Response Model
Faces Events Application Events
Values
keulkeul.blogspot.com
Erreurs de Conversion
Cycle de vie valable ssi le
composant concerné par l’attribut Erreurs de Conversion
immediate est de type Commandet / ou de Validation
JSF - M. Baron - Page 503
Conversion de données : attribut immediate
Les problèmes de
conversion ne sont pas
pris en compte
keulkeul.blogspot.com
<navigation-case>
convertersImmadiate.jsp <from-outcome>CancelAction</from-outcome>
du projet Converters <to-view-id>/index.jsp</to-view-id>
</navigation-case>
</navigation-rule>
...
faces-config.xml du </faces-config>
projet Converters
JSF - M. Baron - Page 505
Conversion de données : conversion personnalisée
Pour bientôt …
Réalisation de son propre Converter
keulkeul.blogspot.com
Réponse Réponse
Complète Complète
Réponse Réponse
Complète Complète
6 2
Réponse Update
Render Process Invoke Process
Response Model
Faces Events Application Events
Values
keulkeul.blogspot.com
Erreurs de Conversion
3
Erreurs de Conversion
et / ou de Validation
</html:form>
...
standardvalidator.jsp du
projet Validators
correctement passée
Si exception déclenchée, au développeur à prendre en charge
les messages à retourner via l’objet FacesContext
JSF - M. Baron - Page 514
Validation de données : validators personnalisés
}
}
} ... faces-config.xml du
<validator>
<validator-id>myValidatorId</validator-id>
projet Validators
<validator-class>beanPackage.PersoValidator</validator-class>
</validator>
</faces-config>
JSF - M. Baron - Page 516
Validation de données : validators personnalisés
Validator
L’inconvénient de cette approche est qu’elle est fortement liée
à l’application et il devient difficile de réutiliser le validator
JSF - M. Baron - Page 518
Validation de données : validators personnalisés
myValue = ref.toString();
keulkeul.blogspot.com
persoattributvalidator.jsp
keulkeul.blogspot.com
du projet Validators
Pour bientôt …
Ecriture de ses propres balises pour la conversion et la validation
keulkeul.blogspot.com
Réponse Réponse
Complète Complète
Réponse Update
Render Process Invoke Process
Response Model
Faces Events Application Events
Values
keulkeul.blogspot.com
Les ActionListeners
sont notifiés
Erreurs de Conversion
Erreurs de Conversion
et / ou de Validation
JSF - M. Baron - Page 523
La gestion des événements : cycle de vie
Dans les deux cas, il faut fournir les méthodes qui seront
appelées lors du déclenchement des écouteurs
Dans le cas de l’attribut une méthode doit être fournie dans
le Bean (ici inputChangement) avec en paramètre le type
d’événement à traiter (ValueChangeEvent ou ActionEvent)
Dans le cas de la balise une classe implémentant l’interface
ValueChangeListener ou ActionListener doit être fournie
A noter qu’il est possible qu’un Bean (au sens qui stocke des
keulkeul.blogspot.com
valueChangeListenerAttribut.jsp
keulkeul.blogspot.com
du projet Event
}
}
DataBean.java
du projet Event
JSF - M. Baron - Page 529
La gestion des événements : changement de valeur
<p>
<html:outputText value="Choisissez votre périphérique : " />
<html:selectOneMenu onchange="submit()" value="#{databean.oneMenuValue}" >
<core:valueChangeListener type="beanPackage.SelectOneMenuListener" />
<core:selectItems value="#{databean.manyCheckBoxItems}" />
</html:selectOneMenu>
</p>
</html:form>
keulkeul.blogspot.com
valueChangeListenerTag.jsp
du projet Event
SelectOneMenuListener.java InputTextChangeListener.java
du projet Event du projet Event
keulkeul.blogspot.com
System.out.println(event.getNewValue());
System.out.println(event.getComponent().getClass());
}
DataBeanBis.java public void processValueChange(ValueChangeEvent event) throws
du projet Event AbortProcessingException {
System.out.println("SelectOneMenu");
}
}
JSF - M. Baron - Page 532
La gestion des événements : actions
…
</html:panelGrid>
</html:form>
keulkeul.blogspot.com
if (id.equals("Automne")) {
automne.setDisabled(true);
keulkeul.blogspot.com
hivers.setDisabled(false);
}
}
public HtmlCommandButton getAutomne() { return automne; }
public void setAutomne(HtmlCommandButton automne) { this.automne = automne; }
...
}
if (id.equals("confirmer")) {
System.out.println("Action Confirmation");
keulkeul.blogspot.com
if (id.equals("annuler")) {
System.out.println("Action Annulation");
}
} ActionBean.java du projet
} Event
Réponse Réponse
Complète Complète
Réponse Update
Render Process Invoke Process
keulkeul.blogspot.com
Response Model
Faces Events Application Events
Values
Erreurs de Conversion
Erreurs de Conversion
et / ou de Validation JSF - M. Baron - Page 538
La gestion des événements : immediate
Ecran de démarrage
Si changement de localisation
(composant SelectOneMenu)
avec l’attribut immediate à true,
la validation n’est pas effectuée JSF - M. Baron - Page 540
La gestion des événements : immediate
<p>
<html:commandButton value="#{bundle.VALID_MESSAGE}"/>
</p>
</html:form> immediateAttribut.jsp du projet
</core:view> Event
Evénement PhaseEvent
getFacesContext() : retourne l’instance du FacesContext pour la
requête en cours de traitement
getPhaseId() : retourne l’ID de la phase du cycle de vie en cours de
traitement
Ecouteur PhaseListener
afterPhase(PhaseEvent) : appelée quand une phase du cycle de vie se
termine
beforePhase(PhaseEvent) : appelée avant le démarrage d’une phase
du cycle de vie
keulkeul.blogspot.com
LifeCycleListener.java du projet
Event
JSCook Menu
Tree « 2 »
Popup
keulkeul.blogspot.com
TabbedPane
Calendar
HtmlEditor
keulkeul.blogspot.com
Data Scroller
Tree Table
JSF - M. Baron - Page 548
Apache Tomahawk : composants graphiques (suite)
Panel Navigation
keulkeul.blogspot.com
validateRegExpr
Pour valider des expressions régulières
<html:inputText id="regExprValue" value="#{validateForm.regExpr}" required="true">
<t:validateRegExpr pattern='\d{5}'/>
</html:inputText>
JSF - M. Baron - Page 550
Apache Tomahawk : installation
Pour bientôt …
Généralité sur la conception de composants personnalisés
Balises personnalisés, code du composant, rendu
Exemple : thermomètre étendu …
keulkeul.blogspot.com