Sie sind auf Seite 1von 46

MVC 2

Par M.Youssfi
Les API de J2EE
MVC
Si nous cherchons mettre en uvre une
architecture MVC via un environnement J2EE, on
peut donc faire les rapprochements suivants :
Un contrleur est implment sous forme de servlet
Java.
Le modle consiste en l'implmentation de la logique
mtier du site Web.
A ce niveau, l'architecture peut tre plus ou moins souple en
vous laissant opter pour le type de composants que vous
souhaitez utiliser : composants Java Beans ou composants
EJB (Enterprise Java Bean).
Chaque vue est implmente via une JSP.
MVC2
Dans la pratique, on peut reprocher une chose aux API
implmentant un modle MVC sous environnement J2EE :
il est ncessaire de coder un grand nombre de servlets
Java pour rceptionner les requtes clientes.
Dans le but d'amliorer ce point, certains frameworks
prfrent implmenter une architecture MVC 2.
Dans une telle architecture, il n'existe plus qu'un seul et
unique contrleur rceptionnant toutes les requtes
clientes.
Le contrleur redirige l'excution vers diffrentes vues de
manire dclarative, dans un fichier XML.
MVC2
Il existe un grand nombre de framework bass sur
une architecture MVC ou MVC 2. Citons, titre
d'exemple le framework Baraccuda, WebWork,
Coccoon
Utiliser le framework Struts peut s'avrer tre un
bon choix.
Struts est dvelopp par le groupe Apache. Ce
groupe est aussi l'auteur du serveur Web du mme
nom. En fait, Struts fait partie du projet Jakarta
d'Apache.
Structure dune application J2EE
Larchitecture J2EE dfinit un standart d'empaquetage et de
dploiement d'applications WEB J2EE.
Une application J2EE se compose gnralement des
archives suivantes:
.JAR : Java Archive; Archive qui contient les composants mtiers (
EJB) ou qui regroupe des biliothques de classes.
.WAR : Web Archive; Archive qui contient les composants dune
application web:
Servlets, JSP, et descripteurs de dploiement (Fichiers XML)
Images, Classes du modle et autres bibliothques (Fichiers.jar)
.EAR : Entreprise Archive; Archive principale de lapplication J2EE qui
est prte tre dploy sur un serveur dapplication. Elle regroupe
tous les composants de lapplication savoir:
Les archives web (.WAR)
Les composants mtiers pour les EJB (.JAR)
Les archives de ressources (extension .RAR).

Structure dune application web
J2EE
Dans la suite de ce cours, seules les
l'archives Web nous intresserons. C'est
effectivement dans ces archives qu'ils va
nous falloir installer le support pour le
framework Struts.
Un WAR est une archive qui contient donc
lui-mme un certain nombre de fichiers et
de dossiers. La structure (la hirarchie) de
ces dossiers est en fait fortement
impose.
Structure dune application Web J2EE
Ainsi, votre application Web se doit obligatoirement de
contenir un rpertoire WEB-INF : cest dans ce dossier
que nous allons trouver le code Java de l'application.
Mais encore une fois, des sous-dossiers prcis doivent
tre prsents.
Parmi ces dossiers, citons notamment le rpertoire
classes. Il contient l'ensemble des ".class" utiliss par
vos JSP et par vos servlets
Un autre rpertoire important est signaler : le
rpertoire lib. Si votre application utilise des librairies
additionnelles, c'est ici qu'elles devront tre stockes.
Ainsi Struts verra ses propres ".jar" stocks dans ce
dossier.
Intgration de struts dans une
application web
Il est maintenant le temps de dbuter notre installation.
Pour ce faire, connectez vous sur le site de Struts (donc sur
http://jakarta.apache.org/struts/index.html) et tlchargez
l'installation du module Struts.
Une fois l'archive sur votre machine, dsarchivez-l. Vous
devriez y trouver un certain nombre de fichiers d'extensions
diverses.
Dans le rpertoire qui va contenir votre application Web,
crez les diffrents dossiers dont nous venons de parler
prcdemment. Nous allons maintenant y ajouter certains
fichiers du module Struts.
Intgration de struts dans une
application web
Copier toutes les archives Java (d'extension
.jar) dans le rpertoire lib de votre
application.
A ce stade, tout le code Struts est disponible,
mais ce n'est pas tout
Une possibilit intressante de JSP est de
pouvoir dfinir nos propres tags XML
pour ce faire, il faut aussi fournir des fichiers
.tld (Tag Library Definition) dans WEB-INF
Struts exploitant cette possibilit, il vous faut
donc aussi copier l'ensemble des fichiers
d'extension .tld dans le rpertoire WEB-INF.
Enfin, il faut dfinir des descripteurs de
dploiement compatible avec J2EE et
Struts. Ces fichiers (d'extension .xml)
doivent tre aussi placs dans le rpertoire
WEB-INF savoir:.
web.xml : descripteur de dploiement de
servlets
Struts-config.xml : pour la configuration de
struts
Composants fondamentaux de
larchitecture struts
Struts-config.xml
Fichier struts-config.xml :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache
Software Foundation//DTD Struts Configuration
1.1//EN"
"http://jakarta.apache.org/struts/dtds/struts-
config_1_1.dtd">
<struts-config>

</struts-config>
Dploiement de la servler web.xml
Fichier web.xml :
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
"http://java.sun.com/dtd/web-app_2_2.dtd">
<web-app>
<display-name>StrutsWAR</display-name>
<servlet>
<servlet-name>action</servlet-name>
<servlet-class> org.apache.struts.action.ActionServlet
</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>2</param-value>
</init-param>
<init-param>
<param-name>application</param-name>
<param-value>ApplicationResources</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
Web.xml
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<taglib>
<taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/struts-html.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-html.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/struts-logic.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/struts-template.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-template.tld</taglib-location>
</taglib>
</web-app>

Concepts gnraux de struts
Struts tant bas sur un architecture MVC 2, un
seul contrleur principal se doit d'tre dfinit.
Le contrleur de notre application est donc la
servlet org.apache.struts.action.ActionServlet.
Ce contrleur est configur travers le fichier
struts-config.xml
Dans le descripteur de dploiement web.xml,
nous avons associ toutes les requtes HTTP qui
se termine par .do cette servlet.
Ensuite on dclare les librairies de tag XML que
nous allons utiliser pour faciliter la rdaction des
pages JSP.
Concepts gnraux de struts
Dans le fichier de configuration struts-config.xml, chaque
URL doit tre associe une action
Pour chaque requte, le contrleur place les donnes
envoyes par le client dans un objet quon appelle The
Form Bean (Bean de formulaire). Cest un objet dune
classe que vous allez dvelopper et qui hrite de la
classe ActionForm.
Ensuite le contrleur fait appel une objet de la classe
daction. Une autre classe que vous aller dvelopper qui
hrite de la classe Action.
Dans cette classe, nous pouvons implmenter les actions
excuter pour cette requte. Ces actions font gnralement
appel au modle.
Pour placer ensuite les donnes afficher dans le bean de
formulaire
A la fin, elle fait une redirection vers la vue correspondante qui
est une page JSP qui se servira du bean de formulaire pour
afficher les rsultats.
Cette classe daction est appele galement un sous contrleur.
Concepts gnraux de struts
Les vues sont gnralement des pages JSP qui
utilisent les librairies de tags offertes par struts.
Ces fichiers on des extensions .tld
Enfin, pour ce qui est du modle, le Framework
Struts ne vous impose rien et aucune classe ne
vous est fournie.
Cela vous laisse une totale libert sur les choix
des technologies utiliser pour l'implmentation
du modle. Ainsi, vous pouvez opter pour un
codage basique en implmentant des
composants Java standard.
Mais si le besoin s'en fait ressentir, vous pouvez
aussi opter pour l'utilisation de composants EJB
(Enterprise Java Bean).
Exemple dapplication
Supposant que nous souhaitions crer une
application web, base sur struts, qui permet
de faire
Lauthentification dun utilisateur enregistr dans
une base de donne.
Lajout et laffichage des utilisateurs.
Chaque utilisateur est dfini par un
identifiant, le login, le mot de passe, email et
sa ville
Base de donnes
Table UTILISATEURS
Modle
Une classe persistante Utilisateur,
Une classe non persistante GestUsers
qui contient les mthode mtiers
et une classe utilitaire qui contient les
paramtres de connexion la base de
donnes.
Authentification
Le formulaire : Login.jsp
Login.jsp
<%@ page language="java" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html"%>
<html>
<body>
<html:form action="login.do" method="post" >
Login:<html:text property="login" /><br/>
Pass :<html:password property="pass" /><br/>
<html:submit value="Valider" />
</html:form>
</body>
</html>
Action Form : LoginForm.java
Ce bean permet de
stocker les donnes du
formulaire savoir login
et pass
Il permet galement de
stocker lobjet
Utilisateur sil existe
dans la base de
donnes
Laction associe: LoginAction.java
import javax.servlet.http.*;
import mod.app.GestUsers;
import mod.app.Utilisateur;
import org.apache.struts.action.*;
public class LoginAction extends Action {
public ActionForward execute(
ActionMapping map, ActionForm form, HttpServletRequest request,
HttpServletResponse response)throws Exception{
LoginForm lf=(LoginForm)form;
GestUsers gu=new GestUsers();
Utilisateur u=gu.loadUser(lf.getLogin(),lf.getPass());
if(u!=null){
lf.setUser(u);
return map.findForward("bienvenue");
}
else{
return map.findForward("notAutorised");
}
}
}
Struts-config.xml
<struts-config>
<form-beans>
<form-bean name="logFor" type="LoginForm"/>
</form-beans>
<global-forwards>
<forward name="bienvenue" path="/BienVenue.jsp"/>
<forward name="notAutorised" path="/Login.jsp"/>
</global-forwards>
<action-mappings>
<action path="/login name="logFor" type="LoginAction
scope="request" />
</action-mappings>
<message-resources parameter="ApplicationResources"/>
</struts-config>
Bienvenue.jsp
<%@ page language="java" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<html>
<head>
<title>Bien Venue</title>
</head>
<body bgcolor="#FFFFFF">
<h3>
Id User :<bean:write name="logFor" property="user.idUser" /><br/>
Login :<bean:write name="logFor" property="user.login" /><br/>
Pass :<bean:write name="logFor" property="user.pass" /><br/>
Email:<bean:write name="logFor" property="user.email" /><br/>
Ville :<bean:write name="logFor" property="user.ville" /><br/>
</h3>
</body>
</html>
Ajout et affichage des utilisateurs
Aperu de la vue raliser
Form bean : UsersForm.java
Daprs notre vue, nous avons, dans
le form bean, des attributs qui
permettent de :
stocker les donnes du formulaire :
login, pass, email et ville
Stocker les utilisateurs afficher dans
un vecteur. La proprit users, de
type Vector serait utilise pour ce fait
Action associe : UsersAction.java
import javax.servlet.http.*;
import mod.app.GestUsers;
import mod.app.Utilisateur;
import org.apache.struts.action.*;
public class UsersAction extends Action {
public ActionForward execute( ActionMapping map, ActionForm form,
HttpServletRequest request, HttpServletResponse response)throws
Exception
{
UsersForm uf=(UsersForm)form;
GestUsers gu=new GestUsers();
gu.addUser(uf.getLogin(),uf.getPass(),uf.getEmail(),uf.getVille());
uf.setUsers(gu.selectAll());
return map.findForward("afficheUsers");

}
}
Mise jour de struts-config.xml
<struts-config>
<form-beans>
<form-bean name="logFor" type="LoginForm"/>
<form-bean name="usersForm" type="UsersForm"/>
</form-beans>
<global-forwards>
<forward name="bienvenue" path="/BienVenue.jsp"/>
<forward name="notAutorised" path="/Login.jsp"/>
<forward name="afficheUsers" path="/Affiche.jsp"/>
</global-forwards>
<action-mappings>
<action path="/login" name="logFor" type="LoginAction" scope="request"
input="/Login.jsp" validate="true />
<action
path="/addUser"
name="usersForm"
type="UsersAction"
scope="request"
/>
</action-mappings>
<message-resources parameter="ApplicationResources"/>
</struts-config>
Implmentation de la vue : Affiche.jsp
<%@ page language="java" %>
<%@ page import="mod.app.*" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html"%>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean"%>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic"%>
<!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en">
<html><head><title>Utilisateurs</title></head>
<body bgcolor="#FFFFFF">
<table border="1" width="75%" align="center">
<tr>
<td>Id</td><td>Login</td><td>Pass</td><td>Ville</td><td>Email</td>
</tr>
<html:form action="addUser.do" >
<tr>
<td></td>
<td><html:text property="login" /></td>
<td><html:text property="pass" /></td>
<td><html:text property="email" /></td>
<td><html:text property="ville" /></td>
<td><html:submit value="Ajouter" /></td>
</tr>
</html:form>
Implmentation de la vue : Affiche.jsp (suite)

.(suite)
<logic:iterate id="user" name="usersForm" property="users"
type="Utilisateur" >
<tr>
<td><bean:write name="user" property="idUser" /></td>
<td><bean:write name="user" property="login" /></td>
<td><bean:write name="user" property="pass" /></td>
<td><bean:write name="user" property="email" /></td>
<td><bean:write name="user" property="ville" /></td>
</tr>
</logic:iterate>
</body>
</html>
Validation de formulaires
Un des problmes classique grer, si
vous fournissez des formulaires Web,
consiste valider que les donnes
ncessaires ont bien t renseignes.
Le framework Struts propose, dans cet
objectif, des mcanismes directement
intgrs dans l'architecture de base.
Classe ActionForm
La classe ActionForm dfinie une mthode validate :
A ce niveau, le corps de cette mthode est vide.
Celle-ci accepte deux paramtres comme le montre
l'exemple ci-dessous.
Le framework Struts invoque automatiquement cette
mthode aprs avoir charg les donnes du
formulaire dans le bean, mais avant l'invocation de la
mthode execute.
En fait, la mthode execute ne sera invoque que et
uniquement que si la mthode de validation ne
dtecte aucune erreur dans la saisie du formulaire.
Mthode validate() de ActionForm
public ActionErrors validate(
ActionMapping mapping,
HttpServletRequest request)
{
ActionErrors errors = new ActionErrors();
if (this.getUsername() == null ||
this.getUsername().equals("")
errors.add("username", new ActionError("x"));

System.out.println("Error : bad username");}
if (this.getPassword() == null ||
this.getPassword().equals("")) {
errors.add("password",new ActionError("y"));

System.out.println("Error : bad password");}
return errors;
}
Modification du fichier de
configuration
<action-mappings>
<action path="/login
name="LoginForm"
type="LoginAction"
input="/Login.jsp"
validate="true">
</action>
</action-mapping>
<message-resources parameter="ressources.miage"/>


Fichier de ressources
/WEB-INF/classes/ressources/miage.properties
x=<li>Vous devez indiquer un Login</li>
y=<li>Vous devez indiquer un Mot de passe</li>
Ce fichier a pour rle dassurer la correspondance entre les
identifiants des erreurs et les messages afficher.
En utilisant la librairie struts-bean.tld, on peut affichier la valeur
dune cl en crivant:
<bean:message key="x"/>
Ce qui permettra dafficher la valeur de la cl x :
<li>Vous de devez indiquer un login</li>
Pour afficher les erreurs dans la page correspondant lattribut
input de llment action cd. dans la page Login.jsp, on crit
<html:errors />

Internationalisation via Struts
Outre la mise en uvre d'une architecture MVC, Struts permet
aussi de prendre en charge l'internationalisation de vos
applications Web.
Cela signifie que vous avez votre disposition un mcanisme
simple permettant de gnrer un contenu adapt la
localisation de l'utilisateur.
Notez aussi, ce sujet, qu'il n'y a pas que les textes qui peuvent
tre amens changer d'une langue une autre. Les images
aussi peuvent varier.
Effectivement, si l'on considre une image associe au concept
de mails : les franais prfreront voir une petite lettre alors
que les amricains reprendront la symbolique de bote lettre.
Mais, si l'on y rflchit, vis--vis du tag <IMG> c'est le contenu
du paramtre src qui devra varier : donc une chane de
caractres.
Internationalisation via Struts
La mise en uvre de l'internationalisation passe par
la dfinition de fichiers de ressources.
Chacun des fichiers sera associ une langue
particulire : cette information se retrouvera dans le
nom du fichier.
Tous les noms de fichiers de ressources devront avoir
le mme prfixe. Celui-ci est spcifi dans le fichier
web.xml sous forme de paramtre de la servlet de
contrle.
Les noms se continuent avec un caractre _ puis le
code de la langue (cod sur deux caractres) et enfin
ils se terminent via l'extension .properties.
Dfinition des fichiers de
resources
Ces fichiers de ressources se doivent d'tre placs dans le
rpertoire classes de votre application Web pour pouvoir tre
pris en charge par le serveur.
Ils contiennent, comme leur nom l'indique, des ressources : en
fait il s'agit de paires de donnes cl/valeur. Dans votre
programme, vous rfrencerez les cls afin d'injecter les valeurs
associes.
Dans l'exemple ci-dessous, deux fichiers de ressources sont
dfinis. Ils sont, certes, trs simplistes : une seule ressource est
dfinie dans chaque fichier. Mais notez bien que la cl est
identique d'un fichier un autre.
Fichier "ApplicationResources.properties"
CaddieVirtuel.Test.Title=Virtual Caddy
Fichier "ApplicationResources_fr.properties"
CaddieVirtuel.Test.Title=Caddie Virtuel
Web.xml
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet
</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>2</param-value>
</init-param>
<init-param>
<param-name>application</param-name>
<param-value>ApplicationResources</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
Utilisation des ressources
Le framework Struts dfinit plusieurs possibilits d'utilisation de
ces ressources.
Citons notamment l'emploie du tag <bean:massage> dfinit
dans la librairie /WEB-INF/struts-bean.tld.
Ce tag injecte la valeur associe une cl donne : vous
spcifiez la cl recherche par l'intermdiaire de l'attribut key.

<html:html locale="true">
<!-- Suite de la page -->
Injection d'une valeur :
<bean:message key="searchKey" />
<!-- Suite de la page -->
</html:html>
Le tag <html:html> accepte notamment un paramtre local.
Fixez lui la valeur true afin d'autoriser l'internationalisation.
Autres concepts Struts
La bibliothque de tags struts-logic:
Cette librairie de tags permet principalement
d'obtenir des structures de contrles au sein
des JSP.
Vous pouvez ainsi excuter des boucles,
pour mettre en forme des ensembles de
donnes, excuter des conditions et de
tester des expressions rgulires.

La bibliothque de tags struts-logic:
Exemple:
<table width="100%" border="1">
<tr>
<th>Identifiant article</th>
<th>Dsignation</th>
<th>Marque</th>
<th>Prix unitaire</th>
</tr>
<logic:iterate id="art" name="CaddyForm" property="articles"
type="Article" >
<tr>
<td><bean:write name="art" property="idArticle" /></td>
<td><bean:write name="art" property="designation" /></td>
<td><bean:write name="art" property="marque" /></td>
<td><bean:write name="art" property="price" /></td>
</tr>
</logic:iterate>
</table>
:CaddyForm
articles:Vector


:Article
idArticle
designation
marque
price
:Article
idArticle
designation
marque
price
La bibliothque de tags
struts-logic:
L'exemple prcdent vous montre comment prsenter
un ensemble de donnes sous forme de tableau HTML.
Pour ce faire, nous utilisons le tag Struts
<logic:iterate>.
Ce tag accepte quelques attributs. Citons notamment
name : permet de retrouver un bean partir de la
requte
property : permet de dire qu'elle est la proprit qui
retourne la collection d'lments traiter.
Le code HTML compris entre les tags <logic:iterate> et
</logic:iterate> sera rpt autant de fois qu'il y aura
d'objets dans la collection.


La bibliothque de tags
struts-logic:
Dans ce second exemple, une ligne de code
HTML ne sera injecte dans le flux HTML que
si la proprit age d'un bean nomm User,
est suprieur 17 ans. Dans le cas contraire,
rien ne sera inject dans le flux.
<logic:greaterThan
name="User" property="age"
value="17">
<B>Vous tes majeurs</B>
</logic:greaterThan>

Das könnte Ihnen auch gefallen