Ce nouveau POC vous montrera comment mettre en place et utiliser le framework de templating Apache Tiles au sein d’une application Struts 1.x. Tiles est ici utilisé comme plugin Struts. Le POC est basé sur le précédent POC Struts.
En avant !
1) Technologies
| Apache Maven | 3.0.3 | |
| Apache Struts | 1.3.10 | |
![]() |
Apache Tiles | 1.3.10 (plugin Struts) |
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>org.apache.struts</groupId>
<artifactId>struts-tiles</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 et de Tiles
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>
<init-param>
<param-name>chainConfig</param-name>
<param-value>org/apache/struts/tiles/chain-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>
Le paramètre chainConfig sert à spécifier à Struts qu’il va devoir intercepter les éventuelles définitions Tiles dans les forward. L’autre manière est de déclarer un processor particulier dans le fichier de configuration struts-config.xml.
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.
<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="fwdListe1" path="liste1" />
<forward name="fwdListe2" path="liste2" />
</action>
</action-mappings>
<!-- ========== Message Resources Definitions =========================== -->
<message-resources parameter="ApplicationResources" />
<!-- ========== Plugins Definitions ===================================== -->
<plug-in className="org.apache.struts.tiles.TilesPlugin">
<set-property property="definitions-config" value="/WEB-INF/struts/tiles-defs.xml" />
</plug-in>
</struts-config>
Les forwards fwdListe1 et fwdListe2 utilisent dans l’attribut path des définitions Tiles que nous verrons par la suite.
3.3) Création du fichier de configuration de Tiles
Le fichier de configuration Tiles s’appelle en général tiles-defs.xml et se trouvent dans WEB-INF\struts. Il contient les définitions Tiles, autrement dit la description de chacune des pages de votre application.
Créez donc ce fichier et placez-y le code suivant à l’intérieur :
<!DOCTYPE tiles-definitions PUBLIC
"-//Apache Software Foundation//DTD Tiles Configuration 1.3//EN"
"http://struts.apache.org/dtds/tiles-config_1_3.dtd">
<tiles-definitions>
<definition name="monLayout" path="/pages/tiles/template.jsp">
<put name="head" value="/pages/tiles/head.jsp" />
<put name="header" value="/pages/tiles/header.jsp" />
<put name="menu" value="/pages/tiles/menu.jsp" />
<put name="footer" value="/pages/tiles/footer.jsp" />
</definition>
<definition name="liste1" extends="monLayout">
<put name="body" value="/pages/listes/liste1.jsp" />
</definition>
<definition name="liste2" extends="monLayout">
<put name="body" value="/pages/listes/liste2.jsp" />
</definition>
</tiles-definitions>
La 1ère définition définit le template classique des pages/écrans de l’application. Le template s’appellee monLayout et est basé sur la JSP template.jsp dans laquelle plusieurs régions sont définies : head, header, menu, footer. Le tag put permet ensuite de mettre/placer dans une région, une JSP.
Les 2ème et 3ème définitions définissent deux écrans de l’application, appelée respectivement liste1 et liste2. Comme les définitions étendent (extends) le template principal, il n’y a plus qu’à surcharger les régions pour obtenir un écran complet.
3.4) Mise en place des ressources
Le fichier de propriétés contiendra uniquement le libellé des liens présents dans l’application :
index.liste1=Voir la liste 1 index.liste2=Voir la liste 2 link.home=Accueil
4) Action & JSP
4.1) Codage de l’action
Dans ce POC comme dans le précédent, 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 liste1(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
throws Exception {
return mapping.findForward("fwdListe1");
}
public ActionForward liste2(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
throws Exception {
return mapping.findForward("fwdListe2");
}
}
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.
4.2) Création du template Tiles
Le template est stocké dans la JSP \tiles\template.jsp. Cette JSP contient le code suivant :
<%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles"%>
<html>
<head>
<tiles:insert attribute="head" />
</head>
<body>
<div class="container-fluid">
<div class="sidebar">
<div class="well">
<tiles:insert attribute="menu" />
</div>
</div>
<div class="content">
<div class="hero-unit">
<tiles:insert attribute="header" />
</div>
<div class="row">
<tiles:insert attribute="body" />
</div>
</div>
<footer>
<tiles:insert attribute="footer" />
</footer>
</div>
</body>
</html>
Les lignes surlignées correspondent aux créations de régions Tiles. Le code HTML ainsi que les classes CSS sont adaptées afin d’utiliser le Bootstrap de Twitter.
4.3) Codage de l’action
Enfin, au niveau des JSP, on retrouve :
- la page index.jsp :
<%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles"%> <tiles:insert page="/pages/tiles/template.jsp"> <tiles:put name="head" value="/pages/tiles/head.jsp" /> <tiles:put name="header" value="/pages/tiles/header.jsp" /> <tiles:put name="menu" value="/pages/tiles/menu.jsp" /> <tiles:put name="body" value="/pages/welcome.jsp" /> <tiles:put name="footer" value="/pages/tiles/footer.jsp" /> </tiles:insert>
La taglib Tiles fournit des tags permettant d’utiliser directement un template dans une JSP. Très utile généralement dans les pages d’index.
- la page liste1.jsp :
<%@ include file="/pages/common/taglibs.jsp" %> <h2>Liste 1</h2> <ul> <li>Item 1</li> <li>Item 2</li> <li>Item 3</li> <li>Item 4</li> <li>Item 5</li> </ul> <br /><br /> <html:link styleClass="btn" forward="home"> <bean:message key="link.home" /> </html:link>
La classe CSS btn est une classe provenant du Twitter’s Bootstrap.
- la page liste2.jsp :
<%@ include file="/pages/common/taglibs.jsp" %> <h2>Liste 2</h2> <ul> <li>Item 1</li> <li>Item 2</li> <li>Item 3</li> <li>Item 4</li> <li>Item 5</li> </ul> <br /><br /> <html:link styleClass="btn" forward="home"> <bean:message key="link.home" /> </html:link>
La JSP incluse taglibs.jsp contient les imports de taglibs. De cette manière, en cas d’ajout, modification ou suppression de taglib, vous n’aurez qu’à modifier cette JSP uniquement, au lieu de l’ensemble des JSP si vous précisez les taglibs dans toutes les JSP de l’application.
Pour le reste, je vous laisse voir par vous-même une fois le POC téléchargé !
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-tiles.
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-tiles


