frameworkMVC pour applications Web Servlets–JSP - imag
Transcript of frameworkMVC pour applications Web Servlets–JSP - imag
© Philippe GENOUD UJF Février 2010 1
framework MVCpour applications Web
Servlets – JSP
framework MVCpour applications Web
Servlets – JSP
© Philippe GENOUD UJF Février 2010 2
Rappel Architecture MVCRappel Architecture MVC
Controleur(Servlet)
Controleur(Servlet)
ConstruitModifie
Consulte
Transfert
1111
2222
3333
Requête HTTP
Réponse HTTP
Serveur Internet (Serveur HTTP + Serveur Servlet/JSP) Serveur SGBD
DriverJDBC
Modèle(Java Bean)
Modèle(Java Bean)
Vue(JSP)
Vue(JSP)
� Bonne séparation des différents composants d’une application Web
� Modularité – réutilisation – évolutivité
� Séparation des compétences
© Philippe GENOUD UJF Février 2010 3
Frameworks WebFrameworks Web
�nombreux frameworks pour faciliter le développement d'applications Web
� mais mettre en œuvre une "bonne" architecture MVC reste un tâche complexe
� surtout si plusieurs applications doivent profiter de cette architecture
� Dans le monde Java :
� Struts (Apache)
� Java Server Faces (SUN)
� Spring MVC
� Tapestry (Apache)
� Stripes
� Wicket (Apache)
� …
� mais aussi dans de nombreux autres langages :
� Symfony (PHP)
� Ruby On Rails (Ruby)
� Django (Python)
� Grails (Groovy)
� …
C'est quoi un framework ?
© Philippe GENOUD UJF Février 2010 4
FrameworkFramework
� Framework (cadre d'application)
"ensemble de bibliothèques et de conventions permettant le développement rapide d'applications. Il fournit suffisamment de briques logicielles et impose suffisamment de rigueur pour pouvoir produire une application aboutie et facile à maintenir. Ces composants sont organisés pour être utilisés en interaction les uns avec les autres" http://www.techno-science.net/
� Différence framework / bibliothèque (librairie)
� avec une librairie : exécution est dirigée par le code écrit par le développeur qui fait appel aux classes de la librairie
� avec un framework : exécution est dirigée par le code du framework qui fait appel au code écrit par le développeur
� le développeur doit compléter les classes et ressources préexistantes
dans le framework
© Philippe GENOUD UJF Février 2010 5
Struts c'est quoi ?Struts c'est quoi ?
Controleur(Servlet)
Controleur(Servlet)
ConstruitModifie
Consulte
Transfert
1111
2222
3333
Requête HTTP
Réponse HTTP
Serveur Internet (Serveur HTTP + Serveur Servlet/JSP) Serveur SGBD
DriverJDBC
Modèle(Java Bean)
Modèle(Java Bean)
Vue(JSP)
Vue(JSP)
� Struts : Framework open source (fondation apache) pour le développement d'applications Web Java respectant le modèle MVC
� Architecture générique pour la partie contrôleur
� Facilités pour la réalisation des vues
© Philippe GENOUD UJF Février 2010 6
Struts c'est quoi ?Struts c'est quoi ?
� Le framework Struts encourage les architectures basées sur l'approche Model
2 (une variante du modèle classique MVC appliquée aux applications web).
� Le cœur du framework Struts est une couche contrôleur
� basée sur les technologies les plus acceptées Servlet/JSP, JavaBeans,
ResourceBundles, XML.
� Struts fournit son propre composant contrôleur
� Struts intègre d'autres technologies pour offrir le Modèle et la Vue.
� Pour le Modèle, Struts peut interagir avec toutes les techniques d'accès
aux données comme JDBC, EJB (Entreprise JavaBeans), Hibernate…
� Pour la Vue, Struts n'est pas limité aux JSP, il peut fonctionner aussi avec
les Velocity Templates, le XSLT et d'autres systèmes de présentation.
© Philippe GENOUD UJF Février 2010 7
� Exemple d'application Struts
© Philippe GENOUD UJF Février 2010 8
DocumentationDocumentation� site de Struts http://struts.apache.org/
� Struts 2.x
�réécriture du framework struts
� Struts 1.x
�dernière version : 1.3.10
�version intégrée à NetBeans (6.7): 1.3.8
– http://struts.apache.org/1.3.8 http://struts.apache.org/1.3.8/apidocs/index.html
guide utilisateur
au 2/02/1020
© Philippe GENOUD UJF Février 2010 9
Modèle(Java Bean)
Modèle(Java Bean)
Architecture générale de StrutsArchitecture générale de Struts
ActionServletActionServletActionServletActionServletActionServletActionServletActionServletActionServlet
strutsstrutsstrutsstruts----config.xmlconfig.xmlconfig.xmlconfig.xmlstrutsstrutsstrutsstruts----config.xmlconfig.xmlconfig.xmlconfig.xml
Controleur générique (étend javax.servlet.http.HttpServlet)
« package» et aiguillele trafic HTTP vers le
gestionnaire approprié
consulteconsulteconsulteconsulte
Fichier xml
mapping vers les actions et les vues
ActionFormActionFormActionFormActionFormActionFormActionFormActionFormActionForm
ActionForm1ActionForm1ActionForm1ActionForm1ActionForm1ActionForm1ActionForm1ActionForm1ActionForm2ActionForm2ActionForm2ActionForm2ActionForm2ActionForm2ActionForm2ActionForm2
Regroupent les paramètres de la
requête, qu'ils peuvent valider
Vue(JSP)
Vue(JSP)
Choix et paramétrage de la vue selon la réponse de l'action et l’état ducontrôleur
4444
La requête est transmise au contrôleur 1111
traitement la requête
3333
Création modification des objets modèle
Serveur SGBD
Contrôleur
ActionActionActionActionActionActionActionAction
Action2Action2Action2Action2Action2Action2Action2Action2
Font le lien
entre le
contrôleur et la
logique métier
Action1Action1Action1Action1Action1Action1Action1Action1
2222
© Philippe GENOUD UJF Février 2010 10
Architecture générale de StrutsArchitecture générale de Struts
page .jsppage .jsp
consulteconsulteconsulteconsulte
Génération de la page HTML
Vue
5555
Envoi au client de la présentation issue de la vue
6666Modèle
(Java Bean)
Modèle(Java Bean)
properties.enproperties.en
properties.frproperties.fr
Ressources
Bibliothèques de tags
JSTLJSTL
Strutshtml, logic,beans
Strutshtml, logic,beans
…biblio perso…biblio perso
Fichiers de ressourcespour messages
utilisés dans les vues
Struts propose des bibliothèques de Tags
pour faciliter la construction des
pages JSP
© Philippe GENOUD UJF Février 2010 11
Struts par l'exemple: l’application histogramme de notesStruts par l'exemple: l’application histogramme de notes
Serveur SGBDserveur Web
Page HTML avec frPage HTML avec frPage HTML avec frPage HTML avec frééééquences quences quences quences des notes dans un tableaudes notes dans un tableaudes notes dans un tableaudes notes dans un tableau
Histogramme des notesHistogramme des notesHistogramme des notesHistogramme des notesimage image image image gifgifgifgif
© Philippe GENOUD UJF Février 2010 12
Création d'un projet StrutsCréation d'un projet Struts
Netbeans offre un support pour Struts (version 1.2.9)
Librairies struts
Fichiers de configurationstruts
Fichier de ressources pour les messages
© Philippe GENOUD UJF Février 2010 13
Configuration : web.xmlConfiguration : web.xml
� Définition du contrôleur de l'application dans le fichier web.xml
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"...>
<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>
...
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
...
</web-app>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"...>
<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>
...
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
...
</web-app>
Le contrôleur est une servlet générique ActionServlet
La localisation du fichier de configuration struts-config.xml
Toutes les URL se terminant par le suffixe ".do" sont orientées vers ce contrôleur
Possibilité de définir plusieurs contrôleurs dans une application struts
ou sous classe d'ActionServlet.
© Philippe GENOUD UJF Février 2010 14
Configuration : struts-config.xmlConfiguration : struts-config.xml
� Une action est un traitement obtenu suite au passage d'une requête au
contrôleur Struts
� Les actions sont décrites dans le fichier struts-configs
� dans la section <action-mappings>…</action-mappings>
� Au moyen de la balise <action>
� différents attributs de la balise <action> sont à renseigner selon que
� la requête et avec ou sans paramètres
� name : nom d'un objet ActionForm pour la récupération/validation des
paramètres, défini dans la section <form-beans>…</form-beans> du fichier struts-config.xml
� la requête nécessite un traitement ou une simple redirection
� path : le path (relatif au contexte de l'application) auquel est associée l'action
� type : la classe de l'objet Action qui effectue le traitement associé à la requête
� forward : url de redirection
© Philippe GENOUD UJF Février 2010 15
Simple redirectionSimple redirection
accueil.htmlformulaireAnneeMatiere.jsp
.jspActionServletActionServletActionServletActionServletActionServletActionServletActionServletActionServletformulaireAnneeMatiere.do
<struts-config>
...
<action-mappings>
</action-mappings>
...
</struts-config>
<struts-config>
...
<action-mappings>
</action-mappings>
...
</struts-config>
<action path="/formulaireAnneeMatiere"
forward="/formulaireAnneeMatiere.jsp"/>
struts-config.xml
� Action correspondant à une requête sans paramètres nécessitant une
simple redirection
définit le nom de l’URLcorrespondant à l'action (suffixe « .do » implicite)
l’URL à laquelle est relayée la demande
© Philippe GENOUD UJF Février 2010 16
Simple RedirectionSimple Redirection� assistant NetBeans pour ajout d'une action pour une requête sans paramètres
nécessitant une simple redirection
Clic bouton droit
1
2
3
© Philippe GENOUD UJF Février 2010 17
Action avec traitementAction avec traitement
formulaireAnneeMatiere.jsp
HistogramImager (servlet)
tableau.jsp
notesAnneeMatiere.do
� Action correspondant à une requête avec
paramètres nécessitant un traitement
© Philippe GENOUD UJF Février 2010 18
Action avec traitementAction avec traitement
ActionServletActionServletActionServletActionServletActionServletActionServletActionServletActionServletActionFormActionFormActionFormActionFormActionFormActionFormActionFormActionForm
NotesAnneeMatiereFormNotesAnneeMatiereFormNotesAnneeMatiereFormNotesAnneeMatiereFormNotesAnneeMatiereFormNotesAnneeMatiereFormNotesAnneeMatiereFormNotesAnneeMatiereForm
ActionActionActionActionActionActionActionAction
NotesAnneeMatiereNotesAnneeMatiereNotesAnneeMatiereNotesAnneeMatiereNotesAnneeMatiereNotesAnneeMatiereNotesAnneeMatiereNotesAnneeMatierenotesAnneeMatiere.do?
annee=2005&matiere=BD&
présentation=tableau Instancie et initialise setAnnee(…), setMatiere(…) …
validate(…)
execute(…)ConsultegetAnnee(…), getMatiere(…)
ActionErrors
Initialise le modèle
ActionForward
.jsp
.jsp
HistogramImager
tableau.jsp
formulaireAnneeNote.jsp
HistogrammeHistogrammeHistogrammeHistogrammeHistogrammeHistogrammeHistogrammeHistogrammeSi erreursinon
Selon l'ActionForward
strutsstrutsstrutsstruts----config.xmlconfig.xmlconfig.xmlconfig.xmlstrutsstrutsstrutsstruts----config.xmlconfig.xmlconfig.xmlconfig.xml
strutsstrutsstrutsstruts----config.xmlconfig.xmlconfig.xmlconfig.xmlstrutsstrutsstrutsstruts----config.xmlconfig.xmlconfig.xmlconfig.xml
© Philippe GENOUD UJF Février 2010 19
ActionFormActionFormActionFormActionFormActionFormActionFormActionFormActionForm
NotesAnneeMatiereFormNotesAnneeMatiereFormNotesAnneeMatiereFormNotesAnneeMatiereFormNotesAnneeMatiereFormNotesAnneeMatiereFormNotesAnneeMatiereFormNotesAnneeMatiereForm
ActionFormActionForm
� JavaBean qui permet de stocker les propriétés des formulaires
� Hérite de org.apache.struts.action.ActionForm
� vérifie la validité des propriétés par sa méthode validate
� ActionErrors validate(ActionMapping, HttpServletRequest)
� ActionMapping : objet image de la configuration de l’action en cours
stockée dans struts-config.xml
� HttpServletRequest : requête du client transmise par la Servlet de
contrôle
�ActionErrors : permet de retourner des messages erreurs au client
� La classe dispose également d’autres méthodes
� ActionServlet getServlet() : retourne la Servlet qui gère le contrôle
� reset(ActionMapping, HttpServletRequest) : initialise les
propriétés
© Philippe GENOUD UJF Février 2010 20
ActionFormActionForm
ActionFormActionFormActionFormActionFormActionFormActionFormActionFormActionForm
NotesAnneeMatiereFormNotesAnneeMatiereFormNotesAnneeMatiereFormNotesAnneeMatiereFormNotesAnneeMatiereFormNotesAnneeMatiereFormNotesAnneeMatiereFormNotesAnneeMatiereFormpublic class NotesAnneeMatiereForm extends ActionForm {
private String annee;
private String presentation;
private String matiere;
public void setAnnee(String annee) {
this.annee = annee;
}
public String getAnnee() {
return annee;
}
public void setMatiere(String matiere) {
this.matiere = matiere;
}
...
}
public class NotesAnneeMatiereForm extends ActionForm {
private String annee;
private String presentation;
private String matiere;
public void setAnnee(String annee) {
this.annee = annee;
}
public String getAnnee() {
return annee;
}
public void setMatiere(String matiere) {
this.matiere = matiere;
}
...
}
Chaque paramètre du formulaire est défini comme une propriétéde l'objet ActionFormassocié qui doit être un JavaBean
propriété
modifieur et accesseur pour la propriété
© Philippe GENOUD UJF Février 2010 21
public class NotesAnneeMatiereForm extends ActionForm {
private String annee;
private String presentation;
private String matiere;
...
@Override
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {
ActionErrors errors = new ActionErrors();
if (annee == null || annee.length() < 1) {
errors.add("Année", new ActionMessage("error.annee.required"));
}
else {
try {
numeroAnnee = Integer.parseInt(annee);
} catch (NumberFormatException e) {
errors.add("Année", new ActionMessage("error.annee.isNotANumber"));
}
}
if ((!matiere.equals("graphic")) && ((!matiere.equals("tableau")) {
errors.add("Année", new ActionMessage("error.annee.required"));
}
return errors;
}
}
public class NotesAnneeMatiereForm extends ActionForm {
private String annee;
private String presentation;
private String matiere;
...
@Override
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {
ActionErrors errors = new ActionErrors();
if (annee == null || annee.length() < 1) {
errors.add("Année", new ActionMessage("error.annee.required"));
}
else {
try {
numeroAnnee = Integer.parseInt(annee);
} catch (NumberFormatException e) {
errors.add("Année", new ActionMessage("error.annee.isNotANumber"));
}
}
if ((!matiere.equals("graphic")) && ((!matiere.equals("tableau")) {
errors.add("Année", new ActionMessage("error.annee.required"));
}
return errors;
}
}
ActionFormActionForm
ActionFormActionFormActionFormActionFormActionFormActionFormActionFormActionForm
NotesAnneeMatiereFormNotesAnneeMatiereFormNotesAnneeMatiereFormNotesAnneeMatiereFormNotesAnneeMatiereFormNotesAnneeMatiereFormNotesAnneeMatiereFormNotesAnneeMatiereForm
Création d'un objet erreur vide
Selon les paramètres ajout de messages d'erreur
Renvoie des erreurs (vide si la validation a réussi)
Le message est défini dans un fichier .properties
Redéfinition (overriding) de la méthode validate
© Philippe GENOUD UJF Février 2010 22
ActionFormActionForm� les messages d'erreurs sont définis dans le fichier
properties de l'application
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
...
<html>
<body>
<H1>Histogramme des notes</H1>
<HR>
<form action="notesAnneeMatiere.do" method="post">
…
</form>
<HR>
<html:errors/>
</body>
</html>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
...
<html>
<body>
<H1>Histogramme des notes</H1>
<HR>
<form action="notesAnneeMatiere.do" method="post">
…
</form>
<HR>
<html:errors/>
</body>
</html>
Tag de bibliothèque html de Struts pour afficher les messages d'erreur
errors.header=<UL>
errors.prefix=<LI><span style="color: red">
errors.suffix=</span></LI>
...
error.annee.required=Indiquez l'année
error.annee.isNotANumber=L'année doit être un nombre
...
errors.header=<UL>
errors.prefix=<LI><span style="color: red">
errors.suffix=</span></LI>
...
error.annee.required=Indiquez l'année
error.annee.isNotANumber=L'année doit être un nombre
...
errors.add("Année", new ActionMessage("error.annee.isNotANumber"));
pl2/notes/ApplicationResource.properties
formulaireAnneeMatiere.jsp
© Philippe GENOUD UJF Février 2010 23
ActionFormActionForm� l'utilisation du fichier properties facilite la localisation (i18n) de l'application
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
...
<html>
<body>
<H1> Histogramme des notes </H1>
<HR>
<form action="notesAnneeMatiere.do" method="post">
…
</form>
<HR>
<html:errors/>
</body>
</html>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
...
<html>
<body>
<H1> Histogramme des notes </H1>
<HR>
<form action="notesAnneeMatiere.do" method="post">
…
</form>
<HR>
<html:errors/>
</body>
</html>
errors.header=<UL>
errors.prefix=<LI><span style="color: red">
errors.suffix=</span></LI>
...
error.annee.required=Indiquez l'année
error.annee.isNotANumber=L'année doit être un nombre
...
formHisto.title=Histogramme de notes
errors.header=<UL>
errors.prefix=<LI><span style="color: red">
errors.suffix=</span></LI>
...
error.annee.required=Indiquez l'année
error.annee.isNotANumber=L'année doit être un nombre
...
formHisto.title=Histogramme de notes
pl2/notes/ApplicationResource.properties
<bean:message key="formHisto.title"/>
<%@ taglib uri="http://struts.apache.org/" prefix="bean" %>
errors.header=<UL>
errors.prefix=<LI><span style="color: red">
errors.suffix=</span></LI>
...
error.annee.required=Year required
error.annee.isNotANumber=Year is not a number
...
formHisto.title=Marks Histogram
errors.header=<UL>
errors.prefix=<LI><span style="color: red">
errors.suffix=</span></LI>
...
error.annee.required=Year required
error.annee.isNotANumber=Year is not a number
...
formHisto.title=Marks Histogram
pl2/notes/ApplicationResource.properties.en
un fichier ressource par langue
formulaireAnneeMatiere.jsp
© Philippe GENOUD UJF Février 2010 24
ActionFormActionForm
� Les ActionForms doivent être déclarées dans le fichier struts-config.xml
� balise <form-bean> dans la section <form-beans>…</form-beans>
<struts-config>
<form-beans>
<form-bean
name="NotesAnneeMatiereForm"
type="pl2.notes.struts.forms.NotesAnneeMatiereForm"/>
...
</form-beans>
...
<struts-config>
<struts-config>
<form-beans>
<form-bean
name="NotesAnneeMatiereForm"
type="pl2.notes.struts.forms.NotesAnneeMatiereForm"/>
...
</form-beans>
...
<struts-config>
Nom pour identifier l'action form
Nom de la classe Java
© Philippe GENOUD UJF Février 2010 25
ActionFormActionForm� assistant NetBeans pour créer une ActionForm
1
2
3
nom de la classe
© Philippe GENOUD UJF Février 2010 26
ActionAction
� Permet d'associer un traitement à une requête
� Hérite de org.apache.struts.action.Action
� Effectue le traitement par sa méthode execute
� ActionForward execute(ActionMapping,
ActionForm,HttpServletRequest, HttpServletResponse)
� ActionMapping : objet image de la configuration de l’action en
cours stockée dans struts-config.xml
� ActionForm : JavaBean qui stocke l’information du formulaire
� HttpServletRequest : référence de la requête
� HttpServletResponse : référence de la réponse
� ActionForward :objet identifiant la destination que le contrôleur
(l' ActionServlet) doit choisir
ActionActionActionActionActionActionActionAction
NotesAnneeMatiereNotesAnneeMatiereNotesAnneeMatiereNotesAnneeMatiereNotesAnneeMatiereNotesAnneeMatiereNotesAnneeMatiereNotesAnneeMatiere
© Philippe GENOUD UJF Février 2010 27
ActionAction
public class NotesAnneeMatiere extends Action {
private final static String HISTO_TABLE = "histotableau";
private final static String HISTO_GRAPHIC = "histographique";
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws Exception {
NotesAnneeMatiereActionForm f =
(NotesAnneeMatiereForm) form;
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);
}
}
}
Choix de la prochaine redirection
Le modèle est transmis via la requête
Constructiondu modèle
Récupération de l'objet ActionForm grâce au
paramètre form
ActionActionActionActionActionActionActionAction
NotesAnneeMatiereNotesAnneeMatiereNotesAnneeMatiereNotesAnneeMatiereNotesAnneeMatiereNotesAnneeMatiereNotesAnneeMatiereNotesAnneeMatiere
© Philippe GENOUD UJF Février 2010 28
ActionAction
� Declaration de l'Action dans le fichier struts-config.xml
<struts-config>
<form-beans>
<form-bean name="NotesAnneeMatiereActionForm"
type="pl2.notes.struts.forms.NotesAnneeMatiereActionForm"/>
</form-beans>
<action-mappings>
<action forward="/formulaireAnneeMatiere.jsp" path="/formulaireAnneeMatiere"/>
<action path="/notesAnneeMatiere"
type="pl2.notes.struts.actions.NotesAnneeMatiere"
name="NotesAnneeMatiereForm"
input="/formulaireAnneeMatiere.jsp"
scope="request" >
<forward name="histotableau" path="/tableau.jsp"/>
<forward name="histographique" path="/histographic"/>
</action>
</action-mappings>
<struts-config>
<form-beans>
<form-bean name="NotesAnneeMatiereActionForm"
type="pl2.notes.struts.forms.NotesAnneeMatiereActionForm"/>
</form-beans>
<action-mappings>
<action forward="/formulaireAnneeMatiere.jsp" path="/formulaireAnneeMatiere"/>
<action path="/notesAnneeMatiere"
type="pl2.notes.struts.actions.NotesAnneeMatiere"
name="NotesAnneeMatiereForm"
input="/formulaireAnneeMatiere.jsp"
scope="request" >
<forward name="histotableau" path="/tableau.jsp"/>
<forward name="histographique" path="/histographic"/>
</action>
</action-mappings>
URL correspondant à l'action (suffixe « .do » implicite)
Classe de l'action
Nom de l'ActionFormassociée
Vue vers laquelle le contrôleur redirige en cas d'echec de la validation
Chemin de redirectionEtiquette de redirection
if (f.getPresentation().equals("graphic")) {
return mapping.findForward("histotagraphique");
} else {
return mapping.findForward("histotableau");}
.jsp
HistogramImagertableau.jsp
<servlet>
<servlet-name>graphic</servlet-name>
<servlet-class>
pl2.notes.servlets.HistogramImager
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>graphic</servlet-name>
<url-pattern>/histographic</url-pattern>
</servlet-mapping>
web.xml
© Philippe GENOUD UJF Février 2010 29
ActionAction� assistant NetBeans pour créer une Action
1
2
3
© Philippe GENOUD UJF Février 2010 30
ActionAction� assistant NetBeans pour créer une Action suite
Clic bouton droit
1
3
2
© Philippe GENOUD UJF Février 2010 31
ExceptionsExceptions
public class NotesAnneeMatiere extends Action {
private final static String HISTO_TABLE = "histotableau";
private final static String HISTO_GRAPHIC = "histographique";
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws Exception {
NotesAnneeMatiereActionForm f =
(NotesAnneeMatiereForm) form;
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);
}
}
}
ActionActionActionActionActionActionActionAction
NotesAnneeMatiereNotesAnneeMatiereNotesAnneeMatiereNotesAnneeMatiereNotesAnneeMatiereNotesAnneeMatiereNotesAnneeMatiereNotesAnneeMatiere
Que se passe-t'il si une DAOException est levée ?
l'exception est relancée
© Philippe GENOUD UJF Février 2010 32
ExceptionsExceptions
� Si l'exception est relancée et qu'aucun traitement n'est mis en place pour celle-ci, une ServletException est créée par le contrôleur , chaînée avec l'exception
originale et relancée,
Cause mère
Servlet Exception
© Philippe GENOUD UJF Février 2010 33
ExceptionsExceptions
� Possibilité de mettre en oeuvre un traitement spécifique des exceptions
� en redirigeant l'application vers une page spécifique
erreur_1.jsp
struts-config.xml
pl2/notes/ApplicationResource.properties
la ressource vers laquellel'application est redirigée
le type de l'exceptionconcernée
clé pour message d'erreurdans le fichier ressources
© Philippe GENOUD UJF Février 2010 34
ExceptionsExceptions� Possibilité de mettre en oeuvre un traitement spécifique des exceptions
� en exécutant un gestionnaire d'erreur : une classe héritant de org.apache.struts.actions.ExceptionHandler
struts-config.xml
le lien entre un gestionnaire d'erreur et un type d'erreur est effectué dans le
fichier struts-config.xml
le gestionnaire d'exceptions
invoqué
le type de l'exceptionconcernée
la redirection s'effectue à l'aide d'un élément forward défini dans le fichier
struts-config.xml
La redirection peut être vers une action ou une page jsp
redéfinition de la méthode execute
© Philippe GENOUD UJF Février 2010 35
ExceptionsExceptions
� Une exception est traitée par le gestionnaire d'exception le plus spécifique
Exceptions de type DAOException(classe DAOException ou n'importe quelle sous classe de DAOException)
Exceptions de n'importe quel autre type
© Philippe GENOUD UJF Février 2010 36
ExceptionsExceptions
� Possibilité de rédéfinir un gestionnaire spécifique au niveau d'une action
gestionnaire général pour les DAOException
gestionnaire spécifique pour les DAOException levées par l'action
notesAnneeMatière
© Philippe GENOUD UJF Février 2010 37
ExceptionsExceptions
� assistant NetBeans pour définir un gestionnaire d'exceptions
Clic bouton droit
1
3
2
struts-config.xml
© Philippe GENOUD UJF Février 2010 38
Struts TagLibsStruts TagLibs
� Struts propose des bibliothèques de Tags Personnalisés qui aident les
développeurs d'applications basées sur des formulaires
� Struts propose 4 bibliothèques de tag
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 sourcesTags 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
© Philippe GENOUD UJF Février 2010 39
Struts TagLibsStruts TagLibs� Exemple d'utilisation des tags HTML
formulaireAnnneeMatiere.jsp
En cas de saisie incorrecte on
revient sur cette page qui affiche
alors les messages d'erreur
Problème : les différents éléments du formulaire reprennent leur
valeur initiale
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
© Philippe GENOUD UJF Février 2010 40
Struts TagLibsStruts TagLibs� Exemple d'utilisation des tags HTML
formulaireAnnneeMatiere.jsp
Les tags HTML de Sruts prennent en charge l'initialisation des éléments du formulaire en cas de retour