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
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...
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...