frameworkMVC pour applications Web Servlets–JSP - imag

40
© Philippe GENOUD UJF Février 2010 1 framework MVC pour applications Web Servlets – JSP framework MVC pour applications Web Servlets – JSP

Transcript of frameworkMVC pour applications Web Servlets–JSP - imag

Page 1: 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

Page 2: frameworkMVC pour applications Web Servlets–JSP - imag

© 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

Page 3: frameworkMVC pour applications Web Servlets–JSP - imag

© 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 ?

Page 4: frameworkMVC pour applications Web Servlets–JSP - imag

© 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

Page 5: frameworkMVC pour applications Web Servlets–JSP - imag

© 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

Page 6: frameworkMVC pour applications Web Servlets–JSP - imag

© 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.

Page 7: frameworkMVC pour applications Web Servlets–JSP - imag

© Philippe GENOUD UJF Février 2010 7

� Exemple d'application Struts

Page 8: frameworkMVC pour applications Web Servlets–JSP - imag

© 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

Page 9: frameworkMVC pour applications Web Servlets–JSP - imag

© 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

Page 10: frameworkMVC pour applications Web Servlets–JSP - imag

© 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

Page 11: frameworkMVC pour applications Web Servlets–JSP - imag

© 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

Page 12: frameworkMVC pour applications Web Servlets–JSP - imag

© 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

Page 13: frameworkMVC pour applications Web Servlets–JSP - imag

© 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.

Page 14: frameworkMVC pour applications Web Servlets–JSP - imag

© 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

Page 15: frameworkMVC pour applications Web Servlets–JSP - imag

© 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

Page 16: frameworkMVC pour applications Web Servlets–JSP - imag

© 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

Page 17: frameworkMVC pour applications Web Servlets–JSP - imag

© 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

Page 18: frameworkMVC pour applications Web Servlets–JSP - imag

© 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

Page 19: frameworkMVC pour applications Web Servlets–JSP - imag

© 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

Page 20: frameworkMVC pour applications Web Servlets–JSP - imag

© 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é

Page 21: frameworkMVC pour applications Web Servlets–JSP - imag

© 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

Page 22: frameworkMVC pour applications Web Servlets–JSP - imag

© 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

Page 23: frameworkMVC pour applications Web Servlets–JSP - imag

© 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

Page 24: frameworkMVC pour applications Web Servlets–JSP - imag

© 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

Page 25: frameworkMVC pour applications Web Servlets–JSP - imag

© Philippe GENOUD UJF Février 2010 25

ActionFormActionForm� assistant NetBeans pour créer une ActionForm

1

2

3

nom de la classe

Page 26: frameworkMVC pour applications Web Servlets–JSP - imag

© 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

Page 27: frameworkMVC pour applications Web Servlets–JSP - imag

© 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

Page 28: frameworkMVC pour applications Web Servlets–JSP - imag

© 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

Page 29: frameworkMVC pour applications Web Servlets–JSP - imag

© Philippe GENOUD UJF Février 2010 29

ActionAction� assistant NetBeans pour créer une Action

1

2

3

Page 30: frameworkMVC pour applications Web Servlets–JSP - imag

© Philippe GENOUD UJF Février 2010 30

ActionAction� assistant NetBeans pour créer une Action suite

Clic bouton droit

1

3

2

Page 31: frameworkMVC pour applications Web Servlets–JSP - imag

© 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

Page 32: frameworkMVC pour applications Web Servlets–JSP - imag

© 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

Page 33: frameworkMVC pour applications Web Servlets–JSP - imag

© 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

Page 34: frameworkMVC pour applications Web Servlets–JSP - imag

© 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

Page 35: frameworkMVC pour applications Web Servlets–JSP - imag

© 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

Page 36: frameworkMVC pour applications Web Servlets–JSP - imag

© 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

Page 37: frameworkMVC pour applications Web Servlets–JSP - imag

© 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

Page 38: frameworkMVC pour applications Web Servlets–JSP - imag

© 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

Page 39: frameworkMVC pour applications Web Servlets–JSP - imag

© 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

Page 40: frameworkMVC pour applications Web Servlets–JSP - imag

© 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