Академический Документы
Профессиональный Документы
Культура Документы
Requête HTTP
Controleur
Controleur Construit
1
(Servlet)
(Servlet) Modifie
2 Modèle
Modèle Driver
Transfert (Java
(JavaBean)
Bean) JDBC
Réponse HTTP
Vue
Vue 3 Consulte
(JSP)
(JSP)
… …
avec une librairie : exécution est dirigée par le code écrit par le
développeur qui fait appel aux classes de la librairie
Requête HTTP
Controleur
Controleur Construit
1
(Servlet)
(Servlet) Modifie
2 Modèle
Modèle Driver
Transfert (Java
(JavaBean)
Bean) JDBC
Réponse HTTP
Vue
Vue 3 Consulte
(JSP)
(JSP)
Struts 1.x
– http://struts.apache.org/1.3.8 http://struts.apache.org/1.3.8/apidocs/index.html
guide
utilisateur
ActionForm
ActionForm
struts-
struts-config.xml
struts-
struts-config.xml Font le lien
ActionForm1
ActionForm1
ActionForm2
entre le
consulte ActionForm2 contrôleur et la
La requête est transmise logique métier Serveur
au contrôleur SGBD
1
ActionServlet 2 Action
ActionServlet Action
Controleur générique
Action1
Action1
(étend javax.servlet.
Action2
Action2
http.HttpServlet)
4
« package» et aiguille
le trafic HTTP vers le Modèle
Modèle
Contrôleur (Java
gestionnaire approprié (JavaBean)
Bean)
3
Choix et paramétrage de la vue selon Vue
la réponse de l'action et l’état du Vue Création
contrôleur (JSP)
(JSP) modification des
objets modèle
Génération de la
page HTML
5
page Modèle
page.jsp
.jsp Modèle
(Java
(JavaBean)
6
Bean)
Envoi au client de la consulte
présentation issue de la
vue
JSTL
Struts propose des JSTL properties.en
properties.en
bibliothèques de Tags Struts
pour faciliter la Struts properties.fr
html, logic,beans
html, logic,beans properties.fr
construction des
pages JSP …biblio
…biblioperso
perso Ressources
Bibliothèques de tags
Fichiers de ressources
Vue pour messages
utilisés dans les vues
serveur Web
Serveur SGBD
Fichiers de
configuration
struts
Fichier de
ressources
pour les
messages
Librairies struts
© Philippe GENOUD UJF Février 2010 12
Configuration
Configuration :: web.xml
web.xml
Définition du contrôleur de l'application dans le fichier web.xml
Le contrôleur est une servlet générique ActionServlet
ou sous classe d'ActionServlet.
<web-app
<web-app version="2.5"
version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"...>
xmlns="http://java.sun.com/xml/ns/javaee"...>
<servlet>
<servlet>
<servlet-name>action</servlet-name>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<init-param>
<param-name>config</param-name>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
</init-param>
...
...
</servlet>
</servlet>
<servlet-mapping>
<servlet-mapping> La localisation du fichier de
<servlet-name>action</servlet-name>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern> configuration struts-config.xml
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</servlet-mapping>
...
...
</web-app>
</web-app>
accueil.html
formulaireAnneeMatiere.jsp
formulaireAnneeMatiere.do
ActionServlet
ActionServlet .jsp
struts-config.xml
<struts-config>
<struts-config> définit le nom de l’URL
...
... correspondant à l'action
<action-mappings>
<action-mappings> (suffixe « .do » implicite)
<action path="/formulaireAnneeMatiere"
forward="/formulaireAnneeMatiere.jsp"/>
</action-mappings>
</action-mappings>
...
... l’URL à laquelle est relayée
</struts-config>
</struts-config> la demande
1
Clic bouton droit
notesAnneeMatiere.do
tableau.jsp
formulaireAnneeMatiere.jsp
HistogramImager (servlet)
ActionServlet
ActionServlet
NotesAnneeMatiere NotesAnneeMatiereForm
NotesAnneeMatiere NotesAnneeMatiereForm
notesAnneeMatiere.do?
annee=2005&
matiere=BD&
Instancie et initialise
struts-
struts-config.xml
présentation=tableau
struts-
struts-config.xml setAnnee(…), setMatiere(…) …
formulaireAnneeNote.jsp validate(…)
.jsp ActionErrors
Histogramme
Si erreur Consulte
sinon execute(…) getAnnee(…), getMatiere(…) Histogramme
Initialise le modèle
tableau.jsp ActionForward
.jsp
struts-
struts-config.xml
struts-
HistogramImager Selon struts-config.xml
l'ActionForward
NotesAnneeMatiereForm
Hérite de org.apache.struts.action.ActionForm NotesAnneeMatiereForm
Chaque paramètre du
public
public void
void setAnnee(String
setAnnee(String annee)
annee) {{ formulaire est défini
this.annee = annee;
this.annee = annee; comme une propriété
}} modifieur et
accesseur pour de l'objet ActionForm
public
public String
String getAnnee()
getAnnee() {{ la propriété
return
associé qui doit être
return annee;
annee; un JavaBean
}
}
public void setMatiere(String matiere) {
public void setMatiere(String matiere) {
this.matiere
this.matiere == matiere;
matiere;
}
}
...
...
}}
(annee ==
== null || annee.length()
annee.length() << 1)
if
if (annee null || 1) {{
errors.add("Année", new ActionMessage("error.annee.required"));
errors.add("Année", new ActionMessage("error.annee.required"));
}}
else {
else { Selon les paramètres ajout de
try {
try { messages d'erreur
numeroAnnee = Integer.parseInt(annee);
numeroAnnee = Integer.parseInt(annee);
}} catch
catch (NumberFormatException
(NumberFormatException e) e) {{
errors.add("Année",
errors.add("Année", newnew ActionMessage("error.annee.isNotANumber"));
ActionMessage("error.annee.isNotANumber"));
}}
}}
if
if ((!matiere.equals("graphic"))
((!matiere.equals("graphic")) &&&& ((!matiere.equals("tableau"))
((!matiere.equals("tableau")) {{
errors.add("Année", new ActionMessage("error.annee.required"));
errors.add("Année", new ActionMessage("error.annee.required"));
}} Le message est défini dans
un fichier .properties
return errors;
return errors; Renvoie des erreurs (vide si la validation a réussi)
}}
}}
pl2/notes/ApplicationResource.properties
errors.header=<UL>
errors.header=<UL>
errors.prefix=<LI><span
errors.prefix=<LI><span style="color:
style="color: red">
red">
errors.suffix=</span></LI>
errors.suffix=</span></LI>
...
...
error.annee.required=Indiquez
error.annee.required=Indiquez l'année
l'année
error.annee.isNotANumber=L'année doit être un nombre
error.annee.isNotANumber=L'année doit être un nombre
...
...
formulaireAnneeMatiere.jsp
<%@
<%@ taglib
taglib uri="http://struts.apache.org/tags-html"
uri="http://struts.apache.org/tags-html" prefix="html"
prefix="html" %> %>
...
...
<html>
<html>
<body>
<body>
<H1>Histogramme
<H1>Histogramme des
des notes</H1>
notes</H1>
<HR>
<HR>
<form action="notesAnneeMatiere.do" method="post">
<form action="notesAnneeMatiere.do" method="post">
…
…
</form>
</form>
<HR>
<HR> Tag de bibliothèque html
<html:errors/>
<html:errors/> de Struts pour afficher les
</body>
</body> messages d'erreur
</html>
</html>
<struts-config>
<struts-config> Nom pour identifier
<form-beans> l'action form
<form-beans>
<form-bean
<form-bean
name="NotesAnneeMatiereForm"
name="NotesAnneeMatiereForm"
type="pl2.notes.struts.forms.NotesAnneeMatiereForm"/>
type="pl2.notes.struts.forms.NotesAnneeMatiereForm"/>
...
...
</form-beans> Nom de la classe Java
</form-beans>
...
...
<struts-config>
<struts-config>
1
nom de la classe
NotesAnneeMatiere
private final static String HISTO_TABLE = "histotableau"; NotesAnneeMatiere
private final static String HISTO_GRAPHIC = "histographique";
}
}
Clic
bouton
droit 3
1
NotesAnneeMatiere
private final static String HISTO_TABLE = "histotableau"; NotesAnneeMatiere
private final static String HISTO_GRAPHIC = "histographique";
NotesAnneeMatiereActionForm f =
(NotesAnneeMatiereForm) form; Que se passe-t'il si une
DAOException est levée ?
INotesDAO notesDAO = DAOFactory().getNoteDAO();
Histogramme histo = notesDAO.getHistogramme(f.getNumeroAnnee(), f.getMatiere() );
request.setAttribute("notes", histo);
if (f.getPresentation().equals("graphic")) {
return mapping.findForward(HISTO_GRAPHIC);
} else {
return mapping.findForward(HISTO_TABLE);
}
}
}
Servlet Exception
Cause mère
pl2/notes/ApplicationResource.properties
erreur_1.jsp
struts-config.xml
le gestionnaire
d'exceptions
invoqué
© Philippe GENOUD UJF Février 2010 34
Exceptions
Une exception est traitée par le gestionnaire d'exception le plus spécifique
1 2
HTML Tags pour création d'interface utilisateur HTML, en particulier pour créer des formulaires de saisie
Logic Tags pour la génération conditionnelle de texte, génération répétitive de texte en itérant sur
des collections d'objets, gestion du flux de contrôle de l'application
Bean Tags pour la définition de nouveaux objets JavaBeans dans différentes portées (application,
session, requête…) et à partir de différentes sources
Tags pour afficher un bean (ou une proriété d'un bean) sur la réponse de sortie.
Nested Tags qui étendent les tags de base de Struts pour leur mise en relation lors d'imbrication
Il faudrait intégrer
dans la page de la
logique permettant de
réaffecter les
éléments du formulaire
avec les valeurs qui
avaient été transmises
En cas de saisie
incorrecte on
revient sur cette
page qui affiche
alors les messages
d'erreur