Title: StrutsBasics
1Struts - Initiation
2Sang Shin sang.shin_at_sun.com www.javapassion.com J
ava Technology Evangelist Sun Microsystems,
Inc.
3Le programme
- Struts - qu'est que c'est et pourquoi l'utiliser?
- L'architecture de Struts
- Contrôleur au coeur de cette présentation
- Modèle
- Vue
- Bibliothèque de balises Struts (transféré à la
présentation "StrutsTags")? - Internationalisation
- Validation et traitement des erreurs
- Sélectionner une vue
- Concernant Struts
4C'est quoi Struts ?
5Jakarta Struts
- Struts est un open source framework pour les
applications web développé sous le projet Apache
Jakarta - http//jakarta.apache.org/struts/
6C'est quoi Struts ?
- Un framework Modèle-Vue-Contrôleur (MVC)
- Permet de construire des applications web en
utilisant des Servlets et des JSPs - L'application Struts est une application web qui
doit pouvoir fonctionner sur n'importe lequel
conteneur de servlets y compris les serveurs
d'applications supportant J2EE. - Basé sur des modèles
- Singleton, vue composée, delegate
- Facile à maîtriser et utiliser
- Comprend des bibliothèques de balises JSP
personnalisées
7Struts permet aux développeurs d'applications Web
de...
- Créer leur applications Web JSP/Servlet en
utilisant le modèle d'architecture MVC - Mettre en oeuvre des objets framework prêt Ã
l'utilisation à travers des fichiers de
configuration xml - Mettre en oeuvre des modèles de conception dans
le framework - Mettre en oeuvre des aspects complémentaires tels
que la validation de saisie, linternationalisatio
n
8Pourquoi Struts ?
9Pourquoi utiliser Struts ?
- Simplifie la création de son propre framework MVC
- Encourage une bonne pratique de conception et de
modélisation - Facile à maîtriser et utiliser
- Riche en attributs
- Supporte bien de multiple outils tiers
- Souple et extensible
- Grande communauté d'utilisateurs
- Stable et mûre
- Open source
10Pourquoi utiliser Struts ?
- S'intègre bien avec Java EE (J2EE)
- Bonne sélection de taglibs
- Fonctionne avec les applications Web existants
- Retient les données des formulaires de saisies
- Traitement standard des erreurs de façon
programmatique et déclaratif - Sintègre avec le framework Tiles
- Indique clairement les différentes
responsabilités ce qui simplifie la maintenance Ã
long terme (plus modulaire)?
11L'architecture de Struts (Vue d'ensemble)?
12Modèle-Vue-Contrôle (modèle 2)
Modèle d'architecture MVC
Conteneur de Servlet
(EIS)?
13Le fonctionnement de Struts
14Struts Une architecture MVC
- Un contrôleur central gère les flux de
l'application et délègue à un objet de type
Action - Des gestionnaires dActions peuvent utiliser des
composants de modèle - Un modèle représente une logique applicative ou
un état - Une commande est renvoyée à travers le Contrôleur
vers la Vue appropriée - Le transfère se fait selon un lot de mappings
dans le fichier de configuration, qui fournit un
vague lien entre la Vue et le Modèle
15Struts Une architecture MVC
- 3 Composants majeurs dans Struts
- Contrôleur de Servlet (Contrôleur)?
- Java Server Pages ou tout autre technologie de
présentation (Vue)? - Une logique applicative sous la forme qui
convient à l'application (Modèle)? - Le Contrôleur est au coeur de Struts
- Struts est indépendant du Modèle et de la Vue
- Struts peut fonctionner avec toute technologie de
Modèle ou de Vue
16Struts Une architecture MVC
- Le fichier de configuration contient des Action
Mappings - Relie l'URL aux Action Mapping
- Le Contrôleur utilise ces mappings pour
transformer des requêtes HTTP en actions
dapplication - Défini le transfert/la navigation
- Le mapping doit spécifier
- Un chemin de requête
- Une action pour répondre à la requête
17Le Contrôleur
18Quel est le rôle du Contrôleur ?
- Il est la plaque tournante de l'architecture MVC
- Chaque requête passe à travers le contrôleur
- Il est responsable du contrôle des flux (action
mapping) pour le traitement des requêtes - il lit le fichier de configuration pour
déterminer le contrôle du flux
19source Chuck Cavaness
20Le Contrôleur dans le Framework de Struts
- Le framework de Struts comprend un servlet de
base - org.apache.struts.action.ActionServlet
- Le mapping du Servlet doit être configuré dans
web.xml - La configuration concernant Struts est exécuté Ã
travers struts-config.xml - LAction Mapping définit le mapping entre l'URI
de la requête entrante et une classe Action
spécifique
21Le rôle du développeur
- Écrire une classe Action (c'est à dire une
extension de la classe Action) pour chaque
requête logique qui pourrait être reçue - redéfinition la méthode execute(), (la méthode
perform() dans Struts 1.0)? - Écrire le fichier de configuration pour le
action mapping - struts-config.xml
- Mettre à jour le fichier de descripteur de
déploiement de l'application web pour préciser
l'ActionServlet - web.xml
22Composants du Contrôleur dans le Framework de
Struts
- ActionServlet (fourni par Struts)?
- RequestProcessor (Struts 1.1)(fourni par Struts)?
- Un pour chaque module
- Action (fourni par le développeur)
- Le développeur rajoute une extension à la classe
action fournie par Struts - Action Mapping (précisé par le développeur)
- Le développeur précise l'action mapping dans le
fichier struts-config.xml - Le framework de Struts crée un objet
ActionMapping et le transfère à l'objet Action
23ActionServlet(Fourni par Framework)
24A quoi sert un ActionServlet ?
- Joue le rôle de Contrôleur
- Traite les requêtes des utilisateurs
- Établit ce que recherche lutilisateur en
fonction de la requête - Récupère des informations du modèle (si besoin)
pour fournir la vue nécessaire, et - Choisit la vue qui correspond à la requête de
lutilisateur - Délègue la plupart de ce travail de base aux
classes Action
25A quoi sert un ActionServlet ? (Suite)?
- Responsable pour l'initialisation et le nettoyage
des ressources - charge la configuration d'application qui
correspond au config init-param dans web.xml - lance une recherche à travers tous les éléments
d'init-param pour trouver les éléments avec un
nom commençant par config/ pour les modules - Pour accéder au module foo, on utiliserait un URL
comme - http//localhost8080/myApp/foo/someAction.do
26Contrôle des flux par le Contrôleur
27Les flux de Struts (Struts 1.0)
L'objet de type Action prend en main la requête
et retourne une prochaine vue. La vue est
identifié par l'objet de type ActionForward.
28RequestProcessor(Fourni par Framework)
29A quoi sert le RequestProcessor ?
- processPath
- Identifie le chemin (path) utilisé. Ceci sera
utilisé plus tard pour récupérer un objet de type
ActionMapping - processLocale
- Sélectionne un locale pour cette requête,
s'il elle n'en a pas déjà , et la place dans la
requête. - processContent
- Fixe le type de contenu par défaut (avec encodage
de caractères en option) pour toutes les réponses
si nécessaire.
30A quoi sert le RequestProcessor ?
- processNoCache
- Si cela est approprié, fixe les entêtes de
réponses suivantes Pragma , Cache-Control ,
et Expires . - processPreprocess
- Ceci est un des hameçons fournis par le
RequestProcessor pour redéfinir les sous-classes.
L'exécution par défaut retourne la valeur true
. Si on sous-classe RequestProcessor et
redéfinit processPreprocess la valeur de retour
devrait soit être true (indique que le
process devrait continuer à traiter la requête)
ou false (indique que la requête à déjà été
prise en main et le process devrait retourner)?
31A quoi sert le RequestProcessor ?
- processMapping
- Identifie l'objet de type ActionMapping associé Ã
ce chemin. - processRoles
- Si le mapping est associé à un rôle, ce process
assure que l'utilisateur lançant la requête
détient ce même rôle. Si ce n'est pas le cas, une
erreur apparaît et le traitement de la requête
est arrêté. - processActionForm
- Instancie (si besoin) l'objet de type ActionForm
associé à ce mapping (s'il y en a) et le place
dans le scope (la portée) convenu.
32A quoi sert le RequestProcessor ?
- processPopulate
- Garnit l'objet de type ActionForm associé à cette
requête, s'il y en a. - processValidate
- Valide (si demande est faite) l'objet ActionForm
associé à cette requête (s'il y en a). - processForward
- Si ce mapping représente un transfert (forward),
transférer au chemin indiqué dans le mapping.
33A quoi sert le RequestProcessor ?
- processInclude
- Si ce mapping représente un include , inclure
le résultat d'avoir appelé le chemin dans cette
requête. - processActionCreate
- Instancie une instance de la classe indiqué dans
le ActionMapping actuel (si besoin). - processActionPerform
- C'est à ce moment que sont appelées les méthodes
perform() ou execute() de votre action.
34A quoi sert le RequestProcessor ?
- processForwardConfig
- Dernièrement, la méthode process du
RequestProcessor prend l'objet ActionForward
retourné par la classe Action et l'utilise pour
sélectionner la prochaine ressource (s'il y en
a). Le plus souvent, l'objet ActionForward mène Ã
la page de présentation qui rend la réponse.
35Action Mapping(Vous le fournissez)
36Le Action Mapping dans le fichier de
configuration de Struts
- Le contrôleur Struts - ActionServlet - a besoin
de certaines informations concernant la façon
dont chaque requête URI devrait être mappé à la
bonne classe Action - Ces éléments se trouvent dans une interface Java
qui s'appelle ActionMapping - Le framework Struts crée un objet de type
ActionMapping à partir de l'élément de
configuration ltActionMappinggt du fichier
struts-config.xml
37Le fichier de configuration de Struts
(struts-config.xml)?
- struts-config.xml contient trois éléments
importants utilisés pour décrire les Actions - ltform-beansgt contient des définitions de FormBean
y compris nom et type (nom de classe)? - ltaction-mappinggt contient les définitions
dActions - Utiliser un élément ltactiongt pour chaque Action
définie - ltglobal-forwardsgt contient les définitions pour
des redirections globales
38Le fichier de configuration de Struts
(struts-config.xml)?
- ltform-beansgt
- Cette partie contient les définitions de vos
form beans . - Un élément ltform-beangt est utilisé pour chaque
form bean qui a les attributs importants
suivants - nom le nom de la requête (et l'attribut de
session sous lequel ce form bean sera enregistré)
- type le nom de classe Java officiel du form bean
39struts-config.xml ltform-beansgtde l'application
struts-submit
- lt?xml version"1.0" encoding"ISO-8859-1" ?gt
- lt!DOCTYPE struts-config PUBLIC
- "-//Apache Software Foundation//DTD
Struts Configuration 1.1//EN" - "http//jakarta.apache.org/struts/dtds/s
truts-config_1_1.dtd"gt - ltstruts-configgt
- lt!-- Form Bean Definitions
--gt - ltform-beansgt
- ltform-bean name"submitForm"
- type"submit.SubmitFo
rm"/gt - lt/form-beansgt
40Le fichier de configuration de Struts
(struts-config.xml)?
- ltaction-mappingsgt
- Cette partie contient les définitions des
Actions. Un élément ltactiongt peut être utilisé
pour chaque Action à définir.
41Le fichier de configuration de Struts
(struts-config.xml)?
- ltaction-mappingsgt
- Chaque élément ltactiongt nécessite une description
des attributs suivants - path Le chemin dépendant du contexte de
l'application qui mène à l'action (URI de la
requête)? - type Le nom de classe Java officiel de la classe
Action - nom Le nom de l'élément ltform-beangt à utiliser
avec cette action - input Le nom de la page qui apparaît lorsqu'il y
a une erreur avec la validation du formulaire de
saisie - scope La portée dans laquelle le form bean est
créé - validate Si on doit lancer la validation du
formulaire de saisie ou pas
42struts-config.xml ltaction-mappingsgtde
l'application struts-submit
- lt!-- Action mapping definitions
--gt - ltaction-mappingsgt
- ltaction path"/submit"
- type"submit.SubmitAction"
- name"submitForm"
- input"/submit.jsp"
- scope"request"
- validate"true"gt
- ltforward name"success" path"/submit.jsp"/gt
- ltforward name"failure" path"/submit.jsp"/gt
- lt/actiongt
- lt/action-mappingsgt
- lt/struts-configgt
43struts-config.xml ltaction-mappingsgtde
l'application struts-example
- ltaction-mappingsgt
- ltaction
- path"/logon"
- type"org.apache.struts.webapp.example
.LogonAction" - name"logonForm"
- scope"request"
- input"/logon.jsp"
- validate"true" /gt
- lt/action-mappingsgt
- lt/struts-configgt
44Fichier de configuration de l'action mapping
- ltglobal-forwardsgt
- Les transferts sont des instances de la classe
ActionForward renvoyé par une méthode execute()
d'une Action - Ceci lie des noms logiques à des ressources
spécifiques (souvent des JSPs)? - L'élément ltforwardgt a les attributs suivants
- nom nom logique du transfert
- utilisé dans la méthode execute() de la classe
Action afin de transférer à la prochaine
ressource - path ressource à transférer
- redirect redirection (true) ou transfert (false)?
45Transferts globaux
- ltstruts-configgt
- ltform-beansgt
- ltform-bean
- name"logonForm"
- type"org.apache.struts.webapp.example
.LogonForm" /gt - lt/form-beansgt
- ltglobal-forwards
- type"org.apache.struts.action.ActionForwa
rd"gt - ltforward
- name"logon"
- path"/logon.jsp"
- redirect"false" /gt
- lt/global-forwardsgt
-
46Transferts locaux
- lt!-- Edit mail subscription --gt
- ltaction
- path"/editSubscription"
- type"org.apache.struts.webapp.example.EditSub
scriptionAction" - name"subscriptionForm"
- scope"request"
- validate"false"gt
- ltforward
- name"failure"
- path"/mainMenu.jsp"/gt
- ltforward
- name"success"
- path"/subscription.jsp"/gt
- lt/actiongt
47ActionForm(Vous le fournissez sauf si vous
utilisez DynaActionForm)
48Le bean ActionForm (Form bean)?
- Fourni par le développeur
- Définir un bean ActionForm (c'est à dire, une
classe Java qui étend la classe ActionForm) - Il est définit dans le fichier struts-config.xml
- ltform-beangt
- nom de la classe ltActiongt
- Contient que des méthodes d'obtention et de
réglage pour chaque champs - pas de logique
applicative - Fournit le mécanisme standard de validation
49Le bean ActionForm et le contrôleur
- Pour chaque bean ActionForm défini dans le
fichier servlet-config.xml, le contrôleur
(ActionServlet) - Vérifie la portée de la session pour une instance
du bean ActionForm - Sil ny en a pas, le contrôleur en crée une
- Appel la méthode de réglage du bean ActionForm
pour chaque paramètre de requête ayant un nom qui
correspond au nom d'une propriété du bean. - L'objet du bean Action Form mis à jour est
transmit en tant que paramètre à la méthode
execute() de la classe Action.
50Comment écrire un bean ActionForm
- Ajouter des méthodes d'obtention et de réglage
pour chaque propriété d'un formulaire de saisie - Ne pas inclure un code de logique applicative
- Ajouter une méthode de validation standard qui
s'appelle validate()? - Le Contrôleur appellera cette validation
- Définir une propriété (y compris les méthodes
getXxx (obtention) et setXxx (réglage)) pour
chaque champ dans le formulaire de saisie.
51Exemple submit.jsp
- lt_at_ page language"java" gt
- lt_at_ taglib uri"/WEB-INF/struts-bean.tld"
prefix"bean" gt - lt_at_ taglib uri"/WEB-INF/struts-html.tld"
prefix"html" gt - lt_at_ taglib uri"/WEB-INF/struts-logic.tld"
prefix"logic" gt - lthtmlgt
- ltheadgtlttitlegtSubmit examplelt/titlegtlt/headgt
- ltbodygt
- lth3gtExample Submit Pagelt/h3gt
- lthtmlerrors/gt
- lthtmlform action"submit.do"gt
- Last Name lthtmltext property"lastName"/gtltbrgt
- Address lthtmltextarea property"address"/gtltbrgt
- Sex lthtmlradio property"sex"
value"M"/gtMale - lthtmlradio property"sex"
value"F"/gtFemaleltbrgt - Married lthtmlcheckbox property"married"/gtltbrgt
source Keld Hansen
52Modèle ActionForm
- package submit
- import javax.servlet.http.HttpServletRequest
- import org.apache.struts.action.
- public final class SubmitForm extends ActionForm
- / Last Name /
- private String lastName "Hansen" //
default value - public String getLastName()
- return (this.lastName)
-
- public void setLastName(String lastName)
- this.lastName lastName
-
- / Address /
- private String address null
- public String getAddress()
source Keld Hansen
53struts-config.xml ltform-beansgt
- lt?xml version"1.0" encoding"ISO-8859-1" ?gt
- lt!DOCTYPE struts-config PUBLIC
- "-//Apache Software Foundation//DTD
Struts Configuration 1.1//EN" - "http//jakarta.apache.org/struts/dtds/s
truts-config_1_1.dtd"gt - ltstruts-configgt
- lt!-- Form Bean Definitions
--gt - ltform-beansgt
- ltform-bean name"submitForm"
- type"submit.SubmitFo
rm"/gt - lt/form-beansgt
source Keld Hansen
54struts-config.xml ltaction-mappingsgt
- lt!-- Action Mapping Definitions
--gt - ltaction-mappingsgt
- ltaction path"/submit"
- type"submit.SubmitAction"
- name"submitForm"
- input"/submit.jsp"
- scope"request"
- validate"true"gt
- ltforward name"success" path"/submit.jsp"/gt
- ltforward name"failure" path"/submit.jsp"/gt
- lt/actiongt
- lt/action-mappingsgt
- lt/struts-configgt
source Keld Hansen
55DynaActionForm dans Struts 1.1
- Au lieu de créer une nouvelle sous-classe
d'ActionForm et des nouvelles méthodes
d'obtention / de réglage pour chaque propriété
d'un bean, ses propriétés, type et par défauts
, peuvent être indiqués dans le fichier de
configuration de Struts - Utiliser DynaActionForm le plus possible
- Nous aborderons ce sujet dans le cours de
perfectionnement de Struts
56Action(Vous en créez unevous même)
57source Chuck Cavaness
58Classe Action
- Focalisé sur le flux de commandes
- Traite une requête client en appelant d'autres
objets (beans de BusinessLogic) dans sa méthode
execute() - Renvoi un objet de type ActionForward qui
identifie une ressource de destination vers
laquelle la commande devrait être transférée - La ressource pourrait être
- JSP
- Tile definition
- Velocity model
- Autre action
59Cest quoi une classe Action ?
- Une classe Java qui fait le travail de
l'application. - Prend en main les requêtes
- Met en oeuvre la logique applicative
- Peut être simple ou plus complexe
- Une classe Action simple met en oeuvre une
logique applicative - Une classe Action plus complexe délègue cette
mise en oeuvre au composants modèle - La classe Action fonctionne en tant que Façade
pattern (patron de conception) dans ce cas
60Exemple Action Logon
- L'application doit
- Authentifié un utilisateur
- Ouvrir une session d'utilisateur
- Traiter les erreurs
- Développe un LogonAction
61Rôle du développeur Classe Action
- Ajouter une extension org.jakarta.struts.action.Ac
tion - Redéfinir
- la méthode execute() (dans Struts 1.1)?
- la méthode perform() (dans Struts 1.0)
62méthode execute(..) de la classe Action (que
Struts 1.1)?
- Appelé par le contrôleur
-
- public ActionForward execute(
- ActionMapping mapping,
- ActionForm form,
- HttpServletRequest request,
- HttpServletResponse response)
- throws Exception
63méthode perform(..) de la classe Action (que
Struts 1.0)?
- Deprecated
-
- public ActionForward perform(
- ActionMapping mapping,
- ActionForm form,
- HttpServletRequest request,
- HttpServletResponse response)
- throws IOException, ServletException
64méthode execute(..) de la classe Action
- Effectue le traitement nécessaire pour traiter
cette requête - Met à jour les objets côté serveur (variables de
portée) qui seront utilisés pour créer la
prochaine page de l'interface utilisateur - Retourne un objet de type ActionForward qui
correspond
65Exemple Classe Action
- package submit
- import javax.servlet.http.
- import org.apache.struts.action.
- public final class SubmitAction extends Action
- public ActionForward execute(ActionMapping
mapping, - ActionForm form,
- HttpServletRequest
request, - HttpServletResponse
response) - SubmitForm f (SubmitForm) form // get the
form bean - // and take the last name value
- String lastName f.getLastName()
- // Translate the name to upper case
- //and save it in the request object
- request.setAttribute("lastName",
lastName.toUpperCase()) -
66Principes de conception d'une classe Action
- Le contrôleur (Servlet) crée qu'une instance de
la classe Action et l'utilise pour toutes les
requêtes - La classe Action doit être multi-thread safe
- Utilise des variables locaux (au lieu de
variables d'instance)? - La classe Action devrait être une couche légère
- Utiliser des composants de modèle pour prendre en
main la logique applicative
67Exemple 2 Classe Action
- package submit
- import javax.servlet.http.
- import org.apache.struts.action.
- public final class SubmitAction extends Action
- public ActionForward execute(ActionMapping
mapping, - ActionForm form,
- HttpServletRequest
request, - HttpServletResponse
response) - SubmitForm f (SubmitForm) form // get the
form bean - // and take the last name value
- String lastName f.getLastName()
- if (lastName.startsWith(Passion))
- // Translate the name to upper case
- //and save it in the request object
- request.setAttribute("lastName",
lastName.toUpperCase()) - // Forward control to the specified success
target - return (mapping.findForward("success"))
-
68struts-config.xml ActionMapping
- lt!-- Action Mapping Definitions
--gt - ltaction-mappingsgt
- ltaction path"/submit"
- type"submit.SubmitAction"
- name"submitForm"
- input"/submit.jsp"
- scope"request"
- validate"true"gt
- ltforward name"success" path"/submitSuccess.j
sp"/gt - ltforward name"failure" path"/submitFailure.j
sp"/gt - lt/actiongt
- lt/action-mappingsgt
- lt/struts-configgt
69Les classes Action préfabriquées
- ForwardAction
- DispatchAction
- Nous aborderons ce sujet dans le cours de
perfectionnement de Struts
70Composants du modèle (Vous les fournissez)
71Composants du modèle
- Le modèle est divisé en concepts
- L'état interne du système
- Logique applicative qui peut changer cet état
- L'état interne du système représenté par des
- JavaBeans
- Enterprise JavaBeans
- POJOs
- JDO
- JDBC
- Autre chose
72source Chuck Cavaness
73Composants du modèle
- JavaBeans et la portée
- La page visible à l'intérieur d'une page JSP
simple pour la durée de la requête en cours - La requête visible à l'intérieur d'une page JSP
simple ainsi que dans toute page ou servlet
inclus dans cette page ou qui reçoit un transfert
de cette page - La session visible dans tous les pages JSP et
servlets qui participent à une session
d'utilisateur en particulier, Ã travers une ou
plusieurs requêtes - L'application visible dans toutes les pages JSP
et servlets qui font partie d'une application web
74Composants du modèle
- Les pages JSP et servlets qui sont dans la même
application web partagent les mêmes lots de
collection de beans - Exemple
- Code servlet
- MyCart mycart new MyCart(...)
- request.setAttribute("cart", mycart)
- page JSP
- ltjspuseBean id"cart" scope"request"
- class"com.mycompany.MyApp.MyCart"/gt
75Composants Modèle dans le Framework de Struts
- Bean de type ActionForm (avec caveat)?
- Veuillez noter que beaucoup de gens ne considère
pas le bean ActionForm en tant que composant
modèle, mais en tant que données saisies par un
utilisateur - Bean de type SystemState (état système)
- Ceci est un terme conceptuel Struts ne fournit
aucune programmation API - Bean de type BusinessLogic (logique applicative)
- Ceci est un terme conceptuel Struts ne fournit
aucune programmation API
76Composants modèle de StrutsBeans de type
System State Business Logic
77Bean de type SystemState
- Struts ne définit pas une classe officielle pour
ceci - Définit l'état actuel
- Pourrait être représenté en tant que lot d'un ou
plusieurs classes de JavaBean dont les propriétés
définissent l'état actuel. - Exemple un system de panier d'achat virtuel
- Contient un bean qui représente le panier pris en
charge pour chaque acheteur individuel - Inclut le lot d'articles que l'acheteur a
sélectionné
78Bean de type SystemState
- Pour des systèmes à petite échelle ou pour des
informations état qui n'ont pas besoin d'être
sauvegardées sur la durée - un lot de beans System State peuvent contenir
tout les informations que le système ait pu
retenir - Application à grande échelle
- Des beans de type SystemState peuvent représenter
des informations stockées de façon permanente
dans une base de données externe quelconque - L'objet CustomerBean qui correspond à cette
rangée dans la table CUSTOMERS - EJB peut être utilisé
79Bean de type BusinessLogic (règles de gestion)
- Struts ne définit pas une classe formelle pour
ceci - Peut être un JavaBean ordinaire
- Peut être un EJB avec ou sans état
- Contient la logique fonctionnelle d'une
application en utilisant des appels de méthode - L'objet Action doit traduire la requête HTTP et
appeler le bean de type BusinessLogic
80Bean de type BusinessLogic (règles de gestion)
- L'idéal serait de les concevoir de façon à ce
qu'il ne savent pas qu'ils sont en train d'être
exécutés dans un environnement d'application web - ne devraient pas faire référence à des objets
application web - réutilisables
81Composants de Vue (Vous les fournissez)
82source Chuck Cavaness
83Composants de Vue
- Des fichier JSP que vous écrivez pour votre
application à vous - Lot de bibliothèques tag JSP personnalisées
- Fichiers ressources pour l'internationalisation
- Permet une création rapide des formulaires d'une
application - Travaille avec le contrôleur - Servlet
84Vue
- L'objet ActionForward informe le contrôleur
Servlet quelle est la page JSP réceptrice - Les pages JSP utilisent des beans de type
ActionForm pour afficher les données modèle en
sortie - Struts contient une série de bibliothèques tag
- Facilite la communication entre les créateurs
HTML et les développeurs - Privilège un contenu web dynamique
85Les interactions entre Forms et FormBean
- Si l'utilisateur commet une erreur, l'application
devrait lui permettre de faire des corrections - Avec juste JSP, vous devez faire
- ltinput type"text" name"username"
- value"lt loginBean.getUsername() gt"/gt
- Avec Struts, vous faites
- lthtmltext property"username"/gt
86Exemple submit.jsp
- lt_at_ page language"java" gt
- lt_at_ taglib uri"/WEB-INF/struts-bean.tld"
prefix"bean" gt - lt_at_ taglib uri"/WEB-INF/struts-html.tld"
prefix"html" gt - lt_at_ taglib uri"/WEB-INF/struts-logic.tld"
prefix"logic" gt - lthtmlgt
- ltheadgtlttitlegtSubmit examplelt/titlegtlt/headgt
- ltbodygt
- lth3gtExample Submit Pagelt/h3gt
- lthtmlerrors/gt
- lthtmlform action"submit.do"gt
- Last Name lthtmltext property"lastName"/gtltbrgt
- Address lthtmltextarea property"address"/gtltbrgt
- Sex lthtmlradio property"sex"
value"M"/gtMale - lthtmlradio property"sex"
value"F"/gtFemaleltbrgt - Married lthtmlcheckbox property"married"/gtltbrgt
87Exemple submit.jsp
- ltlogicpresent name"lastName" scope"request"gt
- Hello
- ltlogicequal name"submitForm" property"age"
value"a"gt - young
- lt/logicequalgt
- ltlogicequal name"submitForm" property"age"
value"c"gt - old
- lt/logicequalgt
- ltbeanwrite name"lastName" scope"request"/gt
- lt/logicpresentgt
- lt/bodygt
- lt/htmlgt
88web.xml
89Descripteur de déploiement d'une application web
(web.xml)
- L'application Struts est une application Web
- Suit la même règle
- Doit avoir un descripteur de déploiement web.xml
- web.xml inclus
- Une instance de configuration de l'ActionServlet
et du mapping - Fichier de ressource ltinit-paramgt
- Fichier servlet-config.xm ltinit-paramgt
- Définition des bibliothèques de balises de Struts
- web.xml est situé dans WEB-INF/web.xml
90Exemple web.xml
- lt!DOCTYPE web-app
- PUBLIC "-//Sun Microsystems, Inc.//DTD Web
Application 2.2//EN" - "http//java.sun.com/j2ee/dtds/web-app_2_2.dtd"gt
- ltweb-appgt
- ltdisplay-namegtAdvanced J2EE Programming Class
Sample Applt/display-namegt -
- lt!-- Standard Action Servlet Configuration
(with debugging) --gt - ltservletgt
- ltservlet-namegtactionlt/servlet-namegt
- ltservlet-classgt
- org.apache.struts.action.ActionServlet
- lt/servlet-classgt
- ltinit-paramgt
- ltparam-namegtapplicationlt/param-namegt
- ltparam-valuegtApplicationResourceslt/param-val
uegt - lt/init-paramgt
- ltinit-paramgt
- ltparam-namegtconfiglt/param-namegt
91Exemple web.xml
- lt!-- Standard Action Servlet Mapping --gt
- ltservlet-mappinggt
- ltservlet-namegtactionlt/servlet-namegt
- lturl-patterngt.dolt/url-patterngt
- lt/servlet-mappinggt
-
- lt!-- Struts Tag Library Descriptors --gt
- lttaglibgt
- lttaglib-urigt/WEB-INF/struts-bean.tldlt/taglib-u
rigt - lttaglib-locationgt/WEB-INF/struts-bean.tldlt/tag
lib-locationgt - lt/taglibgt
- lttaglibgt
- lttaglib-urigt/WEB-INF/struts-html.tldlt/taglib-u
rigt - lttaglib-locationgt/WEB-INF/struts-html.tldlt/tag
lib-locationgt - lt/taglibgt
- lttaglibgt
- lttaglib-urigt/WEB-INF/struts-logic.tldlt/taglib-
urigt - lttaglib-locationgt/WEB-INF/struts-logic.tldlt/ta
glib-locationgt - lt/taglibgt
92L'internationalisation
93L'internationalisation
- Étend l'approche de base de java.util.ResourceBund
le - org.apache.struts.util.MessageResources
- Permet de préciser d'une clé locale dynamique en
fonction de chaque utilisateur - Limité à la présentation, pas à la saisie
- Les lots de ressources sont configurer dans le
fichier web.xml
94L'internationalisation Le rôle du développeur
- Créer un fichier de ressource pour une langue par
défaut - Créer des fichiers de ressources pour chaque
langue supplémentaire - Définir un nom de base de fichier pour le lot de
ressources dans un paramètre d'initialisation - Dans une page JSP
- Utiliser lthtmlerrors/gt pour afficher les
messages d'erreur spécifiques à un locale
95Fichier de ressources
- MyApplication.properties
- Contient les messages dans la langue par défaut
du serveur - Si la langue par défaut est l'anglais, il y aura
peut être une saisie tel que - prompt.helloHello
- MyApplication_xx.properties
- Contient les mêmes messages dans la langue avec
le code langue ISO "xx" - prompt.helloBonjour
96Exemple ApplicationResource.properties
- errors.headerlth4gtValidation Error(s)lt/h4gtltulgt
- errors.footerlt/ulgtlthrgt
- error.lastNameltligtEnter your last name
- error.addressltligtEnter your address
- error.sexltligtEnter your sex
- error.ageltligtEnter your age
97Exemple web.xml
- ltservletgt
- ltservlet-namegtactionlt/servlet-namegt
- ltservlet-classgt
- org.apache.struts.action.ActionServlet
- lt/servlet-classgt
- ltinit-paramgt
- ltparam-namegtapplicationlt/param-namegt
- ltparam-valuegt
- com.mycompany.mypackage.MyApplicatio
n - lt/param-valuegt
- lt/init-paramgt
- lt!-- ... --gt
- lt/servletgt
98Validation (de la saisie)
99Validation Rôle du développeur (Struts 1.0)
- Indiquer que la validation de saisie soit des
attributs de l'élément ltactiongt sous
ltaction-mappinggt dans le fichier
servlet-config.xml - validatetrue
- Préciser la page JSP qui doit être affichée quand
la validation échoue - input/errorpage.jsp
- Neutraliser la méthode validate() à l'intérieur
de la classe ActionForm - facultatif
100la méthode validate ()
- Appelée par le contrôleur - servlet
- après que les propriétés beans ont été garnies
- mais avant que la méthode execute () de la classe
Action qui correspond soit appelé - Facultative
- méthode par défaut retourne la valeur nul
- Syntaxe
- public ActionErrors validate(ActionMapping
mapping, -
HttpServletRequest request)
101Exemple la méthode validate ()
- Dans l'application Login
- Assurez vous que le nom d'utilisateur et le
mot de passe sont saisis - Assurez vous que le mot de passe contient
plus de 6 caractères
102la méthode validate ()
- Après la validation
- s'il n'y a pas d'erreur de validation, valeur de
retour null - S'il y a erreur, valeur de retour ActionErrors
- Chaque ActionError contient une clé de message
d'erreur pour accéder au lot MessageResources de
l'application - Le contrôleur servlet enregistre le tableau
ActionErrors comme attribut de requête utilisable
par la balise lthtmlerrorsgt - Ensuite, le contrôleur re-transfère la commande
au formulaire de saisie (identifié par la
propriété de saisie pour cet ActionMapping)?
103La classe ActionError
- Mécanisme utilisé pour signaler des erreurs
pendant la validation de saisie - Contient les erreurs
- clé de message utilisée pour recherche de texte Ã
partir du fichier de ressources - Permet le remplacement de paramètres
- ActionErrors est un groupe d'ActionErrors
104struts-config.xml Validation
- lt!-- Action Mapping Definitions
--gt - ltaction-mappingsgt
- ltaction path"/submit"
- type"hansen.playground.SubmitA
ction" - name"submitForm"
- input"/submit.jsp"
- scope"request"
- validate"true"gt
- ltforward name"success" path"/submit.jsp"/gt
- ltforward name"failure" path"/submit.jsp"/gt
- lt/actiongt
- lt/action-mappingsgt
- lt/struts-configgt
105ActionForm
- public final class SubmitForm extends ActionForm
-
- ...
- public ActionErrors validate(ActionMapping
mapping, - HttpServletRequest request)
- ...
-
- // Check for mandatory data
- ActionErrors errors new ActionErrors()
- if (lastName null lastName.equals(""))
- errors.add("Last Name", new
ActionError("error.lastName")) -
- if (address null address.equals(""))
- errors.add("Address", new
ActionError("error.address")) -
- if (sex null sex.equals(""))
- errors.add("Sex", new ActionError("error.sex
")) -
106Exemple submit.jsp
- lt_at_ page language"java" gt
- lt_at_ taglib uri"/WEB-INF/struts-bean.tld"
prefix"bean" gt - lt_at_ taglib uri"/WEB-INF/struts-html.tld"
prefix"html" gt - lt_at_ taglib uri"/WEB-INF/struts-logic.tld"
prefix"logic" gt - lthtmlgt
- ltheadgtlttitlegtSubmit examplelt/titlegtlt/headgt
- ltbodygt
- lth3gtExample Submit Pagelt/h3gt
- lthtmlerrors/gt
- lthtmlform action"submit.do"gt
- Last Name lthtmltext property"lastName"/gtltbrgt
- Address lthtmltextarea property"address"/gtltbrgt
- Sex lthtmlradio property"sex"
value"M"/gtMale - lthtmlradio property"sex"
value"F"/gtFemaleltbrgt - Married lthtmlcheckbox property"married"/gtltbrgt
- Age lthtmlselect property"age"gt
107Système de validateur dans Struts 1.1
- Une logique de validation peut être précisée dans
le fichier de configuration struts-config.xml - Au lieu d'écrire un code Java - méthode
validate() - Nous aborderons ce sujet dans le cours de
perfectionnement de Struts
108Traitement des erreurs
109Validation de saisie contre validation de la
logique applicative
- Met en oeuvre des validations simples de premier
plan en utilisant la méthode d'ActionForm
validate () - Même ceci est facultatif
- Prend en main la validation de la logique
applicative dans la classe Action
110Erreur d'application dans la classe Action
- Saisit les erreurs des beans System state ou
Business logic - Crée un objet de type ActionErrors et un retour
- ActionServlet peut agir si une exception
particulière est lancé - Peut être globale ou basée sur des actions
- Peut être un simple transfert ou transmise à une
classe personnalisée de gestionnaire d'erreurs - A travers un ExceptionHandler (gestionnaire
d'exception) par défaut
111Gestionnaire d'exception personnalisé (1.1)
- Définir un ExceptionHandler personnalisé Ã
exécuter quand une méthode execute () d'une
action lance une exception - Sous-classe org.apache.struts.action.ExceptionHand
ler - Votre méthode execute () devrait traiter
l'exception et retourner un objet de type
ActionForward qui informera Struts où transférer
par la suite - Exemple
- Définissez en un pour java.lang.Exception pour un
débogage
112Gestionnaire d'exception personnalisé (1.1)
- Configurez votre gestionnaire d'exception dans
struts-config.xml - ltglobal-exceptionsgt
- ltexception
- key"some.key"
- type"java.io.IOException"
- handler"com.yourcorp.ExceptionHandler"/gt
- lt/global-exceptionsgt
- com.yourcorp.ExceptionHandler.execute() sera
appelé quand une IOException est lancé par une
action
113Gestionnaire d'exception personnalisé (1.1)
- Peut être global ou par action
- ltaction ...gt
- ltexception
- key"some.key"
- type"java.io.IOException"
- handler"com.yourcorp.ExceptionHandler"/gt
- lt/actiongt
114Exemple Lancer une exception
- package hansen.playground
- import javax.servlet.http.
- import org.apache.struts.action.
- public final class SubmitAction extends Action
- public ActionForward execute(ActionMapping
mapping, - ActionForm form,
- HttpServletRequest
request, - HttpServletResponse
response) - SubmitForm f (SubmitForm) form // get the
form bean - // and take the last name value
- String lastName f.getLastName()
- if (lastName.startsWith(Passion))
- // Translate the name to upper case
- //and save it in the request object
- request.setAttribute("lastName",
lastName.toUpperCase()) - // Forward control to the specified success
target - return (mapping.findForward("success"))
-
115Gestionnaire d'exception personnalisé (1.1)
- Un ExceptionHandler différent pour une erreur
différente - ltglobal-exceptionsgt
- ltexception
- handler"com.cavaness.storefront.CustomizedExc
eptionHandler" - key"global.error.message"
- path"/error.jsp"
- scope"request"
- type"java.lang.Exception"/gt
- ltexception
- handler"com.cavaness.storefront.SecurityExcep
tionHandler" - key"security.error.message"
- path"/login.jsp"
- scope"request"
- type"com.cavaness.storefront.SecurityExceptio
n"/gt - lt/global-exceptionsgt
116Sélectionner une vue
117Sélectionner une vue Le rôle du développeur
- Dans struts-config file,
- Indiquez page JSP à transférer (ou définition
Tiles, autre action, Velocity template) pour
chaque résultat à travers l'élément fille
ltforwardgt de l'élément ltactiongt ou
ltglobal-forwardsgt - Dans la méthode execute(..) de la classe Action
- Retour de l'objet ActionForward associé à un
résultat logique spécifique
118struts-config.xml ActionMapping
- lt!-- Action Mapping Definitions
--gt - ltaction-mappingsgt
- ltaction path"/submit"
- type"hansen.playground.SubmitA
ction" - name"submitForm"
- input"/submit.jsp"
- scope"request"
- validate"true"gt
- ltforward name"success"
path"/submit.jsp"/gt - ltforward name"failure"
path"/submit.jsp"/gt - lt/actiongt
- lt/action-mappingsgt
- lt/struts-configgt
119Exemple Classe Action
- package hansen.playground
- import javax.servlet.http.
- import org.apache.struts.action.
- public final class SubmitAction extends Action
- public ActionForward execute(ActionMapping
mapping, - ActionForm form,
- HttpServletRequest
request, - HttpServletResponse
response) - SubmitForm f (SubmitForm) form // get the
form bean - // and take the last name value
- String lastName f.getLastName()
- // Translate the name to upper case
- //and save it in the request object
- request.setAttribute("lastName",
lastName.toUpperCase()) -
120Concernant Struts
121La Passion!