Premier d’une – je l’espère – longue série, ce POC vous montrera comment mettre en place le framework MVC Apache Struts 1.x dans une application Web. Le POC est basé sur les DispatchAction Struts.
1) Technologies
| Apache Maven | 3.0.3 | |
| Apache Struts | 1.3.10 |
2) Création du projet
2.1) Utilisation de l’archetype Webapp
Commencez par lancer la commande Maven suivante dans une console. Elle créera le squelette d’une application Web.
mvn archetype:create -DarchetypeArtifactId=maven-archetype-webapp -DgroupId=fr.tduchateau.poc -DartifactId=poc-struts-tiles
2.2) Mise à jour du POM
Déclarez les dépendances suivantes :
<dependencies>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts-core</artifactId>
<version>1.3.10</version>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts-taglib</artifactId>
<version>1.3.10</version>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts-extras</artifactId>
<version>1.3.10</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.4</version>
<scope>provided</scope>
</dependency>
</dependencies>
Déclarez enfin le plugin Jetty qui nous permettra de déployer l’application via Maven.
<build>
<plugins>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.26</version>
<configuration>
<scanIntervalSeconds>2</scanIntervalSeconds>
</configuration>
</plugin>
</plugins>
</build>
2.3) Import du projet dans Eclipse
Afin de pouvoir importer dans Eclipse, vous pouvez lancer la commande suivante :
mvn eclipse:eclipse
Il suffira ensuite de faire un clic droit dans le Package Explorer d’Eclipse puis Import > Existing Project into Workspace
L’archetype Webapp ne possédant pas de répertoire src/main/java, vous pouvez dors et déjà créer ce répertoire dans lequel nous placerons les sources en cliquant-droit sur le projet puis New > Source Folder. Dans le champ Folder name, renseignez : src/main/java.
3) Mise en place de Struts
3.1) Modification du descripteur de déploiement
Vous allez avoir besoin de modifier le descripteur de déploiement web.xml pour y déclarer la servlet principale de Struts
<web-app>
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts/struts-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
3.2) Création du fichier de configuration de Struts
Le fichier en question s’appelle struts-config.xml et se place généralement dans le répertoire WEB-INF.
Il est considéré comme le coeur de Struts. On y retrouvera, sous forme déclarative, tous les formulaires de l’application, les redirections (globales ou non), l’emplacement du fichier de ressources et éventuellement la déclaration de différents plugins.
N.B.: Il est considéré commet étant une bonne pratique de séparer dans des répertoires distincts les différents fichier de configuration d’une application, d’où le répertoire WEB-INF\struts. Nous verrons dans les futurs POC que la lecture devient plus claire lorsque plusieurs technologies sont présentes dans le projet.
<struts-config>
<!-- ========== Form Bean Definitions =================================== -->
<form-beans>
<form-bean name="gestionForm" type="org.apache.struts.action.DynaActionForm">
<form-property name="methode" type="java.lang.String"></form-property>
</form-bean>
</form-beans>
<!-- ========== Global Forward Definitions ============================== -->
<global-forwards>
<forward name="home" path="/index.jsp" />
</global-forwards>
<!-- ========== Action Mapping Definitions ============================== -->
<action-mappings>
<action path="/gestion"
name="gestionForm"
type="fr.duchateau.coordination.GestionDispatchAction"
parameter="methode"
scope="request">
<forward name="succes" path="/resultat.jsp" />
</action>
</action-mappings>
<!-- ========== Message Resources Definitions =========================== -->
<message-resources parameter="ApplicationResources" />
</struts-config>
Quelques remarques :
- La section global-forward permet de déclarer des redirections globales qui seront accessibles tant dans les actions que dans les JSP.
- L’application n’ayant pas besoin de validation, le choix d’un DynaActionForm offre la souplesse de ne pas déclarer de bean Form pour représenter les formulaires
- L’attribut parameter dans la déclaration de l’action permet de spécifier la méthode à exécuter dans classe d’action. Il faudra alors spécifier sa valeur dans la JSP.
3.3) Mise en place des ressources
Struts offre la possibilité d’externaliser toutes les ressources “textes” d’une application dans un fichier appelé applicationResources.properties. Ce fichier contient en théorie tous les libellés présents dans l’application : différents textes, boutons, etc. En respectant certaines règles de nommage du fichier, l’internationalisation de l’application devient très simple à réaliser.
Notre fichier de propriétés contiendra uniquement le libellé des liens présents dans l’application :
index.ajouter=Ajouter index.modifier=Modifier index.supprimer=Supprimer
4) Action & JSP
Dans ce POC, je suis parti sur une action de type DispatchAction, qui permet de regrouper plusieurs méthodes dans une seule classe d’action, à la différence d’une Action classique, qui ne possède que la méthode execute().
La classe fr.duchateau.coordination.GestionDispatchAction se présente comme suit :
public class GestionDispatchAction extends DispatchAction {
public ActionForward ajouter(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
throws Exception {
System.out.println("Ajout !");
return mapping.findForward("succes");
}
public ActionForward modifier(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
throws Exception {
System.out.println("Modification !");
return mapping.findForward("succes");
}
public ActionForward supprimer(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
throws Exception {
System.out.println("Suppression !");
return mapping.findForward("succes");
}
}
C’est l’attribut parameter, déclaré dans le fichier struts-config.xml et valorisé dans la JSP qui indiquera à Struts quelle méthode exécuter.
Enfin, au niveau des JSP, on retrouve la page index.jsp :
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%> <%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Bienvenue !</title> </head> <body> <h2>DispatchAction par lien</h2> <html:link action="/gestion.do?methode=ajouter"> Ajouter </html:link> <html:link action="/gestion.do?methode=modifier"> Modifier </html:link> <html:link action="/gestion.do?methode=supprimer"> Supprimer </html:link> <h2>DispatchAction par formulaire Struts (sans Javascript)</h2> <html:form action="/gestion.do"> <html:submit property="methode">ajouter</html:submit> <html:submit property="methode">modifier</html:submit> <html:submit property="methode">supprimer</html:submit> </html:form> <h2>DispatchAction par formulaire Struts (avec Javascript)</h2> <html:form styleId="form1" action="/gestion.do"> <html:hidden property="methode" /> <html:submit onclick="document.forms['form1'].methode.value='ajouter';">Ajouter</html:submit> <html:submit onclick="document.forms['form1'].methode.value='modifier';">Modifier</html:submit> <html:submit onclick="document.forms['form1'].methode.value='supprimer';">Supprimer</html:submit> </html:form> </body> </html>
Et la page resultat.jsp :
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%> <html> <body> <h2>J'ai été redirigé vers resultat.jsp</h2> <br /> <html:link forward="home">Accueil</html:link> </body> </html>
5) Déploiement et test
Pour déployer le POC, il vous suffit d’exécuter dans une console la commande suivante :
mvn jetty:run
Pour le tester, c’est ici : http://localhost:8080/poc-struts
6) Téléchargement
Le POC est téléchargeable ici :
Ou par SVN :
svn checkout http://tduchateau.googlecode.com/svn/trunk/POC/poc-struts

