tp struts - L`Université Paris Descartes

Transcription

tp struts - L`Université Paris Descartes
ESIEA 4ième année
TP du Module CAAOO
STRUTS
par
Michel Futtersack
Maître de Conférences en Informatique
Université Paris Descartes
1. Ma première application STRUTS
1.1 Mise en place de l'arborescence des fichiers de l'application STRUTS
Une application Web JEE est un ensemble de fichiers : servlets, pages HTML, classes,
fichiers XML, etc. Ces fichiers doivent être organisés dans une arborescence précise de
répertoires, de façon à ce que le serveur d'applications (pour nous Tomcat) retrouve les bons
fichiers aux bons endroits.
Notre première application STRUTS s'appellera Couleurs. L'utilisateur saisit un nom de
couleur et l'application lui renvoie le nom d'un fruit de cette couleur.
Créez un nouveau projet NetBeans de type "Web Application". Donnez-lui le nom "Couleurs"
et dans la fenêtre suivante, cochez la case "Struts 1.2.9" dans le panneau "Framework", ainsi
que la case "Add Struts TLDs". NetBeans créé l'arborescence de fichiers suivante :
a) Un fichier important d'une application Web (de type STRUTS ou autre) est le
descripteur de déploiement, nommé web.xml : c'est un fichier XML qui décrit tous les
composants de l'application. Il est placé dans le répertoire WEB-INF de celle-ci.
b) Les applications STRUTS ont besoin d'informations supplémentaires pour qu'on puisse
les déployer. Celles-ci sont contenues dans un fichier XML nommé struts-config.xml,
placé lui aussi dans le répertoire WEB-INF de l'application Web.
1.2 Développement de l'application STRUTS
Le processus standard de développement d'une application STRUTS suit les étapes suivantes :
a) création des vues et des ActionForms liées à celles-ci
Introduction à STRUTS par Michel Futtersack
2
b) création des actions associées aux vues
c) description des correspondances entre les vues et les actions dans le fichier strutsconfig.xml
d) mise à jour du fichier web.xml
1.2.1 Création des vues
Les vues d'une application STRUTS sont des JSPs qui contiennent des balises spécifiques.
Notre application Couleurs comportera deux vues : la vue Index, point d'entrée de
l'application pour l'utilisateur, qui permet de saisir une nom de couleur. La vue Fruit qui
affiche le nom d'un fruit dont la couleur est celle indiquée par l'utilisateur.
1.2.1.1 La vue Index
Remplacer le code de la JSP index.jsp par le suivant, qui contient des tags HTML et des
tags STRUTS :
<%@ page language="java" %>
<%@taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<html>
<head> <title> Ma premiere application STRUTS</title></head>
<body>
<html:form action="devineFruit">
<table width="45%" border="1">
<tr>
<td>Indiquez une couleur :</td>
<td><html:text property="couleur" /></td>
</tr>
<tr>
<td colspan="2" align="center"> <html:submit /></td>
</tr>
</table>
</html:form> </body> </html>
.
La valeur saisie par l'utilisateur dans le formulaire STRUTS va être mémorisée pendant toute
la session dans un bean, créé automatiquement, instance d'une classe que nous appellerons
CouleurFormulaire, sous-classe de ActionForm. Comment le moteur JSP qui va
compiler la page index.jsp peut-il connaître le nom du bean dont les propriétés vont être
initialisées par les valeurs tapées dans le formulaire ? Grâce au fichier de configuration
struts-config.xml, que nous verrons plus loin. Cliquez-droit sur la racine Couleurs de
l'arborescence de fichiers et choisissez New->Java Class dans le menu popup. Nommez
CouleurFormulaire cette nouvelle classe et indiquez CAAOO comme nom de package.
Remplacez le code généré automatiquement par le code suivant :
package CAAOO;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
Introduction à STRUTS par Michel Futtersack
3
public class CouleurFormulaire extends ActionForm {
private String couleur = null;
public String getCouleur() { return (couleur);}
public void setCouleur(String coul){ couleur=coul;}
private String fruit = null;
public String getFruit() { return (fruit);}
public void setFruit(String f){ fruit=f;}
public
void
reset(ActionMapping
mapping,
HttpServletRequest
request) { couleur=null; fruit=null;}
NetBeans place ce source dans le sous-répertoire CAAOO du répertoire "Source Packages"
1.2.1.2 La vue Fruit
Créez un sous-répertoire du répertoire "Web Pages" appelé "images" (clic-droit sur le nœud
"Web Pages" de l'arborescence de fichiers). Placez une image de fruits dans le sous-répertoire
images. La page fruit.jsp va afficher l'image et le nom d'un fruit dont la couleur est celle
indiquée par l'utilisateur.
<%@ page language="java" %>
<%@taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<html><body>
<div align="center">
<img src="images/fruits.jpg">
<H2> <bean:write name="cf" property="fruit" /> </H2>
<a href=index.jsp>Retour</a>
</div>
</body></html>
La valeur de l'attribut FRUIT de la session est calculée par l'action DevineFruit associée à
cette JSP (voir plus loin)
Placez cette page fruit.jsp dans le répertoire "Web Pages"
1.2.2 Création des actions associées aux vues
Le contrôleur d'une application STRUTS est un objet "dispatcher", qui interprète les
informations transmises via les requêtes HTTP. Ce "dispatcher" est une servlet qui détermine
quelle est l'action à effectuer suivant la requête reçue. Pour des applications simples comme
Couleurs,
cette
servlet
est
une
instance
de
org.apache.struts.action.ActionServlet. Les différentes actions sont implantées
dans des instances de sous-classes de org.apache.struts.action.Action. Dans notre
application Couleurs nous n'avons qu'une seule action à implanter : rechercher le nom d'un
fruit correspondant à la couleur indiquée par l'utilisateur. Nous créons donc une classe
DevineFruit, sous–classe de org.apache.struts.action.Action (New->Java
Class) et appartenant au package CAAOO :
package CAAOO;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
Introduction à STRUTS par Michel Futtersack
4
import
import
import
import
import
javax.servlet.http.HttpServletResponse;
org.apache.struts.action.Action;
org.apache.struts.action.ActionForm;
org.apache.struts.action.ActionForward;
org.apache.struts.action.ActionMapping;
public class DevineFruit extends Action {
protected String calculeFruit(String couleur) {
if(couleur.equals("rouge")) { return("Fraise");}
else if(couleur.equals("jaune")) { return("Banane");}
else if(couleur.equals("vert")) { return("Kiwi");}
else if(couleur.equals("violet")) { return("Prune");}
return(null);
}
public ActionForward execute(ActionMapping mapping,
ActionForm form, HttpServletRequest request,HttpServletResponse
response)throws IOException, ServletException {
String cible = "succes";
String couleur, fruit=null;
if(form!=null){
CouleurFormulaire toto = (CouleurFormulaire)form;
couleur = toto.getCouleur();
fruit = calculeFruit(couleur);
toto.setFruit(fruit);
}
if(fruit==null) { cible="echec";}
return(mapping.findForward(cible));
}
}
1.2.3 Description des correspondances entre les vues et les actions
Nous allons modifier le fichier de configuration struts-config.xml (se trouvant dans le
répertoire WEB-INF) en ajoutant les lignes suivantes (entre les balises <struts-config> et
</struts-config>) :
L'élément <form-beans> suivant informe l'application STRUTS de l'existence du Bean
CouleurFormulaire et le nom par lequel doit être référencé une instance de ce bean.
<form-beans>
<form-bean name="cf" type="CAAOO.CouleurFormulaire" />
</form-beans>
L'élément <action-mappings> suivant permet au contrôleur (l'ActionServlet) de comparer
la valeur de l'attribut action du <html:form> (qui dans notre cas est devineFruit) avec l'attribut
path des différents sous-éléments de <action-mappings>. Lorsque une correspondance
est trouvée, le contrôleur consulte l'élément <form-beans> et recherche un sous-élément
<form-bean> dont l'attribut name a la même valeur (qui dans notre cas est cf) que l'attribut
name de l'élément <action>. Cela permet au contrôleur de connaître la classe du bean (ici
CAAOO.CouleurFormulaire) et de pouvoir ainsi en créer une instance dans laquelle il
mémorisera les données fournies par l'utilisateur et envoyées au serveur par une requête de
type POST.
Introduction à STRUTS par Michel Futtersack
5
<action-mappings>
<action path="/devineFruit" type="CAAOO.DevineFruit" name="cf">
<forward name="succes" path="/fruit.jsp"/>
<forward name="echec" path="/index.jsp"/>
</action>
</action-mappings>
1.2.4 Mise à jour du fichier web.xml
Après avoir créé et configuré les vues et le contrôleur, il nous faut informer l'application Web
de l'existence de ces composants. Cela se fait dans le fichier web.xml généré par NetBeans :
Celui-ci contient la déclaration à Tomcat de la servlet action, qui est le contrôleur de
l’application STRUTS
<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>
<load-on-startup>2</load-on-startup>
</servlet>
Il faut aussi indiquer au serveur d'application à quel moment la servlet action (le contrôleur)
doit être exécutée. On indique que lorsqu'une requête dont l'URL se termine par .do est
reçue, celle-ci doit être traitée par le contrôleur STRUTS (ce .do est ajouté automatiquement
à la fin des URLs dans l’attribut action de la balise <html:form>).
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
On indique enfin la page d'accueil de l'application Web :
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
1.2.5 Construction et exécution de l'application STRUTS
Run->Run Main Project (ou F6)
NetBeans lance les diverses compilations, démarre Tomcat et appelle le navigateur Web
(celui par défaut de votre machine) auquel il passe l’url : http://localhost:8084/Couleurs/
Affichez dans le navigateur le code de la page Web : c’est du pur HTML, généré par Tomcat
(via Jasper, puis Catalina)
Introduction à STRUTS par Michel Futtersack
6
2.
La taglib STRUTS-HTML
La taglib Struts-Html permet de construire des formulaires. Chaque balise de cette taglib est
le pendant d'une balise HTML 4.0. Mais alors pourquoi ne pas utiliser simplement les balises
HTML originales ???
Le gros intérêt des balises struts-html est que l'on peut associer un formulaire à un bean
ActionForm dont les propriétés ont pour valeurs les données entrées par l'utilisateur. Cela
évite d'utiliser les balises JSP <jsp:useBean> et <jsp:setproperty>.Ainsi la JSP
standard suivante :
<jsp:useBean id="utilisateur" class="DonneesUtilisateur"
scope="session"/>
<jsp:setProperty name="utilisateur" property="*"/>
<html><body>
<form method="post"
action="http://localhost:8080/examples/jsp/suiteBonjour.jsp>
Quel est votre nom ? <INPUT type="text" name="prenom"><BR>
<input type="submit" value="Envoyez">
</form>
</body></html>
s'écrira plus simplement :
<%@ page language="java" %>
<%@taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<html><body>
<html:form action="suiteBonjour">
Quel est votre nom ?<html:text property="nom" />
</html:form>
</body></html>
Voici une description partielle de quelques balises, qui doivent nécessairement être incluses
dans une balise <html :form>
<html:button>
Attribut
Statut
Description
property
obligatoire
nom de la propriété associée dans l'ActionForm
onclick
optionnel
nom de la fonction JavaScript à exécuter lorsque
le bouton est cliqué
Remarque : une JSP peut très bien contenir du code JavaScript, qui sera recopié tel quel dans
la page HTML générée sur le serveur et permettra de faire des petits traitements sur la
machine cliente (par exemple des vérifications sur les entrées fournies par l'utilisateur)
Exemple d'utilisation :
<html:button property="bouton1">Ajouter</html:button>
dont la traduction en HTML envoyée par le serveur sera :
<input type="button" name="bouton1" value="Ajouter">
<html:checkbox>
Attribut
Statut
Description
property
obligatoire
nom de la propriété associée dans l'ActionForm
value
optionnel
valeur à donner à la propriété si la case est
Introduction à STRUTS par Michel Futtersack
7
cochée. La valeur par défaut est "on"
Exemple d'utilisation :
<html:checkbox property="chkbx1">j'aime STRUTS</html:checkbox>
<html:radio>
Attribut
Statut
Description
property
obligatoire
nom de la propriété associée dans l'ActionForm
value
optionnel
si la propriété a cette valeur, alors le bouton radio
est coché
Exemple d'utilisation :
<html:radio property="rd" value="Mr" />
<html:radio property="rd" value="Mme" />
<html:radio property="rd" value="Mlle" />
<html:password>
Attribut
property
Statut
obligatoire
Description
nom de la propriété associée dans l'ActionForm
Exemple d'utilisation :
<html:password property="passwd"/>
<html:select>
Attribut
property
Statut
obligatoire
Description
nom de la propriété associée dans l'ActionForm
Exemple d'utilisation :
<html:select property="couleur">
<html:option value="rouge"> Rouge </html:option>
<html:option value="jaune"> Jaune </html:option>
<html:option value="vert"> Vert </html:option>
<html:option value="violet"> Violet </html:option>
</html:select>
Si la propriété "couleur" de l'ActionForm (associée au formulaire qui contient cette balise
html:select)a déjà la valeur "vert", la traduction HTML renvoyée par le serveur sera :
<select name="couleur"
<option value="rouge">Rouge </option>
<option value="jaune">Jaune </option>
<option value="vert" selected="selected">Vert </option>
<option value="violet">Violet </option>
</select>
Pour une description complète de la taglib struts-html, consultez :
http://struts.apache.org/1.x/struts-taglib/dev_html.html
Exercice 1 : Modifiez l'application Web Couleurs :
a) ajouter une page login.jsp dans laquelle l'utilisateur entre un nom dans un
<html:text> et un mot de passe dans un <html:password>. Il faut créer une
ActionForm associée à cette JSP ainsi qu'une Action qui redirectionne vers la page
index.jsp si l'utilisateur est authentifié, ou sinon vers une page erreur.jsp (à
créer aussi), qui renvoie elle-même sur login.jsp. On supposera qu'il n'y a qu'un
Introduction à STRUTS par Michel Futtersack
8
seul utilisateur à identifier de nom "toto" et de mot de passe "toto". Ne pas oublier de
modifier l'élément <welcome-file> dans le fichier web.xml !!
b) l'utilisateur choisit une couleur dans une liste déroulante (utilisez <html:select>)
3. La taglib STRUTS-LOGIC
La taglib Struts-Logic permet d'introduire des balises de contrôle dans une JSP de sorte que
celle-ci génère du HTML sous certaines conditions ou de façon itérative, ce que l'on peut faire
dans les JSP ordinaires en incluant du HTML dans une scriptlet.
Voici une description partielle de quelques balises :
<logic:equal/>
Attribut
Statut
Description
name
obligatoire
nom d'un JavaBean
property
obligatoire
nom d'une propriété du JavaBean cité ci-dessus
value
obligatoire
valeur à utiliser pour la comparaison
Exemple d'utilisation :
<logic:equal
name="utilisateur"
Patron</logic:equal>
<logic:notEqual/> …
<logic:greaterEqual/>
Attribut
Statut
name
obligatoire
property
obligatoire
value
obligatoire
property="nom"
value="Toto">Bonjour
Description
nom d'un JavaBean
nom d'une propriété du JavaBean cité ci-dessus
valeur à utiliser pour la comparaison
Exemple d'utilisation :
<logic:greaterEqual name="utilisateur" property="age" value="18">Vous êtes autorisé à lire
ce texte</logic:equal>
<logic:forward/>
Attribut
Statut
Description
name
obligatoire
nom d'un élément défini dans une "redirection
globale"
Exemple d'utilisation :
<logic:forward name="login" </logic:forward>
La "redirection globale doit être définie dans le fichier struts-config.xml par l'élément suivant
:
<global-forwards>
<forward name="login" path="/login.jsp"/>
</global-forwards>
<logic:iterate/>
id
name
property
obligatoire
obligatoire
optionnel
nom de la variable "compteur" de l'iteration
désigne la collection sur laquelle on itère
propriété du bean
Pour une description complète de la taglib struts-logic, consultez :
http://struts.apache.org/1.x/struts-taglib/dev_logic.html
Introduction à STRUTS par Michel Futtersack
9
4. La taglib STRUTS-BEAN
Voici une description partielle de quelques balises :
<bean:write/>
Attribut
Statut
Description
name
obligatoire
nom d'un bean
property
optionnel
propriété du bean
Exemple d'utilisation :
<bean:write name="cf" property="couleur"/>
<bean:define/>
Attribut
Statut
Description
id
obligatoire
nom de la variable créée
name
obligatoire
nom d'un bean
property
optionnel
propriété du bean
Exemple d'utilisation :
<bean:define id="couleur" name="formulaireCouleur" property="couleur"/>
Cette balise permet de définir une variable locale à la page, qui pourra être utilisée dans
d'autres balises avec le nom id, et dont la valeur est celle de la propriété du bean référencé par
name.
Pour une description complète de la taglib struts-bean, consultez :
http://struts.apache.org/1.x/struts-taglib/dev_bean.html
Vous allez modifier l'application Couleurs de façon à illustrer les taglibs STRUTS-LOGIC et
STRUTS-BEAN. Les pages login.jsp, index.jsp et erreur.jsp sont inchangées. Par
contre, la vue fruit.jsp affiche une image et la liste des fruits dont la couleur est celle
choisie par l'utilisateur. Voici le code de cette nouvelle JSP :
<%@ page language="java" %>
<%@taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<%@taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>
<html><body>
<div align="center">
<img src="images/fruits.jpg">
</div>
<H2>
<bean:define id="couleurChoisie" name="cf" property="couleur"/>
Les fruits de couleur <%= couleurChoisie %> sont :<BR>
<logic:iterate id="fruit" name="fruits">
<logic:equal name="fruit" property="couleur"
value="<%= (String)couleurChoisie %>">
<bean:write name="fruit" property="nom"/><BR>
</logic:equal>
</logic:iterate>
</H2>
</body></html>
La balise <bean:define> permet de définir une variable de nom couleurChoisie locale
à la page, dont la valeur est celle de la propriété couleur du bean cf, qui, rappelons-le, a été
créé automatiquement au moment de la compilation de la page index.jsp et dont les valeurs
Introduction à STRUTS par Michel Futtersack
10
ont été affectées par les paramètres renvoyés par la requête http POST générée par le
navigateur Web lorsque l'utilisateur a cliqué sur le bouton "submit".
La balise <logic-iterate> permet de parcourir une liste nommée fruits, l'élément
courant de cette collection étant nommé fruit. Mais où donc définie cette variable fruits ?
C'est un attribut de l'objet HttpSession, dont la valeur est affectée dans l'Action
devineFruit.
Dans le corps de la boucle, on teste avec la balise <logic:equal> si la propriété couleur
de l'objet fruit est identique à la valeur de la variable couleurChoisie (il reste
malheureusement un petit relent de java : le casting (String), STRUTS n'atteint pas encore
tout à fait son objectif de fournir un langage de balises 100% java-free !!! ). Si c'est le cas, on
écrit dans le flot de sortie la valeur de la propriété nom de l'objet fruit. L'objet fruit est
une instance d'un JavaBean Fruit qu'il faut définir. Celui-ci doit implanter l'interface
Serializable pour que STRUTS puisse éventuellement sauvegarder ses instances sur
disque.
package CAAOO;
public class Fruit implements java.io.Serializable {
private String nom = null;
private String couleur = null;
public String getNom() { return (nom);}
public void setNom(String n){ nom=n;}
public String getCouleur() { return (couleur);}
public void setCouleur(String coul){ couleur=coul;}
}
Voici le nouveau code de la classe de l'Action devineFruit. La liste de fruits est implantée
sous la forme d'une ArrayList. Cette liste est ensuite affectée à l'attribut fruits de l'objet
HttpSession.
package CAAOO;
import java.util.*;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
public class DevineFruit extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm
form, HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
ArrayList fruits = new ArrayList();
String cible;
String couleur = null;
Fruit f = new Fruit();
f.setNom("Fraise");
f.setCouleur("Rouge");
fruits.add(f);
f = new Fruit();
f.setNom("Framboise");
Introduction à STRUTS par Michel Futtersack
11
f.setCouleur("Rouge");
fruits.add(f);
f = new Fruit();
f.setNom("Kiwi");
f.setCouleur("Vert");
fruits.add(f);
f = new Fruit();
f.setNom("Prune");
f.setCouleur("Violet");
fruits.add(f);
f = new Fruit();
f.setNom("Banane");
f.setCouleur("Jaune");
fruits.add(f);
f = new Fruit();
f.setNom("Citron");
f.setCouleur("Jaune");
fruits.add(f);
if(form!=null){
HttpSession session = request.getSession();
session.setAttribute("fruits", fruits);
cible = "succes";
}
else { cible = "echec"; }
return(mapping.findForward(cible));
}
}
Exercice 2 : Inspirez-vous de l'exemple précédent pour modifier l'application Couleurs de
façon à ce qu'elle puisse authentifier une liste prédéfinie d'utilisateurs (créer un JavaBean
Utilisateur avec deux propriétés nom et motDePasse et une ArrayList dans l'Action
associée à la JSP login.jsp)
7 Conclusion et Références :
Ce TP a été préparé à partir du livre : "Jakarta Struts par la pratique" de James Goodwill,
Eyrolles, Pour compléter ce TP, vous pouvez étudier des tutoriaux sur le Web (pas toujours
très clairs…) :
http://tahe.developpez.com/java/struts/ (en français)
http://brabant.developpez.com/tutoriel/java/netbeans/5.0/struts/ (en français)
http://www.labo-sun.com/resource-fr-essentiels-859-1-java-j2ee-struts-un-framework-mvcpour-vos-applications-j2ee.htm (en français)
STRUTS est utilisé dans de nombreux développements d'applications Web. Il peut être
combiné à d'autres taglibs comme par exemple JSTL. Cependant, le framework JSF (Java
Server Faces) de SUN est plus récent (il a été développé par Craig McClanahan le créateur de
STRUTS, embauché par SUN) et remplacera à terme STRUTS. On peut l’utiliser sous
NetBeans.
Introduction à STRUTS par Michel Futtersack
12

Documents pareils

Framework MVC - Struts

Framework MVC - Struts Installation dans un projet Eclipse Modèle : les form beans (ActionForm) Vue : les JSP avec les taglibs HTML Contrôleur : les actions Configuration (struts-config.xml) Développer les actions La str...

Plus en détail

Formation Struts 1 à Nantes, à Paris, à Lyon, à Lille, à Aix en

Formation Struts 1 à Nantes, à Paris, à Lyon, à Lille, à Aix en Découvrir Struts 1 Principe des architectures MVC et MVC 2 Panorama des frameworks MVC2 : Struts, JSF, ... Struts 1 : présentation, architecture, version Environnement de développement, plugins, se...

Plus en détail