Vous êtes sur la page 1sur 65

Java pour le dveloppement

dapplications Web : Java EE


Struts

Mickal BARON - 2006


mailto:baron.mickael@gmail.com ou mailto:mickael.baron@serli.com
SERLI informatique

 SERLI : www.serli.com
 Socit de services en informatique
 Fond en 1981
 Situe sur le site du Futuroscope, Poitiers
 Ralisation de logiciels et assistance technique
 Domaines de comptences
 Systmes dinformations
 Embarqu et temps rel
 Systmes et rseaux
 Gestion Electronique de Document (GED, PDM / PLM)
keulkeul.blogspot.com

 Plateformes de dveloppement (celles qui concernent les cours)


 Plateforme Java : Java EE, Java SE, Eclipse
 Plateforme Microsoft : C#, VB .NET
 Struts - M. Baron - Page 314
SERLI informatique

 Equipes impliques dans lOpen Source


 Utilisation massive de briques Open Source

 Formation / diffusion de cours concernant Java et lOpen Source

 RMLL : 7me rencontres mondiales du logiciel libre

 Solutions Linux 2007 : Salon des Solutions Open Source pour lentreprise

 Membre du consortium ObjectWeb

 Gestion de projets Open Source


keulkeul.blogspot.com

 JaasLounge : interoprabilit JAAS pour Java EE

 JShaft : gestion de clusters Java EE

 JWT Gen : tests fonctionnels automatiss


Struts - M. Baron - Page 315
Struts : quest-ce-que cest ...

 La bibliothque Struts est un framework qui permet de construire


des applications web respectant le modle darchitecture MVC
 Cest une mthode de dveloppement qui fournit le minimum de
rgles pour construire une application web professionnelle
(sparation des mtiers et donc des comptences)
 Struts est un projet soutenu par lApache Software Foundation. Des
informations complmentaires dans struts.apache.org
 Logique de fonctionnement
 la structure de lapplication web est dcrite dans un fichier struts-config.xml
keulkeul.blogspot.com

 lutilisation de Servlets est transparente via des classes adaptes


 les pages JSP exploitent des balises personnalises de Struts. Il est conseill
dutiliser en parallle la bibliothque JSTL
Struts - M. Baron - Page 316
Struts : utile ou pas ?

 Struts est un framework assez lourd pour une simple application


(un formulaire et une rponse par exemple)

 Il introduit un niveau de complexit et de mise en route importants


et les bnfices de son utilisation se font ressentir ds que
lapplication prends de limportance

 Sur le web de nombreuses formations quant son utilisation


montrent son importance dans les projets industriels
keulkeul.blogspot.com

 Une nouvelle bibliothque est en passe de supplanter Struts :


Java Server Faces (JSF) mais trop rcente et pas assez mre pour en
discuter dans ce cours ( vrifier )
Struts - M. Baron - Page 317
Struts : documentation ...

 De nombreuses ressources sont disponibles concernant Struts


 La FAQ de Developpez.com : java.developpez.com/faq/struts
 Struts par lexemple : taha.developpez.com
 Jakarta Struts - prcis & consis (OReilly), ...

 Les nombreuses ressources prsentent principalement la version 1.1


de la bibliothque de Struts (incompatibilit avec la 1.2)

 Tlchargement de Struts struts.apache.org/download.cgi


keulkeul.blogspot.com

 Prsentation base sur un exemple


 un formulaire qui demande la saisie dun nom et dun age
 contraintes dintgrit : prsence des paramtres, age est un entier positif
 diffrentes vues : erreurs, formulaire, validation Struts - M. Baron - Page 318
Struts : principe gnrique de la mthode
Le client envoie
une requte au Le contrleur Non tudi dans
contrleur struts-config.xml traite la ce cours
requte du
Client WEB Configuration
2 client
EJB

1 ActionServlet ActionForm Fichiers Java

Fichiers Java Fichiers Java

Le client La vue est Accs Donnes


reoit la choisie et
prsentation paramtre Action Fichiers Java
6 4
issue de la selon ltat du Fichiers Java
Contrleur
vue contrleur 3 Modle

Gnration de la page Sauvegarde les


keulkeul.blogspot.com

page.jsp 5 JSP en HTML informations des


formulaires
Fichiers JSP SGBD (mySQL,
JSTL properties.fr Oracle, )

Struts properties.en
Vue
Biblio. Perso. Ressources
Struts - M. Baron - Page 319
Struts : principe gnrique de la mthode : Contrleur

 Le contrleur est le cur de lapplication web. Toutes les demandes


du client transitent par lui

 Il est dfini par une Servlet gnrique de type ActionServlet fournie


par lAPI de Struts

 Le contrleur prend les informations dont il a besoin dans le


fichier struts-config.xml

 Si la requte du client contient des paramtres, ceux-ci sont transmis


dans un objet de type ActionForm
keulkeul.blogspot.com

 Selon ltat retourn par lActionForm prcdent, le contrleur traite


une action spcifique par un objet de type Action

Struts - M. Baron - Page 320


Struts : intgration dans lapplication web

 De manire intgrer le framework Struts dans une application


web, il est ncessaire denrichir le fichier web.xml
 Par principe le contrleur Struts est atteint par toutes les URLs se
terminant par le suffixe .do
...
Le contrleur est dfini par la
<servlet>
<servlet-name>action</servlet-name> Servlet gnrique ActionServlet
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
</servlet> En paramtre de la Servlet le
<servlet-mapping> fichier struts-config.xml
<servlet-name>action</servlet-name>
keulkeul.blogspot.com

<url-pattern>*.do</url-pattern>
</servlet-mapping> Possibilit de dfinir
...
plusieurs ActionServlet pour
une mme application Web
Toute URL terminant par .do
est traite par le contrleur
Struts - M. Baron - Page 321
Struts : le fichier configuration struts-config.xml

 Le fichier grant la logique de lapplication web sappelle par


dfaut struts-config.xml
 Il est plac dans le rpertoire WEB-INF au mme niveau que
web.xml
 Il dcrit essentiellement trois lments :
 les objets Bean associs aux formulaires JSP (ActionForm)
 les actions raliser suite aux rsultats des objets ActionForm (Action)
 les ressources ventuelles suites des messages
 Le fichier de configuration est un fichier XML dcrit par une DTD.
La balise de dpart est <struts-config>
keulkeul.blogspot.com

<?xml version="1.0" encoding="ISO-8859-1"?>


<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
"http://struts.apache.org/dtds/struts-config_1_2.dtd">

<struts-config> Description de fonctionnement de


... larchitecture de lapplication web
</struts-config>
Struts - M. Baron - Page 322
Struts : Action

 Une action est un traitement obtenu suite au passage de la requte


au contrleur

 Nous distinguons deux sortes de requte client


 requte sans paramtre issue par exemple dune re-direction
 requte avec paramtres issue par exemple dun formulaire

 Les actions sont dcrites dans la balise <action-mappings> au


moyen de la balise <action>
keulkeul.blogspot.com

 Selon le type de requte (avec ou sans paramtre) diffrents attributs


de la balise <action> sont renseigner

Struts - M. Baron - Page 323


Struts : Action

 Dans le cas dune requte sans paramtre le rle du contrleur est de


relayer la demande du client une URL
 La balise <action> dispose alors des attributs suivants
 String path : dfinit le nom de lURL (suffixe .do implicite)
 String type : dfinit le nom de la classe Action qui doit traiter la demande.
Utilisez la classe org.apache.struts.actions.ForwardAction dans ce cas prcis
de re-direction
 String parameter : le nom de lURL qui doit tre relaye la demande
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
"http://struts.apache.org/dtds/struts-config_1_2.dtd">
<struts-config>
Quand le client transmet lURL .../monnom.do
keulkeul.blogspot.com

<action-mappings>
<action au contrleur celui-ci redirige vers
path="/monnom" /vues/mapage.jsp
parameter="/vues/mapage.jsp"
type="org.apache.struts.actions.ForwardAction" />
</action-mappings>
</struts-config>

Il sagit dune re-direction


Struts - M. Baron - Page 324
Struts : Action

 pisode 1 : appelle du formulaire de saisie du nom et de lage


<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
"http://struts.apache.org/dtds/struts-config_1_2.dtd">
<struts-config> Le formulaire est
<action-mappings>
<action dfini dans la
path="/formulaire" page
parameter="/vues/formulaire.jsp" formulaire.jsp
type="org.apache.struts.actions.ForwardAction" />
</action-mappings>
</struts-config>

Le client envoie la requte


suivante
keulkeul.blogspot.com

Cest la page formulaire.jsp


qui est retourne au client

Struts - M. Baron - Page 325


Struts : Action

 Dans le cas dune requte avec paramtres le rle du contrleur est


double
 transmettre les informations dans un objet Bean de type ActionForm
 raliser une action spcifique (autre quune simple redirection)

 La balise <action> dispose en plus des attributs dj tudis des


attributs suivants
 String scope : les valeurs du formulaire sont stockes en session
 String name : rfrence le nom dune section <form-bean> (voir ci-aprs)
 String validate : indique si la mthode validate de lobjet ActionForm doit tre
keulkeul.blogspot.com

appele ou non (voir ci-aprs)


 String input : indique la vue qui sera appele sil y a erreur dans lobjet
ActionForm

Struts - M. Baron - Page 326


Struts : Action

 Les formulaires sont dclars dans la balise <form-beans> au


moyen de la balise <form-bean>
 La balise <form-bean> possde les attributs suivants
 String name : nom du formulaire de la page JSP
 String type : classe de type ActionForm qui stocke les paramtres du Bean
<?xml version="1.0" encoding="ISO-8859-1"?>
...
<struts-config>
<form-beans>
<form-bean name="monformulaire" type="monpackage.ClassActionForm" />
</form-beans>
<action-mappings> Quand le client transmet lURL
<action
path="/monnom" .../monnom.do au contrleur
name="monformulaire" celui-ci redirige vers
scope="session"
/vues/mapage.jsp si aucun
keulkeul.blogspot.com

validate="true"
input="/pageerreurs.do" problme
parameter="/vues/mapage.jsp"
type="org.apache.struts.actions.ForwardAction" />
</action-mappings>
</struts-config>

Dans le cas o les paramtres sont mauvais le


contrleur redirige vers /pageerreurs.do Struts - M. Baron - Page 327
Struts : Action

 pisode 2 : envoie dune requte de type POST du formulaire


Trois actions et un formulaire sont Le formulaire est dfini par
actuellement dfinis formPersonne
...
<struts-config>
<form-beans>
<form-bean name="formPersonne" type="monpackage.FormulaireBean" />
</form-bean>
Les valeurs sont stockes dans
<action-mappings> monpackage.FormulaireBean
<action
path="/main" name="formPersonne" scope="session" validate="true"
input="/erreurs.do" parameter="/vues/main.jsp"
type="org.apache.struts.actions.ForwardAction " />
<action
path="/formulaire" Si les donnes sont
parameter="/vues/formulaire.jsp" correctes direction
type="org.apache.struts.actions.ForwardAction" />
<action
/vues/main.jsp
keulkeul.blogspot.com

path="/erreurs" sinon direction


parameter="/vues/erreurs.jsp" /erreurs.do
type="org.apache.struts.actions.ForwardAction" />
</action-mappings>
</struts-config>

Struts - M. Baron - Page 328


Struts : Action

 pisode 2 (suite) : envoie dune requte issue du formulaire


<%@ taglib uri="htmlstruts" prefix="html" %> Bibliothque de balises
...
<body>
personnalises Struts:HTML
<center>
<h2>Personne - Formulaire</h2><hr> Laction du formulaire est dappeler
<html:form action="/main" >
<table> la ressource /main associe
<tr>
<td>Nom</td>
<td><html:text property="nom" size="20" /></td>
</tr>
<tr>
<td>Age</td>
<td><html:text property="age" size="3"/></td>
</tr>
Les deux paramtres transmis
</table> en paramtre de la requte
<table>
<tr>
<td><html:submit value="Envoyer" /></td>
keulkeul.blogspot.com

<td><html:reset value="Retablir" /></td>


<td><html:button property="btnEffacer" value="Effacer" onclick="effacer()"/></td>
</tr>
</table>
</html:form>
... Nous reviendrons plus tard
sur la comprhension de la
bibliothque struts-html
Struts - M. Baron - Page 329
Struts : ActionForm
 Lobjectif dun objet de type ActionForm est de stocker les
informations issues dun formulaire
 Les objets de type ActionForm sont construits comme un objet Bean
Utilisation du principe de la rflexivit
 La classe Bean devra donc hriter de la classe ActionForm du
package org.apache.struts.action
 Cest le contrleur via la Servlet qui se charge de crer les instances
des objets de type ActionForm
 Pour chaque proprit, le Bean doit dfinir un attribut et deux
mthodes
keulkeul.blogspot.com

 un modifieur pour affecter une valeur lattribut


 un accesseur pour obtenir la valeur de lattribut correspondant
Linstanciation dun objet de type ActionForm
est implicite. Linformation est donne dans
struts-config.xml Struts - M. Baron - Page 330
Struts : ActionForm

 Hormis le but de stocker les proprits des formulaires, les objets de


type ActionForm soccupe aussi de laspect smantique des donnes
 La mthode validate soccupe de vrifier la validit des attributs de
lobjet Bean
 ActionErrors validate(ActionMapping, HttpServletRequest)
 le paramtre ActionMapping est un objet image de la configuration de laction
en cours stocke dans struts-config.xml
 le paramtre HttpServletRequest est la requte du client transmise par la
Servlet de contrle
 le retour ActionErrors permet de retourner des messages erreurs au client
keulkeul.blogspot.com

 La classe ActionForm dispose galement d autres mthodes


 ActionServlet getServlet() : retourne la Servlet qui gre le contrle
 reset(ActionMapping, HttpServletRequest) : initialise les proprits
Struts - M. Baron - Page 331
Struts : ActionForm

 Un objet de type ActionMapping permet dextraire les informations


contenu dans le fichier struts-config.xml
 Il possde des mthodes associes
...
<action
path="/main" name="formPersonne" scope="session" validate="true"
input="/erreurs.do" parameter="/vues/main.jsp"
type="org.apache.struts.actions.ForwardAction " />
...

 String getType() : pour accder au contenu de lattribut type


 String getInput() : pour accder au contenu de lattribut input
keulkeul.blogspot.com

 Un objet ActionErrors permet dajouter des erreurs et lajout se fait


par la mthode
 add(String, ActionMessage) : o le premier paramtre correspond la cl et le
second au message derreur
Struts - M. Baron - Page 332
Struts : ActionForm

 pisode 3 : stocker les informations du formulaire


La classe du
framework
public class FormulaireBean extends ActionForm { Struts qui gre
private String nom = null; les Beans
private String age = null;
Les deux attributs associs aux
public String getNom() { modlisant les proprits formulaires
return nom; du Bean
}

public void setNom(String nom){


this.nom = nom;
}

public void setAge(String age) {


this.age = age;
}
Les modifieurs et
keulkeul.blogspot.com

public String getAge() { accesseurs pour traiter et


return age; modifier les proprits
}
...
}

Struts - M. Baron - Page 333


Struts : ActionForm

 pisode 3 (suite) : stocker et valider les informations du formulaire


public class FormulaireBean extends ActionForm {
... // Li la modlisation des proprits
public ActionErrors validate(ActionMapping arg0, HttpServletRequest arg1) {
ActionErrors erreurs = new ActionErrors();
Au dbut erreurs if (nom == null || nom.trim().equals("")) {
est vide donc pas erreurs.add("nomvide", new ActionMessage("formulaire.nom.vide"));
}
derreur if (age == null || age.trim().equals("")) {
erreurs.add("agevide", new ActionMessage("formulaire.age.vide"));
} else {
try {
int mon_age_int = Integer.parseInt(age);
if (mon_age_int < 0) {
Ajout des erreurs erreurs.add("ageincorrect",
selon larrivage new ActionMessage("formulaire.age.incorrect"));

}
} catch (Exception e) {
erreurs.add("ageincorrect",
keulkeul.blogspot.com

new ActionMessage("formulaire.age.incorrect",age));
}
}
return erreurs;
}
}
Depuis la nouvelle version 1.2, il faut utiliser
ActionMessage et non ActionError (dsapprouve)
Struts - M. Baron - Page 334
Struts : ActionForm et ActionErrors

 Les messages derreurs stocks dans un objet ActionErrors et


retourner par la mthode validate sont transmis au contrleur
 Si lattribut validate vaut true et que lobjet ActionErrors nest
pas null le contrleur redirige vers la vue de lattribut input
...
<action
path="/main" name="formPersonne" scope="session" validate="true"
input="/erreurs.do" parameter="/vues/main.jsp"
type="org.apache.struts.actions.ForwardAction " />
...

 Les erreurs sont affiches dans la vue JSP au moyen de la balise


personnalise <errors> de la bibliothque Struts-HTML
<%@ taglib uri="htmlstruts" prefix="html" %>
keulkeul.blogspot.com

<html:errors/>

 La balise <errors> naffiche pas les messages mais des identifiants


prsents dans un fichier ressource qui doit tre rfrenc dans struts-
config.xml
Struts - M. Baron - Page 335
Struts : ActionForm et ActionErrors

 Pour dclarer un fichier ressource dans le fichier configuration


struts-config.xml utiliser la balise <message-resources>
 String parameter : nom du fichier ressource De prfrence la
fin du fichier
 boolean null : true affiche null, false affiche ???key??? struts-config.xml
 String key : utiliser quand il y a plusieurs fichiers ressources

 Le fichier ressource doit porter comme extension .properties


 Exemple de fichier : toto.properties

 Le fichier ressource doit tre placer obligatoirement dans un sous-


rpertoire de /WEB-INF/classes. Exemples :
 /WEB-INF/classes/toto.properties Les fichiers ressources sont obligatoires
keulkeul.blogspot.com

quand vous utilisez la balise <errors> dans


 /WEB-INF/classes/
une page JSP
 Pour choisir le fichier ressource utilisez lattribut bundle dans la
balise <errors> en indiquant le nom de la cl
Struts - M. Baron - Page 336
Struts : ActionForm et ActionErrors

 pisode 4 : grer les erreurs smantiques du formulaire


...
Fichier
<message-resources parameter="erreur" null="false" key="erreur" /> erreur.properties
<message-resources parameter="classique" null="false" key="classique" />
</struts-config>
formulaire.nom.vide=<li>Vous devez indiquer un nom</li>
formulaire.age.vide=<li>Vous devez indiquer un age</li>
formulaire.age.incorrect=<li>L'age [{0}] est incorrect</li>
errors.header=<ul>
<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html" %>
errors.footer=</ul>

<html>
<head>
<title>Personne</title>
</head>
<body>
<h2>Les erreurs suivantes se sont produites</h2>
<html:errors bundle="erreur" />
<html:link page="/formulaire.do">
Retour au formulaire
</html:link>
keulkeul.blogspot.com

</body>
</html> Emplacement des
fichiers properties

Struts - M. Baron - Page 337


Struts : Action

 Nous avons pour linstant utilis simplement la classe


ForwardAction qui ne permet que de traiter des re-directions sans
de rels effets de bord
...
<action
path="/main" name="formPersonne" scope="session" validate="true"
input="/erreurs.do" parameter="/vues/main.jsp"
type="org.apache.struts.actions.ForwardAction " />
...

 De manire pouvoir raliser des actions plus complexes


(modification du modle, cration de nouveaux Bean, ) nous
drivons explicitement la classe Action
keulkeul.blogspot.com

 Cette classe possde la mthode execute appele par le constructeur


de lapplication web si aucune erreur ne sest produite
Struts - M. Baron - Page 338
Struts : Action

 ActionForward execute(ActionMapping, ActionForm,


HttpServletRequest, HttpServletResponse)
 le paramtre ActionMapping est un objet image de la configuration de laction
en cours stocke dans struts-config.xml
 le paramtre ActionForm correspond au Bean qui stocke linformation du
formulaire
 le paramtre HttpServletRequest est la rfrence de la requte
 le paramtre HttpServletResponse est la rfrence de la rponse
 le retour ActionForward est un objet pour identifier la destination prochaine
que le contrleur choisira

 Il faut modifier galement struts-config.xml en ajoutant au corps de


keulkeul.blogspot.com

la balise <action> la balise <forward>


 String name : tiquette pour la re-direction
 String path : chemin de re-direction
Struts - M. Baron - Page 339
Struts : Action

 pisode 5 : amliorer le traitement des actions du contrleur


public class FormulaireAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest req, HttpServletResponse res) throws Exception {
FormulaireBean formulaire = (FormulaireBean)form;

req.setAttribute("nom", formulaire.getNom());
Grce au paramtre
req.setAttribute("age", formulaire.getAge());
ActionForm on a accs
return mapping.findForward("response"); au contenu du Bean
}
}

Lobjet requte de la Servlet On indique ici que la


est modifi en ajoutant deux prochaine re-direction se fera
attributs issus du Bean dans response
...
Ajout dans le corps
<action
de cette action de
keulkeul.blogspot.com

path="/main" name="formPersonne" scope="session" validate="true"


input="/erreurs.do" parameter="/vues/main.jsp" la balise
type="monpackage.FormulaireAction">
<forward name="response" path="/reponse.do" />
<forward>
</action>
...

Ltiquette response indique


une nouvelle page cible
Struts - M. Baron - Page 340
Struts : Action

 pisode 5 (suite) : rponse positive


<%@ taglib uri="htmlstruts" prefix="html" %> Utilisation des EL dans la page JSP
<html>
<head>
puisque deux attributs ont t dfinis
<title>Personne</title> dans la classe FormulaireAction
</head> (scope = request)
<body>
<h2>Personne - Reponse</h2><hr>
<table>
<tr>
<td>Nom</td><td>${nom}
</tr>
<tr>
<td>Age</td><td>${age}
</tr>
</table>
<br>
<html:link page="/formulaire.do">
Retour au formulaire
keulkeul.blogspot.com

</html:link>
</body>
</html>

La balise <link> permet de retourner


facilement un lien hypertexte
Struts - M. Baron - Page 341
Struts : DynaActionForm

 Les objets ActionForm sont des Beans qui permettent de stocker des
proprits statiques et de les valider

 Un constat
 les valeurs dun formulaire sont des chanes de caractres : String pour les
valeurs uniques et String[] pour les valeurs champs multiples
 il faut redfinir chaque fois des get et des set pour les proprits

 La solution est dutiliser des formulaires


 dont la structure est dclare dans le fichier struts-config.xml
 qui sont crs dynamiquement par lenvironnement Struts
keulkeul.blogspot.com

 Ralisation
 utilisation de la classe DynaActionForm
 modification de la balise <form-bean>
Struts - M. Baron - Page 342
Struts : DynaActionForm

 La classe DynaActionForm possde la mme mthode validate que


ActionForm cependant laccs aux attributs se fait par un objet Map
Ne pas oublier de
 Utiliser les mthodes suivantes Caster lobjet en retour
 Object get(String) : retourne la valeur de la proprit donne en paramtre
String ma_propriete = (String)this.get("nom");

 void set(String, Object) : modifie la valeur de la proprit donne en paramtre

 Pour chaque champ du formulaire on dfinit une balise


<form-property> dans le corps de la balise <form-bean>
 String name : le nom du champ Deux proprits ont t dfinies dans
keulkeul.blogspot.com

le formulaire nomFormulaire trait


 String type : son type Java par le Bean dynamique DynaForm

<form-bean name="nomFormulaire" type="package.DynaForm" >


<form-property name="toto" type="java.lang.String" />
<form-property name="tutu" type="java.lang.String" />
</form-bean>
Struts - M. Baron - Page 343
Struts : DynaActionForm

 pisode 6 : utilisation dun Bean dynamique Le Bean dynamique

public class PersonneDynaActionForm extends DynaActionForm {


public ActionErrors validate(ActionMapping arg0, HttpServletRequest arg1) {
ActionErrors erreurs = new ActionErrors();
String nom = (String)this.get("nom");
String age = (String)this.get("age"); Chaque
if (nom == null || nom.trim().equals("")) { proprit est
erreurs.add("nomvide", new ActionMessage("formulaire.nom.vide")); extraite par
}
if (age == null || age.trim().equals("")) { un identifiant
erreurs.add("agevide", new ActionMessage("formulaire.age.vide"));
} else {
...
}
return erreurs;
} Le reste du code est identique au code
} fourni par lActionForm prcdente

<struts-config>
keulkeul.blogspot.com

<form-beans>
<form-bean name="formPersonne" type="monpackage.PersonneDynaActionForm" >
<form-property name="age" type="java.lang.String" initial="" />
<form-property name="nom" type="java.lang.String" initial="" />
</form-bean>
Dclaration des
</form-beans> deux proprits
<action-mappings>
...

Le fichier <struts-config.xml>
Struts - M. Baron - Page 344
Struts : DynaActionForm

 pisode 6 (suite) : utilisation dun Bean dynamique

public class FormulaireAction extends Action {


public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest req, HttpServletResponse res) throws Exception {
PersonneDynaActionForm formulaire = (PersonneDynaActionForm)form;

req.setAttribute("nom", formulaire.get("nom"));
req.setAttribute("age", formulaire.get("age"));
Il faut modifier
return mapping.findForward("response"); en consquence
} laction associe
}
keulkeul.blogspot.com

Cette solution offre


lavantage de dcrire la
structure du Bean par une
description XML
Struts - M. Baron - Page 345
Struts : Validator : des constats ...

 En utilisant la solution DynaActionForm nous sommes encore


obligs dcrire le code Java correspondant aux contraintes
dintgrit

 La validation des donnes se fait uniquement ct serveur

 Deux types de validation


 validation de contrle de surface (prsence ou pas de donnes, donnes
numriques contenant ou pas de lettre?)
 validation smantique (numro de carte bleue valide?)
keulkeul.blogspot.com

 Technologies couramment employes pour la validation


 validation de contrle de surface par JavaScript ct client
 validation smantique ct Serveur

Struts - M. Baron - Page 346


Struts : Validator : et une solution

 Constats
 La vrification ct client est longue, explicitement non performante car
longue dbuguer et ncessite lapprentissage du langage JavaScript
 La vrification de surface na pas lieu dtre ralis sur le serveur
 La solution par un Bean ActionForm et par la mthode validate est rptitive
car aucune aide la vrification

 Solution : utiliser le plug-in Validator


 Permet de dcrire des contraintes dintgrit directement dans un fichier XML
keulkeul.blogspot.com

 Permet de valider les donns ct client sans crire la moindre ligne de


JavaScript

Struts - M. Baron - Page 347


Struts : Validator : Dploiement

 Le plug-in Validator doit tre ajout dans lapplication web


 Ajouter au rpertoire de librairie de votre application commons-validator.jar
et jakarta-oro.jar
 Ajouter le fichier validator-rules.xml dfinissant les contraintes dintgrit
standard dans le rpertoire /WEB-INF
 Ajouter la balise <plug-in> dans le fichier struts-config.xml qui sert
charger la classe externe Validator Struts
 String classname : indique le nom de la classe instancier
 La balise <set-property> est utiliser pour initialiser la classe
 String property : le nom de la proprit initialiser
 String value : la valeur de la proprit
keulkeul.blogspot.com

 Pour notre utilisation <value> doit renseigner deux informations


 le fichier validator-rules.xml (ne pas modifier)
 le fichier dfinissant les contraintes dintgrit des diffrents formulaires
construit par le concepteur
Struts - M. Baron - Page 348
Struts : Validator : Dploiement

 Prciser dans la balise <form-bean> que lActionForm est dfinie


par Validator : org.apache.struts.validator.DynaValidatorForm
 Prciser galement les paramtres prsents dans le formulaire
comme pour DynaActionForm dans la balise <form-property>
 String name : le nom du champ
Pour dire que les paramtres
 String type : son type Java
sont grs dynamiquement et
Dans le fichier struts-config.xml seulement deux par Validator
modifications
<form-beans>
<form-bean name="nomFormulaire" type="org.apache.struts.validator.DynaValidatorForm" >
<form-property name="toto" type="java.lang.String" />
<form-property name="tutu" type="java.lang.String" />
</form-bean>
...
keulkeul.blogspot.com

<plug-in className="org.apache.struts.validator.ValidatorPlugIn" >


<set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" />
</plug-in>
</struts-config>

Ce nom de fichier pour la validation explicite des


contraintes nest pas fix
Struts - M. Baron - Page 349
Struts : Validator : criture des contraintes dintgrit

 Les contraintes dintgrit sont dfinies explicitement dans un


fichier xml (ici validation.xml)
 Le fichier dcrit en deux parties des rgles dintgrit qui se
trouvent dans la balise <form-validation>
 <global> : informations porte globale, valable dans tous les formulaires
 <formset> : dfinit lensemble des formulaires pour lesquels il y a des
contraintes dintgrit
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE form-validation PUBLIC
"-//Apache Software Foundation//DTD Commons ... Configuration 1.1.3//EN"
"http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd">

<form-validation> Informations globales la


<global>
keulkeul.blogspot.com

description
...
</global>
<formset>
... Description de lensemble des
</formset>
</form-validation> formulaires

Struts - M. Baron - Page 350


Struts : Validator : criture des contraintes dintgrit

 Dans la balise <global> on peut dfinir des constantes utilises


dans les autres descriptions des formulaires
 <constant-name> : nom de la constante
 <constant-value> : contient la valeur de la constante

Description ...
<global> Valeur dune
dune constante <constant-name>...</constant-name>
<constant-value>...</constant-value> constante
</global>
...

 Les contraintes dintgrit de chaque paramtre du formulaire sont


keulkeul.blogspot.com

dfinies par des expressions rgulires (peut-tre dclares dans la balise


globale comme constante)

Struts - M. Baron - Page 351


Struts : Validator : Expression Rgulire

 Rappel : une expression rgulire permet de trouver plusieurs mots


ou phrases qui sont proches (hydro => hydrocarbure, hydrofuge, )
 On ne vrifie ici pas le contenu des paramtres (effectu dans la
classe Action) mais la forme (chiffre avec des lettres, caractres inderdits, ...)
 Elles sont bases sur des caractres spcifiques ayant chacun une
importance
 Nous trouvons trois types de caractres
 mta-caractres : ^, ., ?, *, + et le $
 groupe de caractres : \d, \D, \w, \W, \s, \S, \b, \B et \nnn
 autres mta-caractres : {m,n}, |, []
keulkeul.blogspot.com

Les expressions rgulires sont importantes et


sont souvent utilises dans les langages de
Scripts (Perl, shell bash, )
Struts - M. Baron - Page 352
Struts : Validator : Expression Rgulire :
Mta-caractres
 Le point . : reprsente nimporte quel caractre
 123.5 => 123.5, 12345, 123t5, 123 5, ...
 Le point dinterrogation ? : le caractre prcdent ? est
optionnel Le caractre \ est utilis comme chappement.
 12?45 => 145, 1245 Pour chercher . on utilisera \. , ...
 Ltoile * : le caractre prcdent * peut tre rpt 0 ou
plusieurs fois
 12*45 => 145, 122245
 Le plus + : le caractre prcdent + peut tre rpt 1 ou
plusieurs fois
keulkeul.blogspot.com

 12+34 => 12234, 12222234


 Le dollar $ et le chapeau ^ : caractre en fin et dbut de ligne
 ^toto$ => ligne finissant par toto et commenant par toto

Struts - M. Baron - Page 353


Struts : Validator : Expression Rgulire :
Groupe de caractres
 \d : tout caractre numrique : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9

 \D : tout caractre sauf numrique

 \w : une lettre, une lettre accentue, un chiffre ou _

 \W : tout caractre sauf une lettre, accentue, un chiffre ou _

 \s : espace, tabulation, saut de ligne, ou tout autre caractre non


imprimable

 \S : tout caractre sauf ceux dfinis par \s


keulkeul.blogspot.com

 \b : espace, ponctuation, le dbut du texte du texte, fin du texte

 \B : le contraire de \b
Struts - M. Baron - Page 354
Struts : Validator : Expression Rgulire :
autre mta-caractres
 Accolades {n,m} : les accolades agissent comme ltoile, litration
est comprise entre n et m

 Alternative | : a | b => a or b

 Occurrence [abc] : 1 lettre au choix parmi trois

 Occurrence [a-z], [g-j], [a-zA-Z] : lettre comprise entre ...

 Occurrence [0-9], [6-9] : chiffre compris entre

 Occurrence [abc-], [a-z-] : toute lettre comprise entre et -


keulkeul.blogspot.com

 Occurrence [^abc], [^a-d] : toute lettre sauf ...

Le caractre ^ associ une occurrence


dsigne un complment
Struts - M. Baron - Page 355
Struts : Validator : Expression Rgulire :
exemples
 a\.*z => az, a.z, a..z, a..z, ...
 a\+\+z => a+z, a+++++z, a+++++++++++z, ...
 a\.?e => ae, a.e et rien dautre
 a\Dz => aaZ, a%z, abz mais ne trouvera pas a2z, a5z
 l\.\d\d\d4 => 1.4544, 1.8884, 1.3254,
 \D+ : toute chane de caractre non nulle sans caractres
 a{1,3} => a, aa, aaa et rien d autre
 a.{2,2}z => abrz, avbz, a23z
 a|b => a, b
keulkeul.blogspot.com

 (a|b)+ => a, b, ab, ba, abab


 [\[\\\]]abc => [abc, \abc, ]abc
 gphy[4-8] => gphy4, gphy5, , gphy8
Struts - M. Baron - Page 356
Struts : Validator : criture des contraintes dintgrit

 Pour chaque formulaire dcrit dans la balise <form> il faut prciser


les contraintes dintgrit des paramtres
 Le nom du formulaire est indiqu dans lattribut name de <form>
 Une balise <form> contient autant de balises <field> que de
paramtre du formulaire
 String property : nom du champ du formulaire pour lequel on dfinit des
contraintes dintgrit
 String depends : liste des contraintes dintgrit vrifier
...
<form name="..." >
<field property="..." depends="..." >
... Renseignements
keulkeul.blogspot.com

</field>
Description de ...
donns concernant les
deux formulaires </form> diffrents paramtres
<form name="..." > du formulaire
...
</form>
...

Struts - M. Baron - Page 357


Struts : Validator : criture des contraintes dintgrit

 Lattribut depends peut prendre les valeurs suivantes


 required : champ ne doit pas tre vide
 mask : le champ doit correspondre une ExpReg dfinie par la variable mask
 integer : champ doit tre un entier
 byte, long, float, double, email, date, range, ...

 Possibilit de mettre plusieurs valeurs dans lattribut depends


 Les contraintes sont vrifies dans lordre de lattribut depends. Si
une contrainte nest pas vrifie, les suivantes ne le sont pas
...
keulkeul.blogspot.com

<field property="prop1" depends="required, mask" >


...
</field>
...

La proprit prop1 est obligatoire


et doit correspondre une ExpReg
Struts - M. Baron - Page 358
Struts : Validator : criture des contraintes dintgrit

 Lexpression rgulire associe la variable mask est renseigne


par la sous balise <var> de la balise <field>

 La balise <var> possde les sous balises suivantes


 <var-name> : nom de la variable modifier
 <var-value> : valeur de la variable

Modification de la variable mask

...
<field property="prop1" depends="required, mask" >
<var-name>mask</var-name>
<var-value>^\s*\d+\s*$</var-value>
keulkeul.blogspot.com

</field>
...

Utilisation dune expression rgulire qui


exprime que celle des chiffres prcds et suivis
despace sont autoris
Struts - M. Baron - Page 359
Struts : Validator : criture des contraintes dintgrit

 Chaque contrainte est lie un message derreur dfini par une cl


et dont le contenu est initialis dans les fichiers properties
 errors.required : message li la contrainte required
 errors.invalid : message li la contrainte mask
 errors.email : message lie la contrainte email
 Possibilit dajouter des arguments au moyen de la balise <argi>
 i est un variant allant de 0 3 Largument arg0 sera utilis dans le
retour des messages
 String key : message retourner
<field property="prop1" depends="required, mask" >
<arg0 key="mypropriete" />
</field>

 Les messages derreurs sont dj dfinis (en anglais) dans le fichier


keulkeul.blogspot.com

validator-rules.xml
Fichier validator-rules.xml par dfaut
errors.required={0} is required.
errors.invalid={0} is invalid.
errors.email={0} is an invalid e-mail adress

Argument utilis dans le message Struts - M. Baron - Page 360


Struts : Validator : criture des contraintes dintgrit

 pisode 7 : utilisation dun Bean Validator dynamique


...
<form-beans>
<form-bean name="formPeronne" type="org.apache.struts.validator.DynaValidatorForm" >
<form-property name="nom" type="java.lang.String" />
<form-property name="age" type="java.lang.String" /> Utilisation de la classe
</form-bean> DynaValidatorForm de Struts
...

<action
path="/main" name="formPersonne" scope="session" validate="true" input="/erreurs.do"
parameter="/vues/main.html" type="monpackage.FormulaireAction">
... Validation des donnes du
</action>
formulaire ct serveur active
<plug-in className="org.apache.struts.validator.ValidatorPlugIn" >
<set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" />
</plug-in>
</struts-config>

...
keulkeul.blogspot.com

<html:form action="/main" >


<table>
<tr><td>Nom</td><td><html:text property="nom" size="20" /></td></tr> Le formulaire JSP ne
<tr><td>Age</td><td><html:text property="age" size="3"/></td></tr>
</table> change pas
<table>
<tr>...</tr>
</table>
</html:form>
...

Struts - M. Baron - Page 361


Struts : Validator : criture des contraintes dintgrit

 pisode 7 (suite) : utilisation dun Bean Validator dynamique


<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE form-validation PUBLIC
"-//Apache Software Foundation//DTD Commons ... Configuration 1.1.3//EN"
"http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd">

<form-validation> Dfinition dune contrainte


<global> dintgrit dans une constante
<constant>
<constant-name>entierpositif</constant-name>
<constant-value>^\s*\d+\s*$</constant-value>
</constant>
</global> Le paramtre nom est
<formset> obligatoire
<form name="formPersonne3">
<field property="nom" depends="required">
<arg0 key="personne.nom"/>
</field>
<field property="age" depends="required,mask">
<arg0 key="personne.age"/> Le paramtre age est
<var> obligatoire et doit respecter
keulkeul.blogspot.com

<var-name>mask</var-name> lexpression rgulire


<var-value>${entierpositif}</var-value>
</var> dfinie par entierpositif
</field>
</form>
</formset>
</form-validation>

Fichier de validation.xml
Struts - M. Baron - Page 362
Struts : Validator : criture des contraintes dintgrit

 pisode 7 (suite bis) : utilisation dun Bean Validator dynamique


# Pour les messages derreurs davant Validator
formulaire.nom.vide=<li>Vous devez indiquer un nom</li>
Fichier de properties_fr
formulaire.age.vide=<li>Vous devez indiquer un age</li>
formulaire.age.incorrect=<li>L'age [{0}] est incorrect</li>
errors.header=<ul>
errors.footer=</ul>

# Pour la validation des donnes avec Validator


personne.nom=nom {0} est remplac par age.
Dfini dans arg0 de validator.xml
personne.age=age
errors.invalid={0} est invalide.
errors.required={0} est obligatoire.
keulkeul.blogspot.com

Lge est invalide car il contient


du texte

Le message errors.invalid est


utilis dans le fichier properties.

Struts - M. Baron - Page 363


Struts : Validator : criture des contraintes dintgrit

 Nous avons vu pour linstant que la vrification des donnes se


faisait essentiellement ct serveur
 Struts et le plug-in Validator offre la possibilit de renforcer la
vrification en amont ct client en gnrant automatiquement le
JavaScript
 Le JavaScript gnr correspond la description donne dans le
fichier de contraintes dintgrit
 Deux choses doivent tre renseignes dans la JSP du formulaire
 Dans la balise <form> il faut initialiser lattribut
onsubmit = "return validateFormPersonne(this)" si le nom du formulaire est
keulkeul.blogspot.com

FormPersonne
 Ajouter la balise <javascript> avec lattribut formName="formPersonne"

Deux vrifications de surface des donnes sont


ralises. Une ct client et une ct serveur
Struts - M. Baron - Page 364
Struts : Validator : criture des contraintes dintgrit

 pisode 8 : gnration automatique de code JavaScript


... Bote de dialogue
<html:form action="/main" onsubmit="return validateFormPersonne(this);" >
<table> gre par
<tr><td>Nom</td><td><html:text property="nom" size="20" /></td></tr> JavaScript
<tr><td>Age</td><td><html:text property="age" size="3"/></td></tr>
</table>
<table>
<tr>...</tr>
</table>
</html:form>
<html:javascript formName="formPersonne" />
...

Fichier JSP du formulaire


Code source de la page
HTML gnr par Tomcat
...
keulkeul.blogspot.com

<!-- Begin
function validateFormPersonne4(form) {
if (bCancel)
return true; Le code JavaScript a t
else
var formValidationResult; gnr automatiquement par
formValidationResult = validateRequired(form) &&
validateMask(form); le framework Struts
return (formValidationResult == 1);
}
...
Struts - M. Baron - Page 365
Struts : changement de Locale

 Struts gre en interne linternationalisation puisquil accde des


fichiers properties pour les messages afficher
 Par dfaut la locale est configure suivant la localisation du
client (un client dans une rgion franaise utilisera les properties fr)
 On peut cependant changer la locale dune partie partielle ou
complte dune application web
 Le changement de locale ne peut tre effectu que dans une
classe Action du framework Struts
 La classe Action possde la mthode setLocale
keulkeul.blogspot.com

 setLocale(HttpServletRequest,Locale)
 HttpServletRequest : permet daccder la session de l utilisateur
 Locale : objet relatif la nouvelle locale
Struts - M. Baron - Page 366
Struts : changement de Locale

 Exemple : choisir la locale dune application web


La page daccueil
Le fichier JSP en Franais
associ
<%@ taglib uri="htmlstruts" prefix="html" %>
<%@ taglib uri="beanstruts" prefix="bean" %>

<html>
<head>
<title><bean:message key="welcome.title"/></title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
Solution pour afficher une
<body>
<p><bean:message key="welcome.message"/></p>
cl dune ressource
<table width="200" border="0">
<tr>
<th scope="col"><html:link page="/locale.do?locale=fr" ><html:img
page="/vues/french.gif" width="23" height="20" /></html:link></th>
keulkeul.blogspot.com

<th scope="col"><html:link page="/locale.do?locale=en" ><html:img


page="/vues/english.gif" width="23" height="20" /></html:link></th>
<th scope="col"><html:link page="/locale.do?locale=sp" ><html:img
page="/vues/spanish.gif" width="23" height="20" /></html:link></th> Les liens hypertextes
</tr>
</table> font appel une action
</body> qui modifie la locale
</html>

Struts - M. Baron - Page 367


Struts : changement de Locale

 Exemple (suite) : choisir la locale dune application web


... Laction associe la
<action page JSP est deffectuer
path="/localechoice" parameter="/vues/localechoice.jsp"
type="org.apache.struts.actions.ForwardAction" /> une simple redirection
<action
path="/locale" type="monpackage.ChoiceLocale">
<forward name="success" path="/localechoice.do" />
</action>
</action-mappings> Quand lutilisateur clique sur
le lien il appelle une action
</struts-config> spcifique
public class ChoiceLocale extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest req, HttpServletResponse res) throws Exception {
String mon_objet = req.getParameter("locale");
Locale ma_locale;
if (mon_objet != null) { Modification de la locale
ma_locale = new Locale(mon_objet); laide du paramtre de la
keulkeul.blogspot.com

} else { requte
ma_locale = new Locale("fr","FR");
}
this.setLocale( req, ma_locale);
return mapping.findForward("success"); La locale est modifie au
}
} niveau session

Struts - M. Baron - Page 368


Struts : changement de Locale

 Exemple (suite bis) : choisir la locale dune application web

Fichier properties
english

welcome.title=Flag Application
welcome.message=Change language by clicking on the good flag

Fichier properties
french
keulkeul.blogspot.com

welcome.title=Application Drapeau
welcome.message=Changer le langage en cliquant sur le bon drapeau

Pas de fichier properties pour le


langage spanish problme pour
trouver la cl associe

Struts - M. Baron - Page 369


Struts : fichier struts-config.xml multiples

 Pour linstant nous nous sommes limits utiliser un seul fichier


struts-config.xml pour dcrire lapplication web
 La sparation en plusieurs fichiers permet
 une meilleur visibilit des fichiers de configuration
 une dcomposition moins monolithique de lapplication web globale
 Dclarer dans web.xml de lintgralit des fichiers struts-config.xml
...
<servlet>
Un fichier principal <servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
relatif lapplication <init-param>
web globale <param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>config/module1</param-name>
keulkeul.blogspot.com

<param-value>/WEB-INF/module1/struts-config.xml</param-value>
</init-param>
...
Pour chaque <servlet-mapping>
struts-config.xml <servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
supplmentaire ajouter </servlet-mapping>
une balise <init-param> ...

Struts - M. Baron - Page 370


Struts : fichier struts-config.xml multiples

 La dcomposition physique des fichiers de votre application web


peut suivre la logique suivante
 Pour accder un lment utilisation du nom du module associ
dans lURL localhost:8080/appliweb/module1/toto.do
Ce rpertoire contient toutes les
vues *.html, *.jsp, ...
pages JSP de lapplication web

Contient les descriptions globales


WEB-INF web.xml, struts-config.xml
AppliWeb de Struts et de lapplication

module1 struts-config.xml
Chaque module est dcrit par
keulkeul.blogspot.com

un fichier struts-config.xml
module 2 struts-config.xml

Le reste est identique (TLDS, lib,


src, classes, )
...
Struts - M. Baron - Page 371
Struts : fichier struts-config.xml multiples

 Exemple : une petite application qui fait coucou plusieurs fois


<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Application grant plusieurs fichiers struts-config</display-name>

<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>config/module1</param-name>
<param-value>/WEB-INF/module1/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>config/module2</param-name>
<param-value>/WEB-INF/module2/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>config/module3</param-name>
keulkeul.blogspot.com

<param-value>/WEB-INF/module3/struts-config.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>

Le fichier web.xml
Struts - M. Baron - Page 372
Struts : fichier struts-config.xml multiples

 Exemple (suite) : une petite application qui fait coucou plusieurs fois
<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE struts-config PUBLIC


"-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
"http://struts.apache.org/dtds/struts-config_1_2.dtd">

<struts-config>
<action-mappings>
<action path="/welcome" parameter="/vues/welcome.jsp"
type="org.apache.struts.actions.ForwardAction" />
</action-mappings>
</struts-config>

Permet didentifier
Le fichier struts-config.xml
le module vis
<%@ taglib uri="htmlstruts" prefix="html" %>

<ul>
<li><html:link module="/module1" action="/module1">Module 1</html:link></li>
keulkeul.blogspot.com

<li><html:link module="/module2" action="/module2">Module 2</html:link></li>


<li><html:link module="/module3" action="/module3">Module 3</html:link></li>
</ul>

Le fichier
welcome.jsp

Struts - M. Baron - Page 373


Struts : fichier struts-config.xml multiples

 Exemple (suite) : une petite application qui fait coucou plusieurs fois
<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE struts-config PUBLIC


"-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
"http://struts.apache.org/dtds/struts-config_1_2.dtd">

<struts-config>
<action-mappings>
<action path="/module1" parameter="/vues/module1.jsp"
type="org.apache.struts.actions.ForwardAction" />
</action-mappings>
</struts-config>

Le fichier struts-config.xml du module 1


<%@ taglib uri="htmlstruts" prefix="html" %>

Module 1 Pas de module


<ul>
<li><html:link module="" action="/welcome.do">Principale</html:link></li>
keulkeul.blogspot.com

<li><html:link module="/module2" action="/module2">Module 2</html:link></li>


<li><html:link module="/module3" action="/module3">Module 3</html:link></li>
</ul>

Le fichier module1.jsp

Struts - M. Baron - Page 374


Struts et JSTL : coopration pour linternationalisation

 Nous avons tudi dans la partie des balises personnalises, la


bibliothque JSTL et son module I18n
 La bibliothque JSTL est simple dutilisation et permet d ajouter
des fichiers properties sans dclaration dans Struts
 La coopration de JSTL et Struts pour laffichage dinformation
dans les pages JSP ncessite la correspondance entre les variables
 Exemple pour linternationalisation et la variable locale
 Struts : org.apache.struts.action.LOCALE
Struts et JSTL ont la mme
 JSTL : javax.servlet.jsp.jstl.fmt.locale.session Locale fr, FR
keulkeul.blogspot.com

session.setAttribute("org.apache.struts.action.LOCALE", new Locale("fr","FR"));


session.setAttribute("javax.servlet.jsp.jstl.fmt.locale.session", new Locale("fr","FR"));

 Solution : modifier dans une classe Action les deux variables


Struts - M. Baron - Page 375
Struts et JSTL : coopration pour linternationalisation

 Exemple : cooprer JSTL et Struts


Remplace les balises Bean
par celles de la JSTL

<%@ taglib uri="htmlstruts" prefix="html" %>


<%@ taglib uri="fmtjstl" prefix="fmt" %>

<html>
<head>
<fmt:setBundle basename="erreur" />
<title><fmt:message key="welcome.title" /></title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
Reprise de lexemple avec
</head> les drapeaux.
<body> La balise setBundle permet
<p><fmt:message key="welcome.message" /></p><br>
dindiquer la ressource
<table width="200" border="0"> properties
<tr>
<th scope="col"><html:link page="/locale.do?locale=fr" ><html:img
keulkeul.blogspot.com

page="/vues/french.gif" width="23" height="20" /></html:link></th>


<th scope="col"><html:link page="/locale.do?locale=en" ><html:img
Affichage des cls en
page="/vues/english.gif" width="23" height="20" /></html:link></th> utilisant la balise fmt
<th scope="col"><html:link page="/locale.do?locale=sp" ><html:img
page="/vues/spanish.gif" width="23" height="20" /></html:link></th>
</tr>
</table>
</body>
</html>

Struts - M. Baron - Page 376


Struts et JSTL : coopration pour linternationalisation

 Exemple (suite) : cooprer JSTL et Struts

Rsultat si on choisit la
langue anglaise

Classe de type Action

public class ChoiceLocale extends Action {


public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest req, HttpServletResponse res) throws Exception {
String mon_objet = req.getParameter("locale");
Locale ma_locale;
if (mon_objet != null) {
ma_locale = new Locale(mon_objet); La classe Action est complte de
} else { manire modifier la variable lie
ma_locale = new Locale("fr","FR");
linternationalisation de JSTL
keulkeul.blogspot.com

}
this.setLocale( req, ma_locale);
req.getSession().setAttribute("javax.servlet.jsp.jstl.fmt.locale.session",
ma_locale);
return mapping.findForward("success");
}
}

Struts - M. Baron - Page 377

Vous aimerez peut-être aussi