Struts - Concepts

Transcription

Struts - Concepts
Struts
Concepts
Laurent Broto
IRIT/ENSEEIHT
4 avril 2011
1 / 23
Présentation Générale
Contexte
Les servlets sont (presque) toujours conçues de la même manière :
• un aiguillage
• un traitement
• une redirection
Problème
• structure du site implicite
• duplication de code
Idée
• une servlet générique
• paramétrée par un fichier extérieur
2 / 23
Servlet
3 / 23
Architecture
• Conceptuelle
◦ Struts se positionne au niveau du contrôleur
◦ fourniture d’une librairie pour la communication avec la vue
◦ mapping d’une action (soumission d’un formulaire) avec une classe
◦ mapping d’un résultat avec une vue
• Technique
◦ Struts fournit une classe qui se positionne comme un Filtre
1.
2.
3.
4.
5.
cette classe intercepte tous les appels
en fonction d’un fichier xml, elle réalise l’aiguillage
des classes Action exécutent le traitement
ces classes renvoient un résultat
Struts aiguille vers une vue en fonction du résultat
• Avantages
◦ structure du site explicite et facilement modifiable
◦ la taglib de Struts permet l’affectation automatique des valeurs des
formulaires dans les beans
4 / 23
Vue générale
5 / 23
Mise en place du Filtre
6 / 23
Les classes Action
• Doivent étendre la classe ActionSupport
• Ses champs sont automatiquement positionnés par le framework
• La classe effectue le traitement
• Elle renvoie une chaine de caractère permettant à struts d’aller
chercher les vues adaptées
◦ deux chaı̂nes préféfinies : SUCCESS et ERROR
• Récupération de la session HTTP : implements SessionAware
puis session.put(String,String)
• Pas d’injection de dépendances possibles de manière native.
Utiliser l’InitialContext ou Google Guice pour les EJB3, le plugins
d’intégration à Spring pour Spring.
7 / 23
Les vues
• Une librairie de taglib est fournie par Struts
◦ un taglib est une macro qui remplace une fonction Java
◦ usebean ⇒ session.getAttribute
• Ces taglib permettent
◦ de générer du code HTML pour l’affichage
◦ de générer du code Java pour le positionnement (la récupération) des
champs de la classe Action
• Ils sont liés à des thèmes
◦ les thèmes permettent de définir comment générer le code HTML
pour chaque tag
◦ ils sont contenus dans le répertoire template de struts2-core.jar
8 / 23
Tags Généraux
s :if, s :elseif,
s :else
s :iterator
s :a
s :property
9 / 23
démarre une structure de contrôle. test : l’expression à évaluer
itère sur une Collection. value : nom de la collection
crée un lien HTML <a>. href : l’adresse de la
cible
affiche la valeur d’un attribut. value : le nom de
l’attribut à afficher
Tags HTML
s :form
s :textfield
s
s
s
s
:submit
:select
:radio
:checkbox
10 / 23
démarre un formulaire
name : le bean à positionner, label : le texte avant
le champs
place un bouton de soumission
key : le bean à positionner, list : liste d’option
key : le bean à positionner, list : liste d’option
key : le bean à positionner
Struts.xml
• Permet de faire correspondre des actions à des classes et des
résultats à des vues
• Format général d’une balise action
<action name="nom-action" class="action.Action"
method="execute">
<result name="success">/Success.jsp</result>
<result name="error">/Error.jsp</result>
<result name="input">/index.jsp</result>
</action>
11 / 23
Validation d’un formulaire avant soumission
Struts permet de valider le formulaire avant sa soumission
• appel de la méthode public void validate() de la classe
action mappée au formulaire à valider
• si cette méthode appelle une méthode addFieldError, la méthode
execute n’est pas appelée et un message d’erreur est affiché dans
l’Action définie dans le nœud input du fichier struts.xml
• tag <s:head> pour de la coloration dans la jsp cible de l’erreur
12 / 23
Exemple d’application Struts : la calculatrice
On va réécrire l’application de calculatrice vue en TP. L’application
sera composée :
• d’un formulaire avec des tags Struts pour que l’utilisateur saisisse
les opérandes
• d’une JSP avec des tags Struts pour afficher le résultat
• d’une classe action qui fera l’addition et la validation du formulaire
• du fichier struts.xml correctement paramétré
13 / 23
Formulaire de saisie
14 / 23
Formulaire de saisie (suite)
URL : .../index.action
15 / 23
Classe ActionCalc
package h e l l o s t r u t s ;
i m p o r t com . opensymphony . xwork2 . A c t i o n S u p p o r t ;
p u b l i c c l a s s ActionCalc extends ActionSupport
{
p r i v a t e s t a t i c f i n a l l o n g s e r i a l V e r s i o n U I D = 1L ;
p r i v a t e S t r i n g nb1 , nb2 ;
p r i v a t e i n t sum ;
public void v a l i d a t e ()
{
try {
I n t e g e r . p a r s e I n t ( nb1 ) ;
}
catch ( Exception e ) {
a d d F i e l d E r r o r ( ” nb1 ” , ” E n t r e z un nombre ” ) ;
}
try {
I n t e g e r . p a r s e I n t ( nb2 ) ;
}
16 / 23
Classe ActionCalc (suite)
catch ( Exception e ) {
a d d F i e l d E r r o r ( ” nb2 ” , ” E n t r e z un nombre ” ) ;
}
}
public String execute ()
{
sum=I n t e g e r . p a r s e I n t ( nb1)+ I n t e g e r . p a r s e I n t ( nb2 ) ;
r e t u r n SUCCESS ;
}
p u b l i c S t r i n g getNb1 ( ) {
r e t u r n nb1 ;
}
p u b l i c v o i d s e t N b 1 ( S t r i n g nb1 ) {
t h i s . nb1 = nb1 ;
}
17 / 23
Classe ActionCalc (suite)
p u b l i c S t r i n g getNb2 ( ) {
r e t u r n nb2 ;
}
p u b l i c v o i d s e t N b 2 ( S t r i n g nb2 ) {
t h i s . nb2 = nb2 ;
}
p u b l i c i n t getSum ( ) {
r e t u r n sum ;
}
p u b l i c v o i d setSum ( i n t sum ) {
t h i s . sum = sum ;
}
}
18 / 23
JSP de résultat
19 / 23
Formulaire de saisie (suite)
URL : .../calcule.action
20 / 23
Paramétrage de la Servlet Struts
Fichier struts.xml dans le répertoire src
21 / 23
Formulaire de saisie (erreur)
URL : .../calcule.action
22 / 23
Conclusion
• Flot d’exécution contrôlé par un fichier XML. Le flot de code est
donc explicite et peut être géré par des outils
• Assignation automatique des attributs dans les actions : plus
besoin de récupérer les paramètres : moins code dupliqué
• Grâce aux thèmes, le framework est extensible et facilement
réutilisable
• Prise en charge de l’Ajax
• plugins disponibles pour intégration dans d’autres framework tels
que Spring, . . .
23 / 23