Struts : memento
Cette page n'est pas du tout un tutorial Struts. Ce sont simplement quelques notes et captures d'écrans prises lors du développement d'une petite application Web avec Struts.
Exemple de structure de projet
- Nom_de_mon_application
- build
- doc
- lib
- modelJAR
- scripts
- source
- Nom_de_mon_application
- model
- dto
- ejb
- META-INF
- test
- view
- action
- controller
- form
- images
- jsp
- service
- stylesheets
- util
- WEB-INF
- classes
- props
- lib
- tld
- classes
- model
- Nom_de_mon_application
Le fichier web.xml
Nous pouvons définir la configuration du site par le fichier web.xml qui se trouve dans le répertoire WEB-INF.
Nous pouvons spécifier la page d'accueil de l'application par la balise <welcome-file>.
Nous pouvons définir les associations des URL selon le patron suivant : /action/*, si nous placerons dans un répertoire view/action toutes nos classes Java qui étendent Action.
Nous devons ensuite définir les différentes « librairies de balises » (en anglais, “tag-libs”) qui seront utilisées par Struts. Nous pouvons utiliser n'importe quelle chaîne de caractères pour référencer la librairie dans la balise <taglib-uri>, mais nous devrons par la suite veiller à respecter cette référence dans nos pages lors de l'utilisation des balises <%@ taglib.
Par convention, nous utiliserons l'adresse du fichier tld de la librairie en question.
Exemple d'utilisation dans une page :
Code XML (WEB-INF/web.xml) (36 lignes)
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "file:///H:/refs/dtd/web-app_2_3.dtd"> <web-app> <display-name>First application</display-name> <description>My first application in Struts</description> <servlet> <servlet-name>servlet</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>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>servlet</servlet-name> <url-pattern>/action/*</url-pattern> <!-- used for path mapping --> </servlet-mapping> <welcome-file-list> <welcome-file>/jsp/index.jsp</welcome-file> </welcome-file-list> <taglib> <taglib-uri>/WEB-INF/struts-html.tld</taglib-uri> <!-- name used for <%@ taglib uri=" declaration --> <taglib-location>/WEB-INF/tld/struts-html.tld</taglib-location> </taglib> <taglib> <taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri> <taglib-location>/WEB-INF/tld/struts-bean.tld</taglib-location> </taglib> <taglib> <taglib-uri>/WEB-INF/struts-logic.tld</taglib-uri> <taglib-location>/WEB-INF/tld/struts-logic.tld</taglib-location> </taglib> </web-app>
Le fichier struts-config.xml
C'est dans ce fichier que nous pouvons effectuer les mappings entre les beans (qui vont contenir les informations récoltées dans les formulaires) et les actions.
Dans cet exemple, si nous spécifions action="logon.do" dans un formulaire, Struts vérifie s'il existe une action dont path="/logon". Cette action est référencée ici sous le nom logonform.
Sous ce même nom, nous avons défini un form-bean qui nous permet de lui associer la classe qui contient les éléments du formulaire.
Nous pouvons définir des exceptions globales sous la balise <global-exceptions>.
De la même manière, nous pouvons définir des adresses globales sous <global-forwards>.
La balise <message-resources permet de définir l'emplacement des fichiers d'internationnalisation. Le nom de fichier est utilisé sans information de localisation (fr, en, nl, etc), ni d'extension .properties.
Code XML (WEB-INF/struts-config.xml) (32 lignes)
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "file:///H:/refs/dtd/struts-config_1_1.dtd"> <struts-config> <form-beans> <form-bean name="logonform" type="view.form.LogonForm" /> </form-beans> <global-exceptions> <exception key="global.error.credentials" path="/jsp/logon.jsp" scope="request" type="javax.naming.AuthenticationException" /> </global-exceptions> <global-forwards /> <action-mappings> <action path="/logon" type="view.action.LogonAction" scope="request" name="logonform" validate="true" input="/jsp/logon.jsp"> <forward name="success" path="/jsp/application.jsp" redirect="false" /> </action> </action-mappings> <message-resources parameter="props.application" null="false" /> </struts-config>
Le fichier application.properties
Exemple de fichier de messages.
Il suffit de réaliser le fichier une première fois complètement, puis de le copier et de remplacer les messages dans la langue souhaitée et d'ajouter la localisation (fr, en, nl, etc) entre le nom et l'extension de fichier.
- errors.header définit ce qui sera affiché avant d'itérer les messages d'erreurs. Par exemple, <ul>
- errors.prefix définit ce qui sera affiché avant chaque message d'erreur. Par exemple, <li>
- errors.suffix définit ce qui sera affiché après chaque message d'erreur. Par exemple, </li>
- errors.footer définit ce qui sera affiché après l'itération des messages. Par exemple, </ul>
Dans la partie que nous avons nommé validator nous devons indiquer ce qu'il faut afficher en cas d'erreur selon les critères de validation de Struts.
Nous avons demandé ces validations en indiquant validate="true" pour notre action dans le fichier struts-config.xml.
Le numéro entre accolades indique l'index de la valeur de substitutions qui est passée dans le message.
Dans la partie que nous avons nommé LogonForm, nous retrouvons les différents textes à afficher par exemple dans notre action, ou dans le formulaire.
Nous pouvons créer autant de messages que nous le souhaitons. Nous pouvons les nommer selon une notation séparée par des points, afin de les structurer, ou mieux visualiser à quelle action ils appartienent.
Code properties (WEB-INF/classes/props/application.properties) (32 lignes)
# -- standard errors -- errors.header=<table border="0" cellpadding="5" cellspacing="1" class="table" align="center"><tr><th>Error</th></tr> errors.prefix=<tr class="td"><td> errors.suffix=</td></tr> errors.footer=</table> # -- validator -- errors.invalid={0} is invalid. errors.maxlength={0} can not be greater than {1} characters. errors.minlength={0} can not be less than {1} characters. errors.range={0} is not in the range {1} through {2}. errors.required={0} is required. errors.byte={0} must be a byte. errors.date={0} is not a date. errors.double={0} must be an double. errors.float={0} must be an float. errors.integer={0} must be an integer. errors.long={0} must be an long. errors.short={0} must be an short. errors.creditcard={0} is not a valid credit card number. errors.email={0} is an invalid e-mail address. # -- LogonForm -- logonForm.button.submit.tooltip=Click to log on logonForm.button.submit.label=Log On logonForm.logon.label=Logon logonForm.password.label=Password logonForm.logon=logon logonForm.password=password # -- Global Exceptions -- global.error.credentials=Invalid Credentials
Exemple de marche à suivre
Nous créons une page JSP qui contient un formulaire (des champs et un bouton pour soumettre le formulaire).
Dans l'action du formulaire, nous spécifions une action Struts. Par exemple, monaction.do, qui sera utilisée par Struts sous la forme /monaction.
Si nous avons défini dans struts-config.xml une action dont le path correspond à cette structure /monaction, le chemin vers la classe Java est trouvé grâce à l'attribut type. Il est possible de déterminer le champ d'application(“scope request”, “session”, “application”).
Si nous désirons valider la structure des données du formulaire, nous spécifions validate="true", et nous indiquons sous l'attribut input la page à afficher en cas d'échec, ou l'action à exécuter.
Comme nous désirons effectuer une validation, nous devons surcharger la méthode validate de l'ActionForm. Cette validation portera sur la structure des données, alors que la validation de leur sémantique sera effectuée dans une méthode de notre classe qui étend Action.
Notre ActionForm peut étendre ValidatorForm au lieu de simplement ActionForm, mais dans ce cas, nous devons utiliser le fichier validator-rules.xml qui se trouvera lui aussi dans WEB-INF.
Dans struts-config.xml, nous devons spécifier dans form-bean un ActionForm associé à notre action. Pour les associer, nous devons leur donner la même valeur pour leurs attributs name.
Un exemple concret
La page suivante propose un exemple de projet qui met en pratique ces différentes notions.
Version en cache
21/11/2024 09:43:27 Cette version de la page est en cache (à la date du 21/11/2024 09:43:27) afin d'accélérer le traitement. Vous pouvez activer le mode utilisateur dans le menu en haut pour afficher la dernère version de la page.Document créé le 28/11/2005, dernière modification le 02/08/2019
Source du document imprimé : https://www.gaudry.be/java-struts-memento.html
L'infobrol est un site personnel dont le contenu n'engage que moi. Le texte est mis à disposition sous licence CreativeCommons(BY-NC-SA). Plus d'info sur les conditions d'utilisation et sur l'auteur.
- ↑ Uniform Resource Locator : correspond à « localisateur uniforme de ressource » en français
- ↑ librairies de balises : correspond à “tag-libs” en anglais
- ↑ JSP : JavaServer Pages Pages qui permettent un contenu dynamique, généré côté serveur, basées sur le langage Java. Ces fichiers sont compilés pour devenir des servlets Java.