134
 Struts par la pratique - Serge Tahé, université d'Angers 1/134 Introduction à STRUTS par la pratique - déc 2003, rév août 2004 - [email protected] Mots clés : méthodologie STRUTS, programmation WEB, servlets, pages JSP, serveur web TOMCAT

Struts 1

Embed Size (px)

Citation preview

Introduction STRUTS par la pratique - dc 2003, rv aot 2004 [email protected]

Mots cls : mthodologie STRUTS, programmation WEB, servlets, pages JSP, serveur web TOMCAT

Struts par la pratique - Serge Tah, universit d'Angers

1/134

I - GnralitsI.1 ObjectifsOn se propose ici de dcouvrir une mthode de dveloppement appele STRUTS. Jakarta Struts est un projet de l'Apache Software Foundation (www.apache.org) qui a pour but de fournir un cadre standard de dveloppement d'applications web en Java respectant l'architecture dite MVC (Modle-Vue-Contrleur).

I.2 Le modle MVCLe modle MVC cherche sparer les couches prsentation, traitement et accs aux donnes. Une application web respectant ce modle pourrait tre architecture de la faon suivante : Interface utilisateur Logique applicative Sources de donnes

Une telle architecture est appele 3-tiers ou 3 niveaux : l'interface utilisateur est le V (la vue) la logique applicative est le C (le contrleur) les sources de donnes sont le M (Modle) L'interface utilisateur est souvent un navigateur web mais cela peut tre galement une application autonome qui via le rseau envoie des requtes HTTP au service web et met en forme les rsultats que celui-ci lui renvoie. La logique applicative est constitue des scripts traitant les demandes de l'utilisateur. La source de donnes est souvent une base de donnes mais cela peut tre aussi de simples fichiers plats, un annuaire LDAP, un service web distant,... Le dveloppeur a intrt maintenir une grande indpendance entre ces trois entits afin que si l'une d'elles change, les deux autres n'aient pas changer ou peu. Nous verrons que ce modle de base donne naissance des architectures prsentant des couches plus fines que celles dfinies ci-dessus. Lorsqu'on cherche appliquer ce modle avec des servlets et pages JSP, on obtient l'architecture suivante : Client Interface client Logique applicative Couche contrle CONTRLEUR MODELE VUES page1.jsp pagen.jsp Couche mtier Couche d'accs donnes Donnes Sources de donnes

Dans le bloc [Logique Applicative], on distingue le bloc [Couche de contrle] est compos d'une ou plusieurs servlets et de classes annexes. Elle assure l'interface avec le client : o le client fait une demande o la couche contrle la fait excuter par la couche mtier o selon le rsultat de cette excution, la couche contrle envoie telle ou telle vue en rponse au client. Le rle de la couche de contrle s'arrte cela. On ne doit pas y trouver des classes qui devraient relever de la couche mtier. le bloc [Couche mtier] regroupe les classes Java ncessaires la logique mtier. Cette couche est indpendante de toute forme d'interface avec l'utilisateur. Ainsi elle doit tre utilisable aussi bien avec une interface console, une interface web, une interface de client riche. Elle doit ainsi pouvoir tre teste en-dehors de l'interface web et notamment avec une interface console.

Struts par la pratique - Serge Tah, universit d'Angers

2/134

le bloc [Couche d'accs aux donnes] qui regroupe les classes Java capables de fournir les donnes ncessaires la couche mtier, souvent des donnes persistantes (BD, fichiers,...). Ce bloc doit tre indpendant de la couche mtier et doit pouvoir tre test indpendamment de celle-ci par exemple avec une application console indpendante. le bloc [Couche de prsentation] form des pages JSP qui constituent les vues de l'application. Les quatre entits prcdentes dfinissent assez bien la structure de nombreuses applications web en quatre couches.

I.3 Une dmarche de dveloppement MVC l'aide de servlets et pages JSPNous dfinissons maintenant une dmarche possible pour le dveloppement d'applications web java respectant le modle MVC prcdent. Elle ne doit tre prise que comme un exemple de ce qui pourrait tre fait. 1. On commencera par dfinir toutes les vues de l'application. Celles-ci sont les pages Web prsentes l'utilisateur. On se placera donc du point de vue de celui-ci pour dessiner les vues. On distingue trois types de vues : o le formulaire de saisie qui vise obtenir des informations de l'utilisateur. Celui-ci dispose en gnral d'un bouton pour envoyer les informations saisies au serveur. o la page de rponse qui ne sert qu' donner de l'information l'utilisateur. Celle-ci dispose souvent d'un lien permettant l'utilisateur de poursuivre l'application avec une autre page. o la page mixte : la servlet a envoy au client une page contenant des informations qu'elle a gnres. Cette mme page va servir au client pour fournir la servlet d'autres informations. Chaque vue donnera naissance une page JSP. Pour chacune de celles-ci : o on dessinera l'aspect de la page o on dterminera quelles sont les parties dynamiques de celle-ci : les informations destination de l'utilisateur qui devront tre fournies par la servlet en paramtres la vue JSP les donnes de saisie qui devront tre transmises la servlet pour traitement. Celles-ci devront faire partie d'un formulaire HTML. On pourra schmatiser les E/S de chaque vue entres page.jsp sorties

2.

3.

les entres sont les donnes que devra fournir la servlet la page JSP souvent dans la requte (Request), la session (Session) ou le contexte de l'application (ServletContext). les sorties sont les donnes que devra fournir la page JSP la servlet. Elles font partie d'un formulaire HTML et la servlet les rcuprera par une opration du type request.getparameter(...). 4. On crira le code Java/JSP de chaque vue. Il aura le plus souvent la forme suivante : // importations de classes le plus souvent Panneau de configuration -> Systme -> Onglet [Avanc] -> Bouton [Variables d'environnement] ->

Ici JAVA_HOME dsigne un JDK de Sun dont l'arborescence est la suivante :

Tout JDK rcent de Sun fera l'affaire. La variable d'environnement peut ncessiter un redmarrage du systme pour tre prise en compte. Une fois la variable d'environnement JAVA_HOME dfinie, l'installation de Tomcat peut tre faite. Au cours de celle-ci, l'installateur va demander le dossier contenant la JVM. Il prsente dans une liste droulante les dossiers susceptibles de contenir une JVM. Ces informations sont obtenues soit par la variable JAVA_HOME soit par des cls de registres. La JVM et correspondant la variable JAVA_HOME devrait tre dans la liste des JVM prsentes. Ce sera la seule s'il n'y a pas d'autres JVM sur la machine. On slectionnera la JVM de son choix. La gestion de Tomcat via le web ncessite de s'authentifier via une page de login/mot de passe. Deux utilisateurs spciaux sont appels admin et manager. Au cours de l'installation de Tomcat, il nous est demand de fixer le mot de passe de l'utilisateur admin. Dans La suite, nous supposerons que ce mot de passe est admin. L'installation de Tocat se fait dans un dossier choisi par l'utilisateur, que nous appellerons dsormais . L'arborescence de ce dossier pour la version Tomcat 5.0.27 ci-dessus est la suivante :

Struts par la pratique - Serge Tah, universit d'Angers

10/134

L'installation de Tomcat 5.0.27 a amen un certain nombre de raccourcis dans le menu [Dmarrer]. Nous utilison le lien [Monitor] ci-dessous pour lancer l'outil d'arrt/dmarrage de Tomcat :

Une icne est insre dans la barre des tches en bas droite de l'cran :

Le moniteur de Tomcat est activ par un double-clic sur cette icne :

Les boutons Start - Stop - Pause - Restart nous permettent de lancer - arrter - relancer le serveur. Nous lanons le serveur par [Start] puis avec un navigateur nous demandons l'url http://localhost:8080. Nous devons obtenir une page analogue la suivante :

Struts par la pratique - Serge Tah, universit d'Angers

11/134

On pourra suivre les liens ci-dessous pour vrifier la correcte installation de Tomcat :

Tous les liens de la page [http://localhost:8080] prsentent un intrt et le lecteur est invit les explorer. Nous aurons l'occasion de revenir sur les liens permettant de grer les applications web dployes au sein du serveur :

II.3 Dploiement d'une application web au sein du serveur TomcatUne application web doit suivre certaines rgles pour tre dploye au sein d'un conteneur de servlets. Soit le dossier d'une application web. Une application web est compose de :classes archives java vues, ressources (.jsp, .html, ...)

elles seront places dans le dossier \WEB-INF\classes elles seront places dans le dossier \WEB-INF\lib elles seront places dans le dossier ou des sous-dossiers mais en gnral en-dehors du sous-dossier WEB-INF

L'application web est configure par un fichier XML : \WEB-INF\web.xml. Considrons l'application web dont l'arborescence serait la suivante :

Les dossiers [classes] et [lib] sont ici vides. L'application n'ayant pas de classes, le fichier WEB-INF\web.xml est inutile et n'est donc pas prsent. Le dossier [vues] contient un fichier html statique :Struts par la pratique - Serge Tah, universit d'Angers

12/134

dont le contenu est le suivant : Application exemple Application exemple active ....

Si on charge ce fichier dans un navigateur, on obtient la page suivante :

L'URL affiche par le navigateur montre que la page n'a pas t dlivre par un serveur web mais directement charge par le navigateur. Nous voulons maintenant qu'elle soit disponible via le serveur web Tomcat. Revenons sur l'arborescence du rpertoire :

La configuration des applications web dployes au sein du serveur Tomcat se fait l'aide de fichiers XML placs dans le dossier \conf\Catalina\localhost :

Ces fichiers XML peuvent tre crs la main car leur structure est trs simple. Plutt que d'adopter cette dmarche, nous allons utiliser les outils web que nous offre Tomcat. Sur sa page d'entre http://localhost:8080, le serveur nous offre des liens pour l'administrer :

Struts par la pratique - Serge Tah, universit d'Angers

13/134

Le lien [Tomcat Administration] nous offre la possibilit de configurer les ressources mises par Tomcat la disposition des applications web dploye en son sein. Un exemple classique est un pool de connexions une base de donnes. Suivons le lien. Nous obtenons une page d'identification :

Ici, il faut redonner les informations que nous avons donne au cours de l'installation de Tomcat. Dans notre cas, nous donnons le couple admin/admin. Le bouton [Login] nous amne la page suivante :

Struts par la pratique - Serge Tah, universit d'Angers

14/134

Cette page permet l'administrateur de Tomcat de dfinir des sources de donnes (Data Sources), les informations ncessaires l'envoi de courrier (Mail Sessions), des donnes d'environnement accessibles toutes les applications (Environment Entries), de grer les utilisateurs grant Tomcat (Users), de grer des groupes d'utilisateurs (Groups), de dfinir des rles (= ce que peut faire ou non un utilisateur), de dfinir les caractristiques des applications web dployes par le serveur (Service Catalina) Suivons le lien [Roles] ci-dessus :

Un rle permet de dfinir ce que peut faire ou ne pas faire un utilisateur ou un groupe d'utilisateurs. On associe un rle certains droits. Chaque utilisateur est associ un ou plusieurs rles et dispose des droits de ceux-ci. Le rle [manager] ci-dessous donne le droit de grer les applications web dployes dans Tomcat (dploiement, dmarrage, arrt, dchargement). Nous allons crer un utilisateur [manager] qu'on associera au rle [manager] afin de lui permettre de grer les applications de Tomcat. Pour cela, nous suivons le lien [Users] de la page d'administration :

Struts par la pratique - Serge Tah, universit d'Angers

15/134

Nous voyons qu'un certain nombre d'utilisateurs existent dj. Nous utilisons l'option [Create New User] pour crer un nouvel utilisateur :

Nous donnons l'utilisateur manager le mot de passe manager et nous lui attribuons le rle manager. Nous utilisons le bouton [Save] pour valider cet ajout. Ce nouvel utlisateur va tre ajout dans le fichier \conf\tomcat-users.xml :

dont le contenu est le suivant : Struts par la pratique - Serge Tah, universit d'Angers

16/134

Une autre faon d'ajouter des utilisateurs est donc de modifier directement ce fichier. C'est notamment ainsi qu'il faut procder si d'aventure on a oubli le mot de passe de l'administrateur admin. Revenons maintenant la page d'entre [http://localhost:8080] et suivons le lien [Tomcat Manager] :

Nous obtenons alors une page d'authentification. Nous nous identifions comme manager/manager, c.a.d. l'utilisateur de rle [manager] que nous venons de crer. En effet, seul un utilisateur ayant ce rle peut utiliser ce lien :

Nous obtenons une page listant les applications actuellement dployes dans Tomcat :

Struts par la pratique - Serge Tah, universit d'Angers

17/134

Nous pouvons ajouter une nouvelle application grce des liens trouvs en bas de la page :

Ici, nous voulons dployer au sein de Tomcat, l'application exemple que nous avons construite prcdemment. Nous le faisons de la faon suivante :

Context Path Directory URL

/exemple file:// D:\data\serge\devel\web\servlets\exemple

le nom utilis pour dsigner l'application web dployer le dossier de l'application web

Pour obtenir le fichier D:\data\serge\devel\web\servlets\exemple\vues\exemple.html, nous demanderons Tomcat l'URL http://localhost:8080/exemple/vues/exemple.html. Le contexte sert donc donner un nom la racine de l'arborescence de l'application web dploye. Nous utilisons le bouton [Deploy] pour effectuer le dploiement de l'application. Si tout se passe bien, nous obtenons la page rponse suivante :Struts par la pratique - Serge Tah, universit d'Angers

18/134

et la nouvelle application apparat dans la liste des applications dployes :

Commentons la ligne du contexte /exemple ci-dessus :/exemple Dmarrer Arrter Recharger Undeploy

lien sur http://localhost:8080/exemple permet de dmarrer l'application permet d'arter l'application permet de recharger l'application. C'est ncessaire par exemple lorsqu'on ajout, modifi ou supprim certaines classes de l'application. suppression du contexte /exemple. L'application disparat de la liste des applications disponibles.

Le dploiement a eu pour effet d'ajouter un nouveau descripteur XML dans le dossier \conf\Catalina\localhost :

Le fichier exemple.xml dcrit l'application web ajoute :

On retrouve tout simplement ce que nous avons saisi dans la page web de dploiement. Une autre faon de procder est donc la suivante : 1. crire la main le descripteur XML de l'application dployer 2. mettre ce descripteur dans le dossier \conf\Catalina\localhost 3. arrter et relancer Tomcat Maintenant que notre application /exemple est dploye, nous pouvons faire quelques tests. 1. Tout d'abord, nous demandons l'url racine du contexte http://localhost:8080/exemple/ :

Struts par la pratique - Serge Tah, universit d'Angers

19/134

Nous obtenons une liste du contenu du dossier associ au contexte /exemple. Cependant le dossier WEB-INF d'une application web n'est lui jamais prsent. Nous pouvons demander la page exemple.html via l'url http://localhost:8080/exemple/vues/exemple.html :

II.4 Dploiement d'une application Struts au sein du serveur TomcatUne application Struts est une application web comme une autre. Elle suit donc les rgles de dploiement que nous venons de dcrire. Ici une application, que nous appellerons /strutspersonne, sera excute par un serveur Tomcat version 5.x. Nous suivons donc les rgles de dploiement des applications web au sein de ce serveur : nous crons le dossier physique qui sera associ au contexte strutspersonne ainsi que le sous-dossier WEB-INF.

dans le dossier WEB-INF de l'application , nous dfinissons le fichier de configuration web.xml de l'application :

le contenu du fichier web.xml est le suivant : action org.apache.struts.action.ActionServlet config /WEB-INF/struts-config.xml Struts par la pratique - Serge Tah, universit d'Angers

20/134

action *.do

la classe du contrleur (servlet) de l'application est une classe prdfinie de Stuts, appel ActionServlet. Elle se trouve dans le fichier struts.jar. Afin que Tomcat puisse trouver cette classe, on placera struts.jar dans le dossier /WEBINF/lib de l'application web, dossier crer. En fait, nous placerons dans ce dossier tous les fichiers .jar trouvs dans le dossier \lib o est le dossier racine de l'arborescence de Struts.

Beaucoup de ces archives seront inutiles dans nos exemples. On a simplement voulu montrer o les trouver. nous avons indiqu que le contrleur Struts avait besoin d'un certain nombre d'informations qu'il trouvait normalement dans un fichier appel struts-config.xml plac dans le mme dossier que web.xml. En fait, le nom de ce fichier est paramtrable. C'est le paramtre config du fichier web.xml, ci-dessus, qui fixe ce nom. la balise indique que le contrleur sera atteint via toutes les URL se terminant par le suffixe .do. Cette association est habituelle dans les applications Struts mais pas obligatoire. D'autres associations peuvent tre choisies. Ces URL seront ensuite filtres par le contrleur qui n'acceptera que les URL dclares dans son fichier de configuration struts-config.xml Pour l'instant, notre fichier web.xml est suffisant. 1. Nous allons dployer l'application dans Tomcat. Le lecteur est invit relire la dmarche prsente pour l'application /exemple. Nous allons donc sur la page [Tomcat Manager] pour y dfinir les caractristiques de l'application dployer : son contexte (= son nom) et le dossier physique o elle se trouve :

Une fois dploye, l'application est dans la liste des applications dployes :

Struts par la pratique - Serge Tah, universit d'Angers

21/134

2.

Nous allons demander l'URL /main.do l'application strutspersonne. D'aprs le fichier web.xml prcdent, cette URL sera donc transmise la servlet org.apache.struts.action. La classe ActionServlet va tre instancie et sa mthode init appele. Celle-ci essaie de lire le fichier de configuration dfini par le paramtre config. Celui-ci doit donc exister. Nous crons le fichier WEB-INF\struts-config.xml suivant :

Remarquons que le fichier DTD de struts-config.xml n'est pas le mme que celui du fichier web.xml, indiquant par l qu'ils n'ont pas la mme structure. Pour chaque URL que le contrleur doit grer, il nous faut dfinir une balise . Celle-ci sert indiquer au contrleur ce qu'il doit faire lorsqu'on lui demande cette URL. Ici, nous indiquons les lments suivants : 1. path="/main" : dfinit le nom de l'URL configure par la balise . Le suffixe .do est implicite. 2. type="org.apache.struts.actions.ForwardAction" : dfinit le nom de la classe Action qui doit traiter la demande. Ici, on utilise une classe Action prdfinie dans Struts. Elle ne fait rien par elle-mme et relaie la demande du client l'URL indique dans l'attribut parameter. 3. parameter="/vues/main.html" : le nom de l'URL qui doit tre relaye la demande. Ici c'est un fichier HTML statique. En rsum, lorsque l'utilisateur demandera l'URL /main.do, il obtiendra l'URL /vues/main.html. 5. Le fichier main.html sera le suivant :

Application strutspersonne Application strutspersonne active ....

Ce fichier est plac dans le dossier de l'application strutspersonne/vues :

On peut le demander directement avec l'URL http://localhost:8080/strutspersonne/vues/main.html :

Struts par la pratique - Serge Tah, universit d'Angers

22/134

Ici, le contrleur Struts de l'application n'est pas intervenu puisqu'il n'intervient que si on demande l'URL de type *.do. Or ici, on a demand l'URL /vues/main.html. 6. Le fichier struts-config.xml construit prcdemment doit tre plac dans le mme dossier WEB-INF que le fichier web.xml :

7.

Nous allons maintenant vrifier le bon fonctionnement du contrleur de l'application strutspersonne en demandant l'URL /main.do aprs avoir, si ncessaire, relanc Tomcat.

Ici le contrleur Struts est intervenu puisque nous avons demand une URL de type *.do. Nous avons bien obtenu la page attendue (main.html). Nous avons donc les lments de base du fonctionnement de notre application : le contexte /strutspersonne, les fichiers de configuration web.xml et struts-config.xml, les bibliothques Struts. Que se serait-il pass si nous avions demand une URL de type /toto.do ? D'aprs le fichier web.xml de l'application strutspersonne, le contrleur Struts est alors appel pour la traiter. Celui-ci regarde alors son fichier de configuration strutsconfig.html et ne trouve aucune configuration pour l'URL /toto. Que fait-il alors ? Essayons :

Nous obtenons une page d'erreurs, ce qui semble normal.

Struts par la pratique - Serge Tah, universit d'Angers

23/134

II.5 Les fichiers de logs de TomcatParfois une application web dploye au sein de Tomcat choue dmarrer. La cause en est souvent un fichier web.xml incorrect. Pour exemple, introduisons une erreur dans le fichier web.xml de l'application prcdente : action org.apache.struts.action.ActionServlet config /WEB-INF/struts-config.xml action *.do

L'erreur introduite est dans la rgion encadre. On a oubli la barre / dans la balise de fermeture . Arrtons/redmarrons l'application /strutspersonne avec l'aide de [Tomcat-manager]. On obtient alors un message d'erreur :

Malheureusement, cette page ne donne aucune information sur la cause de l'erreur. Toute l'activit de Tomcat est enregistre dans des fichiers de logs mais o trouver ceux-ci ? L'outil [Configure] de Tomcat nous le dit :

Examinons le fichier \logs\stdout.log et notamment la fin de ce fichier qui contient les logs des activits les plus rcentes :.... 19 aot 2004 15:23:12 org.apache.catalina.core.StandardHostDeployer start INFO: standardHost.start /strutspersonne 19 aot 2004 15:23:12 org.apache.commons.digester.Digester fatalError GRAVE: Parse Fatal Error at line 14 column 7: The element type "param-name" must be terminated by the matching end-tag "". Struts par la pratique - Serge Tah, universit d'Angers

24/134

org.xml.sax.SAXParseException: The element type "param-name" must be terminated by the matching end-tag "". at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source) ... 19 aot 2004 15:23:12 org.apache.catalina.startup.ContextConfig applicationConfig GRAVE: S'est produite la ligne 14 colonne 7 19 aot 2004 15:23:12 org.apache.catalina.startup.ContextConfig start GRAVE: Cette application est marque comme non disponible suite aux erreurs prcdentes 19 aot 2004 15:23:12 org.apache.catalina.core.StandardContext start GRAVE: Error getConfigured 19 aot 2004 15:23:12 org.apache.catalina.core.StandardContext start GRAVE: Erreur de dmarrage du contexte suite aux erreurs prcdentes

L'erreur est clairement indique (encadr). Il faut donc songer examiner ce fichier de logs lorsqu'une application choue dmarrer. Il est bon galement d'utiliser un IDE capable de vrifier la bonne syntaxe d'un fichier XML. Par exemple l'IDE Jbuilder Foundation indique l'erreur prcdente :

Il est hautement souhaitable de travailler avec des IDE capables de vrifier la syntaxe de fichiers XML (Jbuilder, Eclipse, ...) afin d'viter des erreurs pas toujours faciles localiser.

Struts par la pratique - Serge Tah, universit d'Angers

25/134

III L'application /strutspersonneNous nous proposons d'introduire Struts avec une application simple qui nous permettra de dcouvrir les principaux mcanismes mis en oeuvre par une application Struts.

III.1 Le fonctionnement de l'applicationNous compltons maintenant l'application /strutspersonne dont nous avons initi l'criture dans le chapitre prcdent. Elle sera compose des lments suivants : d'une servlet main qui assurera la logique de l'application. de trois pages JSP : formulaire.personne.jsp, reponse.personne.jsp, erreurs.personne.jsp Le fonctionnement de l'application est le suivant. Elle est accessible l'adresse /strutspersonne/formulaire.do. A cette url, on obtient un formulaire fourni par la page formulaire.personne.jsp :

L'utilisateur remplit le formulaire et appuie sur le bouton [Envoyer] de type submit. Le bouton [Rtablir] est de type reset, c.a.d. qu'il remet le document dans l'tat o il a t reu. Le bouton [Effacer] est de type button. L'utilisateur doit fournir un nom et un ge valides. Si ce n'est pas le cas, une page d'erreurs lui est envoye au moyen de la page JSP erreurs.personne.jsp. Voici des exemples : Echange n 1demande rponse

Si on suit le lien [Retour au formulaire] on retrouve celui-ci dans l'tat o on l'a laiss :

Struts par la pratique - Serge Tah, universit d'Angers

26/134

Echange n 2demande rponse

Si l'utilisateur envoie des donnes correctes, l'application lui envoie une rponse au moyen de la page JSP reponse.personne.jsp. Echange n 1demande rponse

Si on suit le lien [Retour au formulaire] on retrouve celui-ci dans l'tat o on l'a laiss : Echange n 2demande rponse

III.2 L'architecture Struts de l'applicationNous adopterons l'architecture Struts suivante :

Struts par la pratique - Serge Tah, universit d'Angers

27/134

Client Interface client CONTRLEUR ActionServlet

Logique applicative FormulaireBean

Donnes

FormulaireAction formulaire.personne.jsp VUES reponse.personne.jsp erreurs.personne.jsp MODELE

il y aura trois vues le contrleur sera celui fourni par Struts FormulaireBean est la classe charge de mmoriser les valeurs du formulaire prsent par la vue formulaire.personne.jsp FormulaireAction est la classe charge de traiter les valeurs de FormulaireBean et d'indiquer la page rponse envoyer : o la vue erreurs.personne.jsp si les donnes du formulaire sont errones o la vue reponse.personne.jsp sinon Pour le dveloppeur, le travaille consiste crire le code : des trois vues du bean FormulaireBean associ au formulaire de la classe FormulaireAction charge de traiter le formulaire

III.3 Configuration de l'applicationL'arborescence du dossier de l'application /strutspersonne est la suivante :

\vues contiendra les vues de l'application \WEB-INF contiendra le fichier de configuration web.xml de l'application ainsi que le fichier strutsconfig.xml de configuration de Struts. Le fichier web.xml est celui dj rencontr et expliqu :Struts par la pratique - Serge Tah, universit d'Angers

28/134

action org.apache.struts.action.ActionServlet config /WEB-INF/struts-config.xml action *.do

Le fichier struts-config.xml de dpart sera celui utilis dans la version prcdente :

\WEB-INF\classes contiendra les classes de l'application ainsi que le fichier des messages \WEB-INF\lib contiendra les bibliothques .jar ncessaires l'application. Ces .jar sont pris dans \lib. Ce sera ainsi dans tous les exemples venir. Le fichier \WEB-INF\web.xml est le suivant : Nous dcouvrirons les autres fichiers de l'arborescence au fur et mesure de l'criture de l'application.

III.4 Les vues de l'application /strutspersonneLes trois vues de l'application sont les suivantes : formulaire.personne.jsp : affiche le formulaire de saisie des nom et ge d'une personne reponse.personne.jsp : affiche les valeurs saisies si elles sont valides erreurs.personne.jsp : affiche les erreurs s'il y en a

III.4.1 La vue erreurs.personne.jspCette vue qui affiche une liste d'erreurs sera dfinie comme suit : Personne Les erreurs suivantes se sont produites Retour au formulaire

Il y a deux nouveauts dans ce code : 1. la prsence de balisee qui ne sont pas des balise HTML. On peut en effet crer des bibiothques de balises JSP qui lors de la transformation de la page JSP en servlet sont transformes en code Java. Struts par la pratique - Serge Tah, universit d'Angers 29/134

2.

la page JSP doit dclarer les bibliothques de balises qu'elle utilise. Elle le fait ici avec la ligne

Cette ligne donne deux informations : uri : l'emplacement du fichier rgissant les rgles d'utilisation de la bibliothque. Le fichier struts-html.tld est fourni dans la distribution de Struts. On le placera, dans l'exemple ci-dessus, dans le dossier WEB-INF. prefix : l'identificateur utilis dans le code pour prfixer les balises de la bibliothque. Cela permet d'viter les conflits de noms qui pourraient survenir lors de l'utilisation simultane de plusieurs bibliothques de balises. Il serait possible de trouver deux balises de mme nom dans deux bibliothques diffrentes. En donnant un prfixe diffrent chaque bibliothque, on supprime toute ambigut. la balise affiche la liste d'erreurs que le contrleur Struts lui tansmet. la balise gnre un lien pointant sur /C/page o C est le contexte de l'application page est l'URL indique dans l'attribut page de la balise Le balise Retour au formulaire

gnrera le code HTML suivant :Retour au formulaire

o C est le contexte de l'application

III.4.2 Test de la vue erreurs.personne.jsple fichier erreurs.personne.jsp est plac dans le dossier vues de l'application strutspersonne :

le fichier struts-html.tld est pris dans la distribution struts (/lib) et plac dans WEB-INF :

le fichier struts-config.xml est modifi de la faon suivante : Struts par la pratique - Serge Tah, universit d'Angers

30/134

Nous crons dans le fichier de configuration une nouvelle URL /erreurs destine tre traite par le contrleur struts. L'URL /erreurs.do sera redirige vers la vue /vues/erreurs.personne.jsp. Le fichier struts-config.xml est plac dans le dossier WEB-INF. nous rinitialisons l'application pour que le nouveau fichier struts-config.xml soit pris en compte. Pour cela, on s'aidera de la page web de gestion de Tomcat [Tomcat Manager] dj prsente et qui liste les applications dployes dans Tomcat :

Pour rinitialiser l'application [/strutspersonne], nous utilisons le lien [Recharger] de la ligne dfinissant l'application. Dans certains cas, comme une modification du fichier web.xml, un rechargement ne suffit pas. Il faut alors utiliser les liens [Arrter] et [Redmarrer] pour rinitialiser l'application. puis nous demandons l'url http://localhost:8080/strutspersonne/erreurs.do :

La balise n'a rien produit. C'est normal, l'action ForwardAction n'a pas gnr la liste d'erreurs attendue par la balise. Nanmoins, la rponse ci-dessus montre que notre vue JSP est au moins syntaxiquement correcte sinon nous aurions obtenu une page d'erreurs. Vrifions le code HTML reu par le navigateur (View/Source) : Personne - erreurs Les erreurs suivantes se sont produites Retour au formulaire

On notera le lien produit par la balise . Le contexte /strutspersonne a t automatiquement inclus dans le lien. Cela permet de dplacer l'application d'un contexte un autre (changement de machine par exemple) sans avoir changer les liens gnrs par .

III.4.3 La vue reponse.personne.jspCette vue qui confirme les valeurs saisies dans le formulaire est la suivante : serveur), le champ du bean prendra la valeur du champ de saisie. A l'affichage du formulaire (serveur -> client), la valeur contenue dans le champ du bean est affiche dans la zone de saisie.

html:submit html:reset html:button

sert gnrer la balise HTML sert gnrer la balise HTML sert gnrer la balise HTML

III.4.6 Le bean associ au formulaire formulaire.personne.jspAvec Struts, tout formulaire doit tre associ un bean charg de mmoriser les valeurs du formulaire et de conserver celles-ci dans la session courante. Un bean est une classe Java qui doit respecter une syntaxe particulire. Le bean associ un formulaire doit driver de la classe ActionForm dfinie dans les bibliothques de Struts :public class FormulaireBean extends ActionForm {

les noms des attributs du bean doivent correspondre aux champs du formulaire (attributs property des balises html:text du formulaire). D'aprs le code du formulaire prcdent, le bean doit donc avoir deux champs appels nom et age. pour chaque champ unChamp du formulaire, le bean doit dfinir deux mthodes : o public void setUnChamp(Type valeur) : pour affecter une valeur l'attribut unChamp o Type getUnChamp() : pour obtenir la valeur du champ unChamp On notera la syntaxe particulires des mthodes get et set. La premire lettre du nom de l'attribut unChamp est une minuscule. Les mthodes get et set transforment cette premire lettre en majuscule. Le bean associ au formulaire prcdent pourrait tre le suivant :package istia.st.struts.personne; import org.apache.struts.action.ActionForm; public class FormulaireBean extends ActionForm { // nom private String nom = null; public String getNom() { return nom; } public void setNom(String nom) { this.nom = nom; } // age private String age = null; public String getAge() { return age; } public void setAge(String age) { this.age = age; } } Struts par la pratique - Serge Tah, universit d'Angers

34/134

On compilera cette classe.

III.4.7 Compiler les classes ncessaires l'application Struts

III.4.7.1 JBuilderPour compiler les classes ncessaires notre application, nous utiliserons dans les exemples qui suivent, Jbuilder Personal Edition, un IDE renomm rcemment Jbuilder Foundation et disponible gratuitement l'URL http://www.borland.com/jbuilder. N'importe quel IDE convient et le lecteur est invit utiliser son IDE habituel. L'IDE travaille avec un JDK dans lequel ne se trouvent normalement pas les classes ncessaires aux applications Struts. C'est le cas de JBuilder. On pourra ajouter les archives .jar de Struts la liste des .jar explors par le JDK lors de la compilation de la faon suivante. Dans le menu de JBuilder X :

JBuilderX vient avec un certain nombre de bibliothques, chacune d'elles comportant une ou plusieurs archives .jar. Ainsi ci-dessus, la bibliothque [Ant] comporte les archives suivantes :

On peut ainsi dcouvrir que JbuilderX est fourni avec la bibliothque Struts 1.1 :

Struts par la pratique - Serge Tah, universit d'Angers

35/134

JBuilder Foundation ne dispose pas des archives permettant la compilation des servlets. Aussi allons-nous crer une nouvelle bibliothque que nous appellerons Tomcat. Pour cela, nous utilisons le bouton [Nouveau] permettant de crer une nouvelle bibliothque d'archives :

nous appelons cette nouvelle bibliothque Tomcat puisqu'elle utilise les archives amenes par cette application la visibilit de la bibliothque sera [Jbuilder]. Cela signifie que cette bibliothque sera disponible toutes les applications construites avec JBuilder nous utilisons le bouton [Ajouter] pour aller dsigner le dossier \common\lib qui contient les .jar de Tomcat et notamment servlet-api.jar qui permet la compilation des servlets. Il suffit de dsigner le dossier. Tous les .jar qui y sont seront automatiquement ajouts la bibliothque en cours de cration. Une fois l'opration valide par [OK], nous disposons d'une nouvelle bibliothque :

Struts par la pratique - Serge Tah, universit d'Angers

36/134

Si la bibliothque Struts n'avait pas t prsente, on l'aurait ajouter de faon analogue en incluant les archives du dossier \lib. Pour chaque projet Jbuilder devant utiliser les bibliothques Tomcat et Struts, nous procderons de la faon suivante : modifier les proprits du projet :

ajouter les bibliothques [Struts] et [Tomcat] au projet :

Struts par la pratique - Serge Tah, universit d'Angers

37/134

Les classes produites par la compilation doivent tre places dans le dossier WEB-INF\classes de l'application. Nous pouvons indiquer JBuilderX o placer les .class produits par la compilation. C'est le champ [Chemin de sortie] de l'cran ci-dessus. Ici, nous avons indiqu de placer les .class dans le dossier WEB-INF\classes de l'application. Ceci fait, nous pouvons compiler la classe FormulaireBean puis procder au test de la vue formulaire.personne.jsp.

III.4.8 Test de la vue formulaire.personne.jspLe fichier formulaire.personne.jsp est plac dans le dossier vues de l'application strutspersonne :

le fichier struts-config.xml est modifi de la faon suivante :

Nous crons dans le fichier de configuration une nouvelle URL /formulaire destine tre traite par le contrleur struts. L'URL /formulaire.do sera redirige vers la vue /vues/formulaire.personne.jsp. Le fichier struts-config.xml est plac dans le dossier WEB-INF.Struts par la pratique - Serge Tah, universit d'Angers

38/134

nous plaons la classe FormulaireBean dans WEB-INF/classes/istia.st.struts.personne :

nous rinitialisons l'application [Arrter-Dmarrer] pour que le nouveau fichier struts-config.xml soit pris en compte, puis nous demandons l'url http://localhost:8080/strutspersonne/formulaire.do :

Nous obtenons bien le formulaire. Nous pouvons avoir la curiosit de regarder comment ont t "traduites" les balises qui parsemaient le code JSP du formulaire : Personne - formulaire function effacer(){ with(document.frmPersonne){ nom.value=""; age.value=""; } } Personne - formulaire Nom Age Struts par la pratique - Serge Tah, universit d'Angers

39/134

Dans le formulaire obtenu, les boutons |Rtablir] et [Effacer] fonctionnent. Le bouton [Envoyer] de type submit renvoie l'URL /strutspersonne/main.do. D'aprs le fichier web.xml de l'application, le contrleur Struts va la prendre en charge. D'aprs le fichier struts-config.html, le contrleur doit rediriger la requte vers la vue /vues/main.html. Essayons :

Tout se passe comme attendu. Il nous reste traiter vritablement les valeurs du formulaire, c.a.d. crire la classe de type Action qui va recevoir les donnes du formulaire dans un objet FormulaireBean que le contrleur va lui passer.

III.5 Traitement du formulaire par le contrleurNous nous intressons maintenant au traitement des valeurs du formulaire par le contrleur lorsque l'utilisateur va appuyer sur le bouton [Envoyer] du formulaire.

III.5.1 Le fichier struts-config.xmlLe nouveau fichier de configuration struts-config.xml du contrleur Struts devient le suivant : Struts par la pratique - Serge Tah, universit d'Angers

40/134

Nous avons mis en relief les changements : une section apparat. Elle sert dfinir les classes associes chacun des formulaire de l'application. Il doit y avoir autant de balises que de formulaires diffrents dans l'application. Ici, nous n'avons qu'un formulaire donc une seule section . Pour chaque formulaire, nous devons dfinir : o son nom (attribut name) o le nom de la classe drive de ActionForm charge de stocker les valeurs du formulaire (attribut type) Ces deux attributs ne peuvent tre quelconques. Ils doivent tre identiques ceux utiliss dans la balise du code HTML du formulaire. Rappelons celle-ci pour le formulaire (nom, age) :

Le formulaire doit tre dclar de la mme faon dans le fichier struts-config.html. C'est ce qui est fait ici :

la configuration de l'action /main a chang. Celle-ci est charge de traiter les valeurs du formulaire. Aussi doit-on donner les informations dont elle a besoin sur celui-ci :

La servlet /main va traiter un formulaire dont il faut lui donner le nom. C'est l'attribut name qui fait ce travail. Ce nom doit rfrencer l'attribut name de l'une des sections , ici frmPersonne. L'attribut scope="session" indique que les valeurs du formulaire doivent tre stockes dans la session. Ce n'est pas toujours ncessaire. Ici, a l'est. En effet, nous trouvons dans les vues /reponse.do et /erreurs.do des liens ramenant au formulaire. Dans les deux cas, nous voulons afficher le formulaire avec les valeurs saisies par l'utilisateur lors d'un prcdent change client-serveur. D'o la ncessit de stocker le formulaire dans la session. L'attribut validate indique si la mthode validate de l'objet frmPersonne doit tre appele ou non. Cette mthode sert vrifier la validit des donnes du formulaire. Ici, nous indiquons que les donnes doivent tre vrifies ce qui implique que nous aurons crire une mthode validate dans la classe FormulaireBean. La mthode validate du formulaire est appele par le contrleur Struts avant que la servlet /main soit appele. Elle rend comme rsultat un objet de type ActionErrors qui est analogue une liste d'erreurs. Si cette liste existe et est non vide, le contrleur Struts s'arrtera l et enverra comme rponse, la vue indique par l'attribut input. La vue recevra dans la requte la liste ActionErrors qu'elle pourra afficher avec la balise . Ci-dessus, nous disons qu'en cas d'erreurs, la servlet /main doit envoyer la vue /erreurs.do. Rappelons que cette vue est associe l'URL /vues/erreurs.reponse.jsp suivante : Personne Les erreurs suivantes se sont produites Retour au formulaire

La vue utilise bien la balise qui permettra d'afficher la liste des erreurs. Dans cette liste d'erreurs, on trouve non pas des messages d'erreurs mais des identifiants de messages prsents dans le fichier rfrenc par la balise (attention : resources avec un seul s) du fichier struts-config.xml :Struts par la pratique - Serge Tah, universit d'Angers

41/134

La balise ci-dessous indique que le fichier contenant les messages utiliss par l'application se trouve dans le fichier WEBINF/classes/ressources/personneressources.properties :

Que trouve-t-on dans ce fichier ? C'est un fichier de proprits correspondant la classe Properties de Java, c'est dire un ensemble de lignes cl=valeur :personne.formulaire.nom.vide=Vous devez indiquer un nom personne.formulaire.age.vide=Vous devez indiquer un age personne.formulaire.age.incorrect=L'ge [{0}] est incorrect errors.header=

  • errors.footer=

Ce fichier de messages a au moins deux fonctions : - il permet de changer les messages de l'application sans avoir recompiler celle-ci - il permet l'internationalisation des applications Struts. On peut en effet crer plusieurs fichiers de ressources, un par langue. Struts utilisera automatiquement le bon fichier de messages condition de respecter certaines normes dans le nommage de ces fichiers. Si la mthode validate du formulaire rend une liste d'erreurs vide, alors le constrleur Struts appelle la mthode execute de la servlet ForwardAction. Il est important de comprendre ici que lorsque la mthode execute de la servlet s'excute c'est que les donnes du formulaire ont t considres comme valides (si bien sr elles ont t vrifies par validate="true"). C'est dans la mthode execute de la servlet associe l'action, que le dveloppeur traite rellement le formulaire. C'est l que va se trouver le coeur du traitement (logique applicative, utilisation de classes mtier et de classes d'accs aux donnes). Au final, la mthode rend un rsultat de type ActionForward qui indique au contrleur quelle vue doit tre envoye en rponse au client. Ici nous avons utilis l'action prdfinie ForwardAction de Struts. Sa mthode execute se contente de rendre un ActionForward pointant sur l'URL indique par l'attrinut parameter :

Si donc, les donnes du formulaire sont valides alors l'action /main renverra la vue /vues/main.html que nous avons dj utilise.

III.5.2 La nouvelle classe FormulaireBeanNous avons dj cr une premire version de la classe FormulaireBean charge de mmoriser les donne (nom,age) du formulaire formulaire.personne.jsp. Cette version ne vrifiait pas la validit des donnes. Maintenant, nous devons le faire puisque nous avons indiqu dans le fichier struts-config.xml que les donnes du formulaire devaient tre vrifies (validate="true") avant d'tre transmises la servlet ForwardAction. Le code de la classe FormulaireBean devient le suivant :package istia.st.struts.personne; import javax.servlet.http.*; import org.apache.struts.action.*; public class FormulaireBean extends ActionForm { // nom private String nom = null; public String getNom() { return nom; } public void setNom(String nom) { this.nom = nom; } // age private String age = null; Struts par la pratique - Serge Tah, universit d'Angers

42/134

public String getAge() { return age; } public void setAge(String age) { this.age = age; } // validation public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) { // gestion des erreurs ActionErrors erreurs = new ActionErrors(); // le nom doit tre non vide if (nom == null || nom.trim().equals("")) { erreurs.add("nomvide", new ActionError("personne.formulaire.nom.vide")); // l'ge doit tre un entier positif } if (age == null || age.trim().equals("")) { erreurs.add("agevide", new ActionError("personne.formulaire.age.vide")); } else { // l'ge doit tre un entier positif if (!age.matches("^\\s*\\d+\\s*$")) { erreurs.add("ageincorrect", new ActionError("personne.formulaire.age.incorrect", age)); // on rend la liste des erreurs } } //if // on rend la liste d'erreurs return erreurs; } }

La nouveaut rside dans l'criture de la mthode validate. Celle-ci est appele par le contrleur Struts aprs que celui-ci ait mis dans les attributs nom et age de la classe, les valeurs des champs du formulaire de mme nom. Elle doit vrifier la validit des attributs nom et age. Le code ci-dessus est assez simple comprendre : - une liste d'erreurs (ActionErrors erreurs) vide est cre - le champ nom est vrifi. S'il est vide, une erreur est ajoute la liste erreurs l'aide de la mthode ActionErrors.add("cl", ActionError). - on fait de mme si le champ age n'est pas un nombre entier positif. - la mthode validate rend au contrleur Struts la liste d'erreurs (ActionErrors erreurs). Si erreurs est gal null ou si erreurs.size() est gal 0, le contrleur considre qu'il n'y a pas eu d'erreurs. Il fera alors excuter la mthode execute de la classe Action associe l'action (type="org.apache.struts.actions.ForwardAction"). Sinon, il renverra la vue associe au cas d'erreurs dans le formulaire (input="/erreurs.do"). On ajoute une erreur la liste ActionErrors erreurs par ActionErrors.add("clErreur", new ActionError("clMessage"[,param0, param1, param2, param3])). Le premier paramtre "clErreur" sert dsigner de faon unique un lment ActionError dans la liste ActionErrors, un peu comme dans un dictionnaire. Il peut tre quelconque. ActionError est un objet qu'on associe un message d'erreur l'aide de son constructeur ActionError(String clMessage[,String param0, String param1, String param2, String param3]) o clMessage est l'identifiant du message associ l'erreur et parami jusqu' 4 paramtres facultatifs. L'identifiant clMessage n'est pas quelconque. C'est l'un des identifiants que l'on trouve dans le fichier dsign par la balise du fichier struts-config.xml :

Rappelons que ce fichier (en ralit WEB-INF/classes/ressources/personneressources.properties) contient les cls suivantes :personne.formulaire.nom.vide=Vous devez indiquer un nom personne.formulaire.age.vide=Vous devez indiquer un age personne.formulaire.age.incorrect=L'ge [{0}] est incorrect errors.header=

  • errors.footer=

On peut vrifier que les cls de messages utilises par la mthode validate de la classe FormulaireBean existent bien dans le fichier ci-dessus. On a utilis la balise HTML pour chaque message d'erreur afin que la balise les affiche comme une liste HTML. Nous avons vu que l'objet ActionError pouvait tre non seulement contruit avec une cl de message mais avec des paramtres supplmentaires :public ActionError(String clMessage[,String param0, String param1, String param2, String param3])

Si un ActionError a t construit avec des paramtres parami supplmentaires (jusqu' quatre au maximum), ceux-ci sont accessibles dans le texte du message via la notation {0} {3}. Ainsi, la mthode validate de FormulaireBean construit un ActionError avec la cl personne.formulaire.age.incorrect et le paramtre supplmentaire param0 age :Struts par la pratique - Serge Tah, universit d'Angers

43/134

erreurs.add("age", new ActionError("personne.formulaire.age.incorrect",age));

Le message associ, dans le fichier .properties des messages, la cl personne.formulaire.age.incorrect estpersonne.formulaire.age.incorrect=L'ge [{0}] est incorrect

Le {0} sera remplac par la valeur de l'ge. Enfin les messages ayant les cls errors.header et errors.footer seront crits respectivement avant et aprs la liste des erreurs. Ici, ces deux cls serviront inclure les balises HTML

  • et

qui doivent entourer les balises .

III.6 Les tests de validit du formulaireNous sommes prts pour les tests de validit du formulaire. Nous rappelons ci-dessous o doivent tre placs les diffrents composants de l'application :les vues

les fichiers de configuration

le fichier des messages

les classes

III.6.1 Test 1Relanons Tomcat pour qu'il lise les nouveaux http://localhost:8080/strutspersonne/formulaire.do : fichiers de configuration puis demandons l'URL

Struts par la pratique - Serge Tah, universit d'Angers

44/134

Explications : - dans struts-config.html la section suivante a t exploite :

Si nous visualisons le code HTML de la page reue nous voyons que la balise de la page est la suivante :

Le bouton [Envoyer] qui est de type submit enverra donc les donnes du formulaire l'URL /strutspersonne/main.do.

III.6.2 Test 2Utilisons le bouton [Envoyer] en laissant vides les champs de saisie. Nous obtenons la rponse suivante :

Explications : comme indiqu plus haut, les donnes du formulaire ont t envoyes l'URL /strutspersonne/main.do. Les sections suivantes du fichier struts-config.xml ont alors t utilises :

....

-

aprs envoi du formulaire au contrleur l'URL /main.do, celui-ci a construit ou recycl un objet frmPersonne de type FormulaireBean et y a mis les valeurs du formulaire la mthode validate de l' objet frmPersonne a t appele. Les donnes tant valides, la mthode validate a rendu une liste ActionErrors vide. un objet FormulaireAction a t cr ou recycl et sa mthode execute appele. Celle-ci a rendu un objet ActionForward avec la cl "reponse". le contrleur a alors envoy la vue associe la cl reponse, c.a.d. /reponse.do et donc /vues/reponse.personne.jsp. la vue reponse.personne.jsp s'est affiche avec les valeurs mises dans la requte par la mthode execute de l'objet FormulaireAction.

III.10 ConclusionNous avons construit une application complte mais simple. Lorsqu'on la met en oeuvre, on a de nombreuses occasions de faire des erreurs, notamment dans les fichiers XML de configuration de l'application. De prime abord, il peut paratre plus simple de construire cette application sans Struts avec une servlet et des pages JSP. Pour le dbutant c'est probablement vrai. Au fil de l'exprience il devient plus simple de dvelopper avec Struts. De nombreuses entreprises imposent la mthodologie Struts pour leurs dveloppements web pour les raisons suivantes : Struts respecte le modle MVC lorsque tous les dveloppeurs travaillent de la mme faon, la maintenance des applications devient plus simple parce qu'elles ont une architecture standard.

Struts par la pratique - Serge Tah, universit d'Angers

54/134

IV Les formulaires dynamiquesIV.1 Dclaration du formulaire dynamiqueNous avons vu que Struts utilisait des objets ActionForm pour stocker les valeurs des formulaires HTML traites par les diffrentes servlets de l'application. Pour chaque formulaire de notre application, il nous faut construire une classe drive de ActionForm. Ceci peut devenir vite assez lourd puisque pour chaque champ xx, il nout crire deux mthodes setXx et getXx. Struts nous offre la possibilit d'utiliser des formulaires dont la structure est dclare dans le fichier struts-config.xml dans la section qui sont crs dynamiquement par l'environnement Struts selon la structure dclare Ainsi la classe utilise pour stocker les valeurs nom et age de l'application strutspersonne pourrait tre dfinie comme suit :

Pour chaque champ du formulaire on dfinit une balise avec deux attributs : name : le nom du champ type : son type java Parce que les valeurs d'un formulaire envoyes par un client web sont des chanes de caractres, les types les plus usits sont java.lang.String pour les champs valeur unique et java.lang.String[] pour les champs valeurs multiples (botes cocher portant le mme nom, listes slection multiple, ...). La classe DynactionForm comme la classe ActionForm a une mthode validate qui ne fait rien. Pour lui faire vrifier la validit des paramtres du formulaire, il faut la driver et crire soi-mme la mthode validate. C'est ce que nous ferons ici. La dclaration du formulaire sera la suivante :

La classe istia.st.struts.personne.PersonneDynaForm devra tre crite par nos soins.

IV.2 criture de la classe DynaActionForm associe au formulaire dynamiqueCi-dessus, nous avons associ la classe istia.st.struts.personne.PersonneDynaForm au formulaire (nom,age). Nous crivons maintenant cette classe :package istia.st.struts.personne; import javax.servlet.http.*; import org.apache.struts.action.*; public class PersonneDynaForm extends DynaActionForm { // validation public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) { // gestion des erreurs ActionErrors erreurs = new ActionErrors(); // le nom doit tre non vide String nom = (String)this.get("nom"); if (nom == null || nom.trim().equals("")) { erreurs.add("nomvide", new ActionError("personne.formulaire.nom.vide")); } // l'ge doit tre non vide String age = (String)this.get("age"); if (age == null || age.trim().equals("")) { erreurs.add("agevide", new ActionError("personne.formulaire.age.vide")); } else { // l'ge doit tre un entier positif if (!age.matches("^\\s*\\d+\\s*$")) { erreurs.add("ageincorrect", new ActionError("personne.formulaire.age.incorrect", age)); // on rend la liste des erreurs } Struts par la pratique - Serge Tah, universit d'Angers

55/134

} //if // on rend la liste d'erreurs return erreurs; } }//classe

Les points noter sont les suivants : la classe drive de DynaActionForm la mthode validate de la classe DynaActionForm a t rcrite. Lorsqu'elle est excute par le contrleur Struts, l'objet PersonneDynaForm a t construit. Il contient un dictionnaire ayant pour cls les champs du formulaire nom et age et pour valeurs les valeurs de ces champs. Pour avoir accs un champ au sein des mthodes de DynaActionForm on utilise la mthode Object get(String nomDuChamp). Si on veut fixer une valeur un champ, on pourra utiliser la mthode void set(String nomDuChamp, Object valeur). On se reportera la dfinition de la classe DynaActionForm pour daavantage de prcisions. une fois rcupres les valeurs des champs nom et age du formulaire, la mthode validate ne diffre pas de celle qui avait t crite lorsque le formulaire tait associ un objet ActionForm.

IV.3 La nouvelle classe FormulaireActionLe fichier de configuration dfinit l'action /main suivante :... ....

Cette dfinition est la mme que dans l'application strutspersonne. L'action /main est ralise par un objet de type FormulaireAction. Cet objet reevait les valeurs du formulaire frmPersonne dans un objet de type FormulaireBean. Maintenant il les reoit dans un objet de type PersonneDynaForm. Il nous faut crire cette nouvelle classe :package istia.st.struts.personne; import import import import import import import import import org.apache.struts.action.Action; org.apache.struts.action.ActionMapping; org.apache.struts.action.ActionForm; org.apache.struts.action.ActionForward; javax.servlet.http.HttpServletRequest; javax.servlet.http.HttpServletResponse; java.io.IOException; javax.servlet.ServletException; istia.st.struts.personne.PersonneDynaForm;

public class FormulaireAction extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException,ServletException { // on a un formulaire valide, sinon on ne serait pas arriv l PersonneDynaForm formulaire=(PersonneDynaForm)form; request.setAttribute("nom",formulaire.get("nom")); request.setAttribute("age",formulaire.get("age")); return mapping.findForward("reponse"); }//execute }

Les points noter sont les suivants : nous devons importer la classe PersonneDynaForm qui contient les donnes du formulaire pour avoir accs sa dfinition la mthode execute rcupre la valeur des paramtres du formulaire avec la mthode [DynaActionForm].get.Struts par la pratique - Serge Tah, universit d'Angers

56/134

Vis vis de la classe FormulaireAction de l'application strutspersonne, seule la faon d'accder aux valeurs du formulaire a chang.

IV.4 Dploiement et test de l'application strutspersonne1IV.4.1 Cration du contexteNous appelerons strutspersonne1 cette nouvelle application. Nous la dployons dans Tomcat de la faon suivante (page Tomcat Manager) :

Ce dploiement donne naissance au fichier strutspersonne1.xml dans \conf\Catalina\localhost :

Le contenu de ce fichier est le suivant :

On peut vrifier la validit du contexte en demandant l'URL http://localhost:8080/strutspersonne1/

Struts par la pratique - Serge Tah, universit d'Angers

57/134

IV.4.2 Les vuesOn copiera le dossier vues de l'application strutspersonne dans le dossier de l'application strutspersonne1. En effet, les vues n'ont pas chang.

IV.4.3 Compilation des classesNous avons deux classes crer : PersonneDynaForm et FormulaireAction, la dernire utilisant la premire. On les compilera avec un IDE quelconque sans oublier d'ajouter les archives de Struts et Tomcat celles explores par le compilateur de l'IDE (cf les exemples du chapitre prcdent).

IV.4.4 Le dossier WEB-INFOn copiera le dossier WEB-INF de l'application strutspersonne dans le dossier de l'application strutspersonne1. Quelques fichiers changent :

Le fichier de configuration struts-config.xml devient le suivant : Formulaire Struts bouton radio Oui Non Cases cocher 1 2 3 Champ de saisie Mot de passe Bote de saisie multilignes Combo Liste slection unique Liste slection multiple
Envoyer

Struts par la pratique - Serge Tah, universit d'Angers

84/134

Cette page JSP utilise des balises provenant de la bibliothque struts-html. Rappelons que pour utiliser une bibliothque de balises, il faut : placer le code de cette bibliothque quelque part dans l'arborescence de l'application, ici WEB-INF/struts-html.tld dclarer l'utilisation de cette bibliothque au dbut des pages JSP qui l'utilisent :

La vue formulaire.jsp utilise des balises que nous allons maintenant expliquer. Pour bien comprendre le fonctonnement de cellesci, il faut se rappeler que le bean dynaFormulaire s'utilise la fois en lecture et criture et qu'il en est de mme des balises dela vue formulaire.jsp associes aux diffrents champs de dynaFormulaire : Ecriture dynaFormulaire vue formulaire.jsp Lecture Lorsque le client demande l'url /init.do ou /affiche.do, la vue formulaire.jsp est envoye. Son contenu provient des champs du bean dynaFormulaire. Lorsque le client clique sur le bouton [Envoyer] du formulaire, le navigateur "poste" alors le formulaire HTML l'action /confirmation. Nous avons dj expliqu ce qui se passait alors et notamment que les champs de dynaFormulaire allaient recevoir les valeurs des champs de mme nom prsents dans la requte HTTP du client. Le comportement en lecture/criture des diffrentes balises du formulaire sont expliques ci-dessous : traduction HTML pour l'opration de lecture submit pour celle d'criturebalise traduction HTML explication

la balise html:rewrite permet de s'affranchir du nom de l'application dans des URL. Elle a un attribut :page

URL rcrire

Ainsi ci-dessus, si on dcide d'appeler l'application formulaire3, le code de l'attribut background n'a pas tre rcrit. La balise html:rewrite gnrera le nouveau code HTML background="/formulaire3/images/standard.jpg"

balise traduction HTML explication

la balise html:form permet de gnrer la balise HTML form. Elle a plusieurs attributs :action name

type

action Struts laquelle doit tre post le formulaire - doit correspondre l'une des actions dfinies dans struts-config.xml facultatif - nom du bean ActionForm ou driv dans lequel devront tre places ou lues les valeurs du formulaire post. En l'absence de cet attribut, c'est le formulaire associ l'action dfinie par l'attribut action qui est utilis. Cette information est trouve dans le fichier de configuration (attribut name de l'action). facultatif - classe Java instancier pour le formulaire. En l'absence de cet attribut, c'est la classe associe l'action dfinie par l'attribut action qui est utilise. Cette information est trouve dans le fichier de configuration (attribut type de l'action).

On voit que par dfaut, le code HTML gnr utilise la mthode POST. Dans ce mme code HTML, l'URL de l'action a t rcrite pour tre prfixe par le nom de l'application et suffixe par .do.

Oui Non traduction HTML Si le champ opt de dynaFormulaire vaut "oui", gnre le code HTML Oui Non explication la balise html:radio sert gnrer la balise HTML . Elle admet divers attributs : Struts par la pratique - Serge Tah, universit d'Angers 85/134balise

name

property value

facultatif - nom du bean ActionForm ou driv dans lequel devra tre place ou lue la valeur du champ. En l'absence de cet attribut, c'est le formulaire associ la balise qui est utilis. nom du champ du bean formulaire associ au bouton radio en lecture et criture. valeur donner au champ HTML lorsqu'il sera post

submit

Le texte entre la balise de dbut et de fin est le texte qui sera affich ct du bouton radio. le champ value du bouton radio coch est affect au champ opt de dynaFormulaire

balise

traduction HTML

explication

1 2 3 Si les champs chk1 et chk3 de dynaFormulaire valent "on" et si le champ chk2 vaut "off", gnre le code HTML 1 2 3 la balise html:checkbox sert gnrer la balise HTML . Elle admet divers attributs :name

property value

facultatif - nom du bean ActionForm ou driv dans lequel devra tre place ou lue la valeur du champ. En l'absence de cet attribut, c'est le formulaire associ la balise qui est utilis. nom du champ du bean formulaire associ la case cocher en lecture et criture. valeur donner au champ HTML lorsqu'il sera post

submit

Le texte entre la balise de dbut et de fin est le texte qui sera affich ct de la case cocher. Le champ chk1 de dynaFormulaire recevra la valeur du champ value du champ HTML chk1 si celui-ci est post, sinon il gardera sa valeur courante. Le champ HTML chk1 n'est post que s'il est coch par l'utilisateur.

balise traduction HTML explication

Si le champ champSaisie vaut "ceci est un essai", gnre le code HTML la balise html:text sert gnrer la balise HTML . Elle admet divers attributs : facultatif - nom du bean ActionForm ou driv dans lequel devra tre place ou lue la valeur du champ. En l'absence de cet attribut, c'est le formulaire associ la balise qui est utilis. property nom du champ du bean formulaire associ au champ de saisie en lecture et criture. Le texte saisi par l'utilisateur dans le champ HTML champSaisie est affect au champ champSaisie du bean dynaFormulaire.name

submit

balise traduction HTML explication

Si le champ mdp vaut "azerty", gnre le code HTML la balise html:password sert gnrer la balise HTML . Elle admet divers attributs : facultatif - nom du bean ActionForm ou driv dans lequel devra tre place ou lue la valeur du champ. En l'absence de cet attribut, c'est le formulaire associ la balise qui est utilis. property nom du champ du bean formulaire associ au champ mot de passe en lecture et criture. Le texte saisi par l'utilisateur dans le champ HTML mdp est affect au champ mdp du bean dynaFormulaire.name

submit

balise traduction HTML

explication

Si le champ boiteSaisie vaut "ligne1\r\nligne2\r\n", gnre le code HTML ligne1 ligne2 la balise html:textarea sert gnrer la balise HTML .... Elle admet divers attributs : 86/134

Struts par la pratique - Serge Tah, universit d'Angers

submit

facultatif - nom du bean ActionForm ou driv dans lequel devra tre place ou lue la valeur du champ. En l'absence de cet attribut, c'est le formulaire associ la balise qui est utilis. property nom du champ du bean formulaire associ au champ de saisie en lecture et criture. Le texte saisi par l'utilisateur dans le champ HTML textarea est affect au champ textarea du bean dynaFormulaire.name

balise

traduction HTML

explication

Si le champ combo vaut "combo2", gnre le code HTML combo0 combo1 combo2 combo3 combo4 la balise html:select sert gnrer la balise HTML .... Elle admet divers attributs :name

property

facultatif - nom du bean ActionForm ou driv dans lequel devra tre place ou lue la valeur du champ. En l'absence de cet attribut, c'est le formulaire associ la balise qui est utilis. nom du champ du bean formulaire associ au champ de saisie en lecture et criture.

la balise html:options sert gnrer les balises HTML ... l'intrieur d'une balise HTML . Il y a diverses faons de prciser comment trouver les valeurs de remplissage du select. Ici, nous avons utilis les attributs name et property : facultatif - nom du bean contenant les valeurs des diffrentes options. En l'absence de cet attribut, c'est le formulaire associ la balise qui est utilis. property nom du champ du bean formulaire qui contient les valeurs des options du select. Ce doit tre un tableau de chanes de caractres. Le champ combo du bean dynaFormulaire reoit la valeur de l'option slectionne par l'utilisateur dans le combo HTML combo. Cette valeur dpend de la forme de l'option slectionne : YY : la valeur de l'option est XX YY : la valeur de l'option est YYname

submit

balise

traduction HTML

explication submit

Si le champ listeSimple vaut "simple1", gnre le code HTML simple0 simple1 simple2 ... les mmes que pour le combo reoit la valeur de l'option slectionne par l'utilisateur dans la liste HTML listeSimple. A la diffrence du combo, un utilisateur peut ne slectionner aucune option. Dans ce cas, le client n'envoie pas le paramtre listeSimple dans sa requte HTTP au serveur. Le champ listeSimple de dynaFormulaire garde alors sa valeur prcdente. Si le champ listeMultiple est le tableau {"multiple0","multiple2"}, gnre le code HTML multiple0 multiple1 multiple2 multiple3 ... 87/134

balise

traduction HTML

Struts par la pratique - Serge Tah, universit d'Angers

explication submit

les mmes que pour le combo reoit sous forme d'un tableau de chanes de caractres, les valeurs des options slectionnes par l'utilisateur dans la liste HTML listeMultiple. Un utilisateur peut ne slectionner aucune option. Dans ce cas, le client n'envoie pas le paramtre listeMultiple dans sa requte HTTP au serveur. Le champ listeMultiple de dynaFormulaire garde alors sa valeur prcdente.

balise traduction HTML explication

Si le champ secret de dynaFormulaire a la valeur "xxx", gnre le code HTML la balise html:hidden sert gnrer la balise HTML . facultatif - nom du bean ActionForm ou driv dans lequel devra tre place ou lue la valeur du champ. En l'absence de cet attribut, c'est le formulaire associ la balise qui est utilis. property nom du champ du bean formulaire associ au champ cach. La valeur "xxx" attribue au champ HTML secret vient de la dfinition du formulaire dans le fichier de configuration. On y a dfini une valeur initiale "xxx" pour le champ secret. reoit la valeur du champ HTML secret. Comme l'utilisateur n'a pas la possibilit de changer cette valeur, le champ secret de dynaFormulaire recevra ici la valeur xxx.name

submit

balise traduction HTML

Envoyer

La dernire chose expliquer est le code javascript inclus dans la page JSP et li aux deux boutons [Effacer] qui dslectionnent les lments slectionns dans les listes listeSimple et listeMultiple :

Pour comprendre ce code, rappelons comment sont dsigns les diffrents lments d'un document web au sein d'un code Javascript l'exploitant : Donnedocument document.forms document.forms[i] document.forms["nomFormulaire"] document.nomFormulaire document.[formulaire].elements

document.[formulaire].elements[i] document.[formulaire].elements["nomComposant"] document.[formulaire]. nomComposant document.[formulaire].[composant].value

document.[formulaire].[select].selectedIndex

document.[formulaire].[select].options document.[formulaire].[select].options[i] document.[formulaire].[select].options[i].selected

Signification dsigne la totalit du document web dsigne la collection des formulaires dfinis dans le document dsigne le formulaire n i du document dsigne le formulaire ayant l'attribut name gal "nomFormulaire" dsigne le formulaire ayant l'attribut name gal "nomFormulaire" dsigne la collection des lments membres du formulaire dsign par l'expression [formulaire]. Cette collection comprend toutes les balises , , du formulaire dsign. dsigne l'lment n i de [formulaire] dsigne l'lment de [formulaire] ayant l'attribut name gal nomComposant dsigne l'lment de [formulaire] ayant l'attribut name gal nomComposant dsigne la valeur du composant [composant] du formulaire [formulaire] lorsque le code HTML de celui-ci peut avoir un attribut value (, ) dsigne l'indice de l'option slectionne dans une liste. S'utilise en lecture et criture. Mettre cette proprit -1 dslectionne tous les lments de la liste. dsigne le tableau des options associes une balise dsigne l'option n i de la balise indique boolen indiquant si l'option n i de la balise [select] indique est slectionne (true) ou non. Peut s'utiliser en lecture et criture

Revenons sur le code javascript des deux boutons :

Struts par la pratique - Serge Tah, universit d'Angers

88/134

Sur l'vnement clic sur le bouton, le code associ l'attribut "onclick" est excut. Ici, c'est un code en ligne. Le plus souvent, on crit onclick="fonction(...)" o fonction est une fonction dfinie au sein d'une balise ... . Que fait le code ci-dessus ? Commentons le code du premier bouton :this this.form this.form.listeSimple this.form.listeSimple.selectedIndex

dsigne le document web dans lequel se trouve le bouton dsigne le formulaire dans lequel se trouve le bouton dsigne le composant listeSimple du formulaire dsigne l'indice de l'option slectionne dans listeSimple. Mettre -1 cette proprit entrane la dslection de toute option.

VI.4.2 La vue confirmation.jspRappelons que cette vue est affiche l'issue de l'action /confirmation, c.a.d. aprs que le formulaire contenu dans la vue formulaire.jsp ait t post par le client web. Elle a pour seul but d'afficher les valeurs saisies par l'utilisateur. Son code est le suivant : Confirmation Confirmation des valeurs saisies Bouton radio Case cocher chk1 Case cocher chk2 Case cocher chk3 Champ de saisie Mot de passe Bote de saisie combo liste simple liste multiple[]
Retour au formulaire Struts par la pratique - Serge Tah, universit d'Angers

89/134

Nous introduisons ici deux nouvelles bibliothques de balises : struts-bean et struts-logic. La bibliothque struts-bean permet d'avoir accs des objets placs dans la requte, la session ou le contexte de l'application. La bibliothque struts-logic permet d'introduire de la logique d'excution au moyen de balises. Ces deux bibliothques ne sont nullement indispensables. Comme nous l'avons vu, une page JSP peut : rcuprer des objets dans la requte (request.getAttribute(...)), la session (session.getAttribute(...), ou le contexte de l'application inclure des parties dynamiques dans le code HTML au moyen de variables comporter du code Java

L'inclusion de code Java dans des pages JSP gne tous ceux qui voudraient une stricte sparation entre logique applicative (code java) et prsentation (utilisation de balises). Aussi a-t-on invent pour eux des bibliothques de balises. Nous allons procder comme il a t fait pour la vue formulaire.jsp et expliquer chacune des balises prsentes dans le code de confirmation.jsp si elles n'ont pas t dj rencontres dans la vue formulaire.jsp. Tout d'abord, remarquons que la page commence par dclarer les trois bibliothques de balises qu'elle va utiliser :

Nous commentons maintenant les balises du document formulaire.jsp :balise fonction

crit une valeur dans le flux HTML courant. La balise bean:write admet les attributs suivants : name : nom de l'objet utiliser scope : porte (request, session, context) dans laquelle chercher cet objet property : champ de l'objet dsign par name dont il faut crire la proprit. Ce champ peut tre un objet de tout type. Ce sera la mthode toString de l'objet qui sera utilise pour afficher celui-ci. Ici, la valeur du champ opt de dynaFormulaire est crite. On aura soit "oui" si l'utilisateur a coch le bouton radio ayant l'attribut value="oui", soit "non" s'il a coch le bouton radio ayant l'attribut value="non"

balise fonction

crit la valeur du champ chk1 de dynaFormulaire. On aura soit "on" si l'utilisateur a coch la case, soit "off" sinon. Idem pour chk2, chk3. crit la valeur du champ champSaisie de dynaFormulaire, c'est dire le texte tap par l'utilisateur dans ce champ. Idem pour mdp, boiteSaisie.

balise fonction

balise fonction

crit la valeur du champ combo de dynaFormulaire. On aura l'attribut value de l'lment slectionn par l'utilisateur.

balise fonction

crit la valeur du champ listeSimple de dynaFormulaire. On aura l'attribut value de l'lment slectionn par l'utilisateur s'il y en a eu un. Sinon on aura la chane vide. liste multiple[]

balise

fonction

Ici, nous introduisons des balises de logique. Nous avons affaire une liste choix multiple. La valeur du champ listeMultiple de l'objet dynaFormulaire est un tableau de String. En java, nous cririons une boucle. La balise logic:iterate nous permet de faire cette mme boucle sans crire de code Java. La balise logic:iterate a dans l'exemple les attributs suivants : name="dynaFormulaire" : nom de l'objet utiliser property="listeMultiple" : nom de la proprit qui dans l'objet indiqu par name contient la collection qui va tre parcourue dans la boucle. Ici cette collection est le tableau des valeurs slectionnes dans listeMultiple. Ce tableau peut tre vide.

Struts par la pratique - Serge Tah, universit d'Angers

90/134

id="choix" : identificateur dsignant l'lment courant du tableau chaque tour de boucle. Lors de la 1re itration, choix reprsentera listeMultiple[0], la seconde listeMultiple[1] et ainsi de suite. indexID="index" : identificateur dsignant l'indice de l'lment courant du tableau chaque tour de boucle. Lors de la 1re itration, index aura la valeur 0, la seconde la valeur 1 et ainsi de suite. Le code HTML contenu entre les balises et est rpt pour chaque lment de la collection dsigne par le couple (name,property). La partie dynamique de ce code est le suivant :liste multiple[]

De ce qui a t dit prcdemment, on dduit qu' l'itration n i (i>=0), le code HTML gnr est quivalent au code suivant :liste multiple[]

balise

Retour au formulaire

fonction

gnre un lien relatif au contexte de l'application, ce qui vite de connatre celui-ci. Le code HTML gnr par cette balise est le suivant :Retour au formulaire

VI.5 Les classes JavaLe fichier de configuration struts-config.xml rfrence deux classes Java : ...

La classe DynaFormulaire est la classe qui contiendra les valeurs de la vue n 1 formulaire.jsp. La classe InitFormulaireAction est la classe charge d'initialiser le bean dynaFormulaire avant son premier affichage.

VI.5.1 La classe DynaFormulairePour contenir les valeurs d'un formulaire, un objet de type DynaActionForm est suffisant sauf si on a besoin de redfinir l'une des mthodes reset ou validate de cette classe. Ici, la mthode validate n'a pas besoin d'tre redfinie puisqu'on ne fait aucune validation de donnes. Mais la mthode reset a elle besoin d'tre redfinie. En effet, les champs de l'objet DynaFormulaire vont recevoir leurs valeurs du formulaire post par le client web. Or certains champs peuvent ne pas recevoir de valeur s'ils ne sont pas prsents dans la requte. Cela se produit dans les cas suivants : une case cocher qui n'a pas t coche par l'utilisateur une liste de taille suprieure 1 ou aucune option n'a t slectionne

Pour des formulaires ayant ce type de composants, la mthode reset doit affecter la valeur "off" au champ associ la case cocher affecter la chane vide au champ associ une liste slection unique affecter un tableau de taille nulle de chanes de caractres au champ associ une liste slection multiple

Ainsi, si ces champs ne reoivent pas de valeur de la requte, ils conservent la valeur attribue par reset, valeur qui correspond l'tat du composant dans le formulaire valid par l'utilisateur (case non coche, liste avec aucun lment slectionn). Le code de la classe DynaFormulaire, classe drive de DynaActionForm est le suivant :package istia.st.struts.formulaire; import org.apache.struts.action.DynaActionForm; import org.apache.struts.action.ActionMapping; Struts par la pratique - Serge Tah, universit d'Angers

91/134

import javax.servlet.http.HttpServletRequest; public class DynaFormulaire extends DynaActionForm { public void reset(ActionMapping mapping, HttpServletRequest request){ // reset des cases cocher - valeur off set("chk1","off"); set("chk2","off"); set("chk3","off"); // reset listeSimple - chane vide set("listeSimple",""); // reset listeMultiple - tableau vide set("listeMultiple",new String[]{}); } }

VI.5.2 La classe InitFormulaireActionLa classe InitFormulaireAction est, dans le fichier struts-config.xml, associe l'action /init :

L'action /init n'est utilise qu'une fois lors de la construction initiale de l'objet DynaFormulaire. Elle a pour but de fournir du contenu aux trois listes du formulaire combo, listeSimple, listeMultiple. Ce contenu est fourni sous forme de trois tableaux, proprits de l'objet dynaFormulaire : ...

Une fois que les tableaux valeursCombo, valeursListeSimple, valeursListeMultiple auront t initialiss par InitFormulaireAction, ils n'auront plus besoin de l'tre. En effet, l'objet dynaFormulaire est plac dans la session et conserve donc sa valeur au fil des cycles demande-rponse. C'est pourquoi l'action /init n'est excute qu'une fois. Le code de InitFormulaireAction est le suivant :package istia.st.struts.formulaire; import import import import java.io.*; javax.servlet.*; javax.servlet.http.*; org.apache.struts.action.*;

public class InitFormulaireAction extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, // prpare le formulaire afficher // on met les informations ncessaires au formulaire dans son bean DynaFormulaire formulaire = (DynaFormulaire) form; formulaire.set("valeursCombo", getValeurs(5, "combo")); formulaire.set("valeursListeSimple", getValeurs(7, "simple")); formulaire.set("valeursListeMultiple", getValeurs(10, "multiple")); // on rend la main return mapping.findForward("afficherFormulaire"); } //execute // liste des valeurs du combo private String[] getValeurs(int taille, String label) { String[] valeurs = new String[taille]; for (int i = 0; i < taille; i++) { valeurs[i] = label + i; } return valeurs; } Struts par la pratique - Serge Tah, universit d'Angers

ServletException {

92/134

}

-

la classe drive de la classe Action. C'est obligatoire. le contrleur Struts utilise un objet Action via sa mthode execute. C'est donc elle qu'il faut redfinir. Cette mthode reoit les pramtres suivants : o ActionMapping mapping : un objet reprsentant la configuration de l'aplication dans struts-config.xml o ActionForm form : le formulaire associ l'action s'il y en a un dfini dans la configuration de l'action (attribut name de l'action). o HttpServletRequest request : la requte du client o HttpServletResponse : la rponse au client la classe InitFormulaireAction doit initialiser le formulaire dynaFormulaire. Celui arrive la mthode execute sous la forme du paramtre ActionForm form. Rappelons que dynaFormulaire est de type DynaFormulaire, classe drive de la classe DynaActionForm elle-mme drive de la classe ActionForm. dans la mthode execute, des valeurs sont affectes aux trois champs valeursCombo, valeursListeSimple, valeursListeMultiple grce la mthode set de la classe DynaActionForm. Ces valeurs sont des tableaux arbitraires par souci de simplicit. Remarquons que la mthode set affecte une valeur un champ existant. Elle ne peut pas servir crer de nouveaux champs. C'est pourquoi, il est ncessaire de dfinir les trois champs valeursCombo, valeursListeSimple, valeursListeMultiple dans la dfinition de l'objet dynaFormulaire dans struts-config.xml. la mthode execute se termine en renvoyant au contrleur la cl de la vue afficher comme rponse au client. Ici, c'est la cl afficherFormulaire qui dans le fichier struts-config.xml a t associe la vue /vues/formulaire.jsp.

-

-

VI.6 DploiementL'arborescence de l'application est la suivante :

Rappelons que le fichier ApplicationResources.properties ci-dessus est ncessaire la bibliothque de balises struts-bean. On sait que ce fichier contient les messages de l'application. Ceux-ci sont accessibles la bibliothque struts-bean. Ici, notre application ne dfinit aucun message. Aussi le fichier ApplicationResources.properties existe mais est vide.Struts par la pratique - Serge Tah, universit d'Angers

93/134

VI.7 TestsUne fois l'application /formulaire2 correctement dploye, nous la dmarrons (Tomcat manager) et demandons l'url http://localhost:8080/formulaire2/init.do :

Nous remplissons le formulaire :

Struts par la pratique - Serge Tah, universit d'Angers

94/134

Aprs utilisation du bouton [Envoyer], nous obtenons le rsultat suivant :

Struts par la pratique - Serge Tah, universit d'Angers

95/134

Si nous utilisons le lien [Retour au formulaire] ci-dessus, nous retrouvons le formulaire tel qu'il a t saisi :

Struts par la pratique - Serge Tah, universit d'Angers

96/134

VI.8 ConclusionNous avons dtaill dans cette partie la faon de grer les diffrents composants d'un formulaire HTML. Nous pouvons maintenant utiliser des formulaires complexes dans nos applications Struts.

Struts par la pratique - Serge Tah, universit d'Angers

97/134

VII Application QuiEstNous dcrivons ici une application Struts un peu plus sophistique que celles qui ont prcd et qui se devaient d'tre simples pour tre pdagogiques.

VII.1 La classe usersOn dispose d'une classe Java mmorisant les informations sur les utilisateurs d'une machine Unix. Celles-ci sont enregistres dans trois fichiers particuliers : - /etc/passwd : liste des utilisateurs - /etc/group : liste des groupes - /etc/aliases : liste des alias pour le courrier Le contenu de ces trois fichiers est le suivant :

- /etc/passwdLes lignes de ce fichier ont la forme suivante : login:pwd:uid:gid:id:dir:shell aveclogin pwd uid gid id dir shell

login de l'utilisateur son mot de passe crypt son n d'utilisateur son n de groupe son identit son rpertoire de connexion son interprteur de commandes

Ainsi la ligne d'un utilisateur pourrait tre la suivante : dupond:xg675SDFEkl09:110:57:Guillaume Dupond:/home/iup2-auto/dupond:/bin/bash L'utilisateur prcdent porte le n 110 et appartient au groupe 57. C'est dans le fichier /etc/group qu'on trouvera la dfinition du groupe 57.

- /etc/groupLes lignes de ce fichier ont la forme suivante : nomGroupe:pwd:gid:membre1,membre2,.... avecnomGroupe pwd gid membrei

nom du groupe son mot de passe crypt - le plus souvent ce champ est vide le n du groupe logins d'utilisateurs - ce champ peut tre vide

Ainsi la ligne du groupe 57 prcdent pourrait tre la suivante : iup2-auto::57: qui indique que le groupe 57 porte le nom iup2-auto.

- /etc/aliasesLes lignes de ce fichier ont la forme suivante : alias:[tab]login avecalias [tab] login

alias une ou plusieurs tabulations login de l'utilisateur auquel appartient l'alias

Ainsi la ligne guillaume.dupond: dupondStruts par la pratique - Serge Tah, universit d'Angers

98/134

signifie que l'alias guillaume.dupond appartient l'utilisateur de login dupond. Rappelons que les alias sont utiliss dans les adresses lectroniques. Ainsi si dans l'exemple prcdent, la machine Unix s'appelle shiva.istia.univ-angers.fr, un courrier adress [email protected] sera dlivr dans la bote lettres de l'utilisateur de login dupond de cette machine. Nous ne nous intresserons pas ici la totalit de l'interface de la classe users mais simplement son constructeur et quelques mthodes :import java.io.*; import java.util.*; public class users{

// attributs private Hashtable usersByLogin=new Hashtable(); private ArrayList erreurs=new ArrayList(); ....

// login --> login, pwd, ..., dir // liste de messages d'erreur

// constructeur public users(String usersFileName, String groupsFileName, String aliasesFileName) throws Exception { // usersFileName : nom du fichier des utilisateurs avec des lignes de la forme // login:pwd:uid:gid:id:dir:shell // groupsFileName : nom du fichier des groupes avec des lignes de la forme // nom:pwd:numro:membre1,membre2,.. // aliasesFileName : nom du fichier des alias avec des lignes de la forme // alias:[tab]login // construit le dictionnaire usersByLogin .... }// constructeur // liste des utilisateurs public Hashtable getUsersByLogin(){ return usersByLogin; } // erreurs public ArrayList getErreurs(){ return erreurs; }

usersByLogin

erreurs

dictionnaire (Hashtable) dont les cls sont les logins du fichier passwd. La valeur associe la cl est un tableau de chanes (String [7]) dont les lments sont les 7 champs de la ligne du fichier passwd associe au login. Certains champs peuvent tre vides si la ligne a moins de 7 champs. liste de messages d'erreurs - vide si pas d'erreurs

VII.2 L'application web quiestS'appuyant sur la classe prcdente, on se propose de construire l'application web suivante (page formulaire) : VUE 1 - formulaire 1 2

n 1 2

nom cmbLogins

type HTML ...

btnChercher

rle prsente la liste de tous les logins propos desquels on peut demander de l'information pour lancer la recherche

Lorsque l'utilisateur appuie sur le bouton [Chercher] (2), le login de (1) est demand un objet U de type users. Si le login existe, on a la rponse suivante (page infos) :

Struts par la pratique - Serge Tah, universit d'Angers

99/134

VUE 2 - informations

Comme l'URL du navigateur le montre ci-dessus, les paramtres du formulaire sont envoys au serveur par un GET. On peut donc donner directement au navigateur cette URL paramtre. C'est ce que nous faisons ici, pour introduire un login qui n'existe pas. On a la rponse suivante (page erreurs) :

VUE 3- erreurs

Struts par la pratique - Serge Tah, universit d'Angers

100/134

VII.3 L'architecture de l'applicationClient CONTRLEUR ActionServlet SetupLoginsAction ACTIONS InfosLoginsAction ForwardAction MTIER classe users Fichiers - passwd - group - aliases Logique applicative formLogins FORMULAIRES Donnes MODLE

Interface client

logins.jsp infos.jsp erreurs.jsp VUES

Nous trouvons dans cette architecture les composants suivants : les vues : o logins.jsp, utilise pour afficher la liste des logins (vue 1) o infos.jsp utilise pour afficher les informations lies un login (vue 2) o erreurs.jsp utilise pour afficher une liste d'erreurs (vue 3) les formulaires de type ActionForm utiliss par les actions : o formLogins utilis pour collecter les donnes du formulaire logins.jsp les actions : o SetupLoginAction qui prpare le contenu de formulaire.jsp puis affiche cette vue o InfosLoginAction qui traite le contenu de logins.jsp une fois celui-ci envoy au serveur o ForwardAction qui traite le lien [Retour vers le formulaire] des vues infos.jsp et erreurs.jsp la classe mtier users utilise par les actions pour obtenir leurs donnes le modle assur par les trois fichiers plats passwd, group et aliases

-

-

VII.4 Configuration de l'application webVII.4.1 Cration du contexteNous appellerons /strutsquiest2 cette nouvelle application. Nous la dployons dans Tomcat de la faon suivante (page Tomcat Manager) :

Ce dploiement donne naissance au fichier strutsquiest2.xml dans \conf\Catalina\localhost :Struts par la pratique - Serge Tah, universit d'Angers

101/134

Le contenu de ce fichier est le suivant :

On peut vrifier la validit du contexte en demandant l'URL http://localhost:8080/strutsquiest2/

VII.4.2 Le fichier web.xmlLe fichier de configuration web.xml de l'application sera le suivant : strutsquiest2 istia.st.struts.quiest.Quiest2ActionServlet config /WEB-INF/struts-config.xml passwdFileName data/passwd Struts par la pratique - Serge Tah, universit d'Angers

102/134

groupFileName data/group strutsquiest2 *.do

Ce fichier web.xml apporte une nouveaut. Le contrleur Struts n'est plus org.apache.struts.action.ActionServlet mais une classe drive qu'on a appele ici istia.st.struts.quiest.Quiest2ActionServlet. Cela va nous permettre de rcuprer les deux paramtres d'initialisation que sont pass