J M G ibJean‐Marc GeibCedric Dumoulin
Documentationhtt // t ti i / i /d / t/ i http://static.springsource.org/spring/docs/current/spring‐framework‐reference/html/mvc.html
Tutorial Tutorial http://viralpatel.net/blogs/tutorial‐spring‐3‐mvc‐introduction spring mvc framework/introduction‐spring‐mvc‐framework/
Download Spring‐frameworkhtt // i / i http://www.springsource.org/spring‐framework#download
Utiliser 3 1 3 Utiliser 3.1.3
Le cœur de l’environnement Spring est un « conteneur léger »
Un conteneur léger sert à contenir un ensemble d’objets instanciés et initialisés, formant un contexte initial (ou une hiérarchie de contextes) pour une application.
Ce contexte initial est souvent construit à partir d’une description( l) dé i l bj à é l l i i i l lexterne (xml) décrivant les objets à créer, les valeurs initiales et les
dépendances entre objets.
Les dépendances (liens) entre objets sont automatiquement créées à partir de la description (on parle d’injection de dépendances) et non par les objets eux-mêmes par programmation.
C’est le Design Pattern de l’Inversion du Contrôle : IoCg
Exemple simplifié:class Personne { String nom; Voiture car; }class Voiture {String nom;}
Exemple simplifié:
Avec les classes:
et la description de contexte Spring:
Le contexte initial de l’application dans le conteneur SPRING sera:Le contexte initial de l application dans le conteneur SPRING sera:
user
Personne
nom:jean
Voiture
nom:megane vehiculejcar: nom:megane
SpringMVC est un framework de présentation, pour application WEB, suivant le modèle MVC, et fondé sur le conteneur léger de SPRING
Dans le cas de SpringMVC le conteneur va servir à créer:
et fondé sur le conteneur léger de SPRING
p g-Le contexte de l’application Web-Les objets traitant les requêtes (Controller)-Les objets créant les pages HTML (View)-Les objets données des formulaires (Command)-Les liens avec les couches métiers et BD-Et pleins d’autres
-Le mapping des URL vers les contrôleurs-Le mapping des vues , etc.
L’inversion du contrôle permet ensuite de changer le comportementde l’application, en modifiant la description xml du conteneur, sans changer les éléments programmés!c a ge es é é e s p og a és
Retour sur le modèle MVC
Une application 3tier classique:
U li ti 3ti MVCUne application 3tier avec MVC:
La vision de SpringMVC
La org.springframework.web.servlet.DispatcherServlet est le point d’entrée g p g p pgénérique qui délègue les requêtes à des ControllerUn org.springframework.web.servlet.mvc.Controller prend en charge une requête, et utilise la couche métier pour y répondreet utilise la couche métier pour y répondre.Un Controller fabrique un modèle sous la forme d’une java.util.Map contenant leséléments de la réponse.
C fUn Controller choisit une org.springframework.web.servlet.View qui sera paramétrée par la Map pour donner la page qui sera affichée.
Controller Spring 3Spring 3.x
Controller Spring 3 Spring 3 simplifie la création des contrôleurs:
ll annotations @Controller et @RequestMapping Pas d’interface à implémenter
Le contrôleur le plus simple:p p une classe annoté @Controller plus une méthode annoté @RequestMapping
Cette méthode reçoit la requête, doit la traiter (c’est à dire fabriquer les Cette méthode reçoit la requête, doit la traiter (c est à dire fabriquer les données de réponse grâce à la couche métier) et retourner un objet ModelAndView
L’URL associée est spécifié dans le paramètre@Controllerpublic class HelloWorldController {
@RequestMapping("/helloWorld")q pp g( )public ModelAndView helloWorld() {
ModelAndView mav = new ModelAndView();mav.setViewName("helloWorld");mav.addObject("date", new Date());j , ())return mav;
}}
DispatcherServletURL
HandlerMapping MetierChoix d’un contrôleuren fonction de l’URL
MonControleur
HttpServletRequesthandleRequest ModelAndView =
HttpServletRequest
M d lN d + ModelNom de vue +
Choix d’une vueViewResolver
Vue ModelPageHTML
Choix d une vue
fournit par Spring A fournir
Exemple: 1 - Une couche métier – Class Group
public class Groupe {
private ArrayList membres;
public ArrayList getMembres() {return membres;
}
public void setMembres(ArrayList membres) {this.membres = membres;
}}
public void addMembre (String membre) {if (membres.contains(membre))
h b i ()throw new MembrePresentException();membres.add(membre);
}}}
Contrôleur Spring 3Spring 3.x
Contrôleur Spring 3@Controllerpublic class Affichage {
@ControllerPas d’interface p g
// un groupe de personnes fourni par le contexte de l'applicationprivate Groupe groupe;
à implémenter
public Groupe getGroupe() {return groupe;}
Le groupe sera injecté lors de la création du contexte
public void setGroupe(Groupe groupe) {this.groupe = groupe;}
// gestion de la requête@RequestMapping("/afficher")public ModelAndView handleRequest(HttpServletRequest request,HttpServletResponse response) throws Exception {
Nom de la vue à utiliserModelAndView mav = new ModelAndView();
mav.setViewName("vuemembres");mav.addObject("groupe", groupe);
Nom de la vue à utiliserpour générer la page
Aj t dreturn mav;}
Ajout du groupeau modèle
Exemple: 3 – une page JSP-JSTL pour afficher les membres
Affichage On retrouve
le modèleGroupe
Membres du groupe
le modèle
Membres du groupe
${personne}
Ajout
Fi hi / i / b j Fichier /views/vuemembres.jsp
Exemple: 4: définir l’application WEB:
id= WebApp_ID version= 2.5 >
testspring3
membres
On déclare la seule Servlet principale
membres
org.springframework.web.servlet.DispatcherServlet
membres*.html
Ce fichier web.xml ne change jamais.C fi hi t d l é t i WEB INFCe fichier est dans le répertoire WEB-INF
Exemple: 5 le contexte initial souhaité de l’application
groupe:PierrePaul
Injection de dépendance
g p auJacques
Une instance deAffichage
Une instance Initialisée du métier
Cela doit être décrit dans un fichier WEB-INF/membres-servlet.xml
Nom de la DispatcherServlet
Exemple : 5 - le fichier WEB-INF/membres-servlet.xml
Spring 3.x
p
pour découvrir les annotationsles annotations
Exemple : 5 - le fichier WEB-INF/membres-servlet.xml (suite)
Spring 3.x
p ( )
< t " " f " "/>
La dépendance pour injecter le groupe
MélanieMélanie Jacques
Exemple: 6 – les mappings
1 - On veut que l’URL /afficher.html déclenche notre contrôleur d’affichage.
Il faut le spécifier avec l’annotation @RequestMapping (Spring 3.x)
2 - On veut que le nom « vuemembres » désigne le fichier vuemembres.jsp
Il f t tili Vi R lIl faut utiliser un ViewResolver
Il faut les déclarer dans le fichier membres-servlet.xml
Exemple: 6 – les mappings dans membres-servlet.xml
g p gf /
Le nom de la vue est utilisé pour former le nom de la jsp
membresmembresWEB-INF
web.xmlmembres-servlet.xmle b es se e
vuesvuemembres.jsp
L’appli Web avec Spring:
j psrc
metierGroupe.java
webAffichage.java
libspring.jarstandard.jarjstl.jar
ll ti jcommons-collections.jarclasses
Lancement: http://localhost:8080/membres/afficher.html
On peut sortir le mapping des vues du fichier de configuration
/WEB-INF/vues/vues xml/WEB INF/vues/vues.xml
Fichier /WEB-INF/vues/vues.xml
/WEB-INF/vues/vuemembres.jsp/p p y
On peut créer un contexte global à l’application web utile pour y mettreOn peut créer un contexte global à l application web, utile pour y mettre une fois pour toute la liaison avec la couche métier. Il faut utiliser pour celaun fichier applicationContext.xml.
Exemple de ce fichier /WEB-INF/applicationContext.xml pour notre application
/PaulMélanieJacques
/
Et il faut demander le chargement de ce contexte dans le web.xml
org.springframework.web.context.ContextLoaderListener
...
membresmappings.propertiesWEB-INF
web.xmlmembres-servlet.xmlapplicationContext.xml
vuesvues.xmlvuemembres.jspL’appli Web avec Spring:
srcmetier
Groupe.javawebweb
Affichage.javalib
spring jarspring.jarstandard.jarjstl.jarcommons-collections jarcommons collections.jar
classes
Spring 3.x
Formulaire Met en œuvre:
b ( j ) une page web (ex: jsp) un contrôleur avec jusque deux méthodes pour traiter les requêtes get et postles requêtes get et post
un objet command pour passer les données entre le formulaire et le contrôleurformulaire et le contrôleur
Une méthode pour initialiser l’objet command
Spring 3.x
POJO annoté @Controller
GET Request
@RequestMapping(method = RequestMethod.GET) processGet(ModelMap model)
Objet
Crée ouretrouve
Formulaire
model implicite
’logicalview’viewformulaire
CommandprérempliPOST data
formulaire
@RequestMapping(method = RequestMethod.POST)protected String processPost(…)
Utilise
ObjetModelAndView
PageHTML
MetierModelAndView
Initialiser l’objet de Commandj Par une méthode annoté @ModelAttribute
@ModelAttribute("commandAjout")public userInfoData initFormObject( HttpSer letRequest request) {public userInfoData initFormObject( HttpServletRequest request) {CommandAjout command = new CommandAjout();return command ;
}
Ou dans la méthode du ‘get ’
}
Ou dans la méthode du get
Spring 3.x
@Controller @RequestMapping("ajouter")public class AjoutController {
private Groupe groupe;
Injecte un objet du type demandé@Injectpublic void setGroupe(Groupe groupe) {
this.groupe = groupe;}
@RequestMapping(method = RequestMethod.GET) récupère le modèle implicite
Injecte un objet du type demandé
q pp g qprotected Object processGet(ModelMap model) {
// Create the command used to fill the jsp formCommandAjout cmd = new CommandAjout();cmd.setNouveauMembre("Entrez un nom");// Add it to the implicit model
crée l’objet command
récupère le modèle implicite
// Add it to the implicit modelmodel.addAttribute("commandAjout", cmd);
// return the logical name of the view used to render the form.return "formulaire";
la vue affichant le formulaire
é è l’ bj t d}
@RequestMapping(method = RequestMethod.POST)protected String processPost( @ModelAttribute("commandAjout") CommandAjout commandAjout, BindingResult result, SessionStatus status ) throws Exception {
récupère l’objet commandà partir du modèle implicite
pif( result.hasErrors()) {
return "formulaire";}// Add new membregroupe.addMembre(commandAjout.getNouveauMembre());status setComplete();
le résultat du bind
indique la fin de la sessionstatus.setComplete();return "confirmation";}}
indique la fin de la sessionnettoie les attributs du modèle
Spring 3.x
Formulaire Ajouter un membre
nom de l’objet dans le modèleformulaire.jsp
Nouveau Membre
nom de propriete dans l’objet
confirmation jsp
Confirmation de l'ajout
valeur de la propriété
confirmation.jsp
Nouveau Membre ${commandAjout.nouveauMembre}
< h f "< l l "/ ffi h ht l"/>">R t Retour
Spring 3.x
Il ne faut plus déclarer les contrôleurs. Ils seront découvert grâce aux annotations
Spécifie le package à scanner
membresmappings.propertiesWEB-INF
web.xmlmembres-servlet.xmlapplicationContext xmlapplicationContext.xml
vuesvues.xmlvuemembres.jspformulaire.jspconfirmation.jsp
srcL’appli Web avec Spring:
srcmetier
Groupe.javaweb
AffichageControler.javaAjoutControler.javaCommandAjout.java
liblibspring.jarstandard.jarjstl.jarcommons-collections.jar
classes
On peut terminer par mettre un « welcome file » dans le web.xmlOn peut terminer par mettre un « welcome file » dans le web.xml
index.jsp
fichier index.jsp:contentType text/html;charset ISO 8859 1 %>
Et mettre des liens pour naviguer dans l’application.
- Dans vuesmembres.jsp, pour permettre d’ajouter des membres
D fi ti j t à l li t
Ajout
- Dans confirmation.jsp, pour retourner à la liste
Retour
membresmappings.propertiesmappings.propertiesindex.jspWEB-INF
web.xmlb l t lmembres-servlet.xml
applicationContext.xml
vues
L’appli est terminéeet se lance par:
vuesvues.xmlvuemembres.jspformulaire.jsp
fi ti j
http://localhost:8080/membres
confirmation.jspsrc
metierGroupe.javap j
webAffichage.javaAjout.javaC dAj t jCommandAjout.java
libspring.jarstandard.jarjjstl.jarcommons-collections.jar
classes
Spring 3
Spring 3.x
Gestion des erreurs Les erreurs peuvent être issues :
D i i i d l f l i• De mauvaises saisies dans les formulaires• De données saisies non valables pour le métierD i d é i• Des exceptions remontant du métier
Les mauvaises saisies peuvent être détectés par: la conversion de la requête http objet command des objets de validation
Spring 3.x
Erreur de conversion@RequestMapping(method = RequestMethod.POST)protected String onSubmit( @ModelAttribute("commandAjout") CommandAjout commandAjout, BindingResult result SessionStatus status ) throws Exception {BindingResult result, SessionStatus status ) throws Exception {
if( result.hasErrors()) {return "formulaire";
}
retourne au formulaire en cas d’erreurs}
groupe.addMembre(commandAjout.getNouveauMembre());status.setComplete();return "confirmation"; efface la session si ok
@ModelAttribute permet de récupérer l’objet command. Il est peuplé à partir de la requete donc avec les valeurs saisies dans le formulaire
return confirmation ;}
Il est peuplé à partir de la requete, donc avec les valeurs saisies dans le formulaire. Il y a conversion implicite String ‐> type dans l’objet commande Il peut y avoir plusieur s @ModelAttribute
BindingResult result contient les éventuelles erreurs de conversion doit être placé immédiatement après le @ModelAttribute auquel il se réfere
Spring 3.x
Validation Doit se faire explicitement
@Controller @RequestMapping("ajouter")@Controller @RequestMapping( ajouter )public class AjoutController {
@Injectprivate ValidatePersonne validator;
L’objet validatorprivate ValidatePersonne validator;
@RequestMapping(method = RequestMethod.POST)protected String onSubmit( @ModelAttribute("commandAjout") CommandAjout commandAjout@ModelAttribute( commandAjout ) CommandAjout commandAjout, BindingResult result, SessionStatus status ) throws Exception {
// validationvalidator validate(commandAjout result);validator.validate(commandAjout, result);if( result.hasErrors()) {return "formulaire";}
appel la validation. Utilise le BindResult
…
package web;
Un validator pour détecter les saisies vide du nouveau membre
import org.springframework.validation.Errors;
public class ValidatePersonne implements org.springframework.validation.Validator {
/** pour dire que c’est un validator de la classe CommandAjout*/public boolean supports(Class classe) {
boolean assignableFrom = classe.isAssignableFrom(CommandAjout.class);return assignableFrom;g ;
}
public void validate(Object obj, Errors erreurs) {// on récupère la personne postéeCommandAjout command = (CommandAjout) obj;CommandAjout command = (CommandAjout) obj;// on vérifie le prénomString membre = command.getNouveauMembre();if (membre == null || membre.trim().length() == 0) {
// les erreurs sont stockées dans un objet de type Errorserreurs.rejectValue("nouveauMembre",
"commandAjout.nouveauMembre.necessaire","Le nom est nécessaire !");
}}
(memberName, msgKey, defaultMsg)
}
}
org.springframework.validation.Errorsvoid reject(String errorCode)
Register a global error for the entire target object, using the given error description.Register a global error for the entire target object, using the given error description.
void reject(String errorCode, Object[] errorArgs, String defaultMessage)Register a global error for the entire target object, using the given error description.
void reject(String errorCode, String defaultMessage)Register a global error for the entire target object, using the given error description.
void rejectValue(String field, String errorCode)Register a field error for the specified field of the current object (respecting the current nested path, if any), using the given error description.
void rejectValue(String field, String errorCode, Object[] errorArgs, String defaultMessage)Register a field error for the specified field of the current object (respecting the current nested path if any) using the given error descriptioncurrent nested path, if any), using the given error description.
void rejectValue(String field, String errorCode, String defaultMessage)Register a field error for the specified field of the current object (respecting the g p j ( p gcurrent nested path, if any), using the given error description.
Spring 3.x
Validation Peut aussi utiliser le standard
’JSR V lid t ’ ’JSR‐303 Validator’ Utilise le tag @Valid et des validatorsNé i i lé i d d d Nécessite une implémentation du standard ex: Hibernate Validate
Non développé ici
Comment afficher les erreurs dansComment afficher les erreurs dans les JSP ? (vers>2.5)( ) En utilisant un tag Spring : le tag
c
L f d’ ffi h l Le tag form:errors permet d’afficher les erreurs associées à l’objet désigné par le path (reject) ou à ses attributs (rejectValue)attributs (rejectValue).
…
…
Formulaire complété ffi h l é ll ( 2 5)
pour afficher les éventuelles erreurs (vers>2.5)contentType text/html;charset ISO 8859 1 %>
formulaire Ajout
Formulaire Ajouter un membre
Nouveau Membre
ht l
Erreurs en couleurs : déclarer un style et l’utiliser dans l’erreur
.error {color: #ff0000;}errorblock{.errorblock{
color: #000;background-color: #ffEEEE;border: 3px solid #ff0000;padding:8px;margin:16px;margin:16px;}
Nouveau Membre:
L ti d d’La gestion des messages d’erreurs
Dans le fichier de configuration il faut indiquer que l’on va utiliser
g q qun fichier messages.properties pour contenir les messages.
messages
Le fichier messages properties :
commandAjout.nouveauMembre.necessaire=Un nom est nécessairecommandAjout.echec=Echec de l'ajout
Le fichier messages.properties :
Il doit être dans le classpath et il est lu au chargement de l’application.
L ti d d’ i18La gestion des messages d’erreurs – i18n
Il peut y avoir un fichier de messages pour chaque langue.p y g p q gSuffixer le nom par le local et le country :•fr_FR•en_US
membresmappings.propertiesindex.jspindex.jspWEB-INF
web.xmlmembres-servlet.xmlapplicationContext.xmlapplicationContext.xml
vuesvues.xml
L’appli Web avec Spring: vuemembres.jspformulaire.jspconfirmation.jsp
srcmetier
Groupe.javaweb
Affichage.javag jAjout.javaCommandAjout.javaValidatePersonne.java
libspring.jarstandard.jarjstl.jarcommons-collections.jarj
classesmessages.properties
Accéder à un objet JNDI ou EJB L’objet doit exister dans un autre container On injecte le bean ex: injecter un bean dans Springj p g
membres-servlet.xml
Accéder à un objet JNDI ou EJBj
Acces par JNDI
Acces a un bean local
Acces à un bean distant Acces à un bean distant
Documentation Spring
http://www.springframework.org/l tutorial
http://www.springframework.org/docs/MVC‐step‐by‐step/Spring‐MVC‐step‐by‐step.html tutorial; a adapter pour la dernière version tutorial; a adapter pour la dernière version
article http://www.theserverside.com/tt/articles/article.tss?l=IntrotoSpring25
synthese de Springy p g
documentation http://static.springframework.org/spring/docs/2.5.x/reference/index.html
la reference pdf : (http://static.springframework.org/spring/docs/2.5.x/spring‐reference.pdf)
Exemples Exemples fournies avec Spring
\ i f k \ l \spring‐framework‐2.5.x\samples
Utiliser Spring 3 Nécessite les jars (situés dans spring3.x/dist)( p g3 / ) org.springframework.web.servlet org.springframework.web org.springframework.asm org.springframework.beans org springframework core org.springframework.core org.springframework.context org.springframework.expressionorg.springframework.expression
Download: http://www.springsource.org/download
Partie 2
La navigation dans une application MVC
La navigation dans une application MVC précise commentLa navigation dans une application MVC précise commentles pages s’enchaînent pour l’utilisateur.
La navigation peut être construite:- à l’aide du lien (href) dans les pages JSP
l’utilisateur passe d’une page à une autre en cliquant sur le lieng- à l’aide de boutons de formulaires dans les pages JSP
l’utilisateur en cliquant sur le bouton déclenche une actiondans le serveur, action qui retournera une autre page
- à l’aide de redirections du navigateurc’est ici le serveur qui indique au navigateur l’URL de poursuite
L’utilisation simultanée de ces trois mécanismes rend complexel’expression de la navigation dans une application…
Le modèle Spring MVC essaie de simplifier cet aspect en permettant d’exprimer la navigation uniquement dans les contrôleurset non dans les pages JSPet non dans les pages JSP.
Pour cela dans le modèle Spring MVC, un formulaire esttoujours envoyé par un contrôleur et retournera (une foistoujours envoyé par un contrôleur et retournera (une foisrempli par l’utilisateur) toujours au contrôleur qui l’a envoyé.
C’est le cas du SimpleFormController vu précédemment:
Get
L’attribut action du formulaire n’est pas précisé !
SimpleForm
Get
Formulaire
Formulaire.jsp:
ControllerSubmit
Vue suivante
….
L’attribut action du formulaire n’est pas précisé !
SimpleForm
Get
Formulaire
Formulaire.jsp:
f th d t
n’est pas précisé !
FormControllerSubmit
….
Vue suivante/form
La vue suivante peut être une autre page JSP (JstlView)ou une redirection vers un autre contrôleur (RedirectView)
Si la page suivante doit aussi contenir un formulaire alorsil faut faire une redirection vers le contrôleur qui va générer il faut faire une redirection vers le contrôleur qui va générer ce formulaire et va le recevoir en retour !!!
SaisieNomExemple: SaisieNomSaisiePrenom
Saisie
SaisieNom.htmlpublic class SaisieNom extends SimpleFormController {
…protected ModelAndView onSubmit() {
NomControllerSubmit
Nom protected ModelAndView onSubmit() {return new ModelAndView("redirectionSaisiePrenom" );
}}
Redirection redirectionSaisiePrenom.class=org.springframework.web.servlet.view.RedirectViewredirectionSaisiePrenom.url=/SaisiePrenom.html
/SaisiePrenom.html
/b
vues.xml
S i iLa séquence des deux pages(pour
SaisiePrenom
ControllerSubmit
Prénom l’utilisateur) est programmée dans le premier contrôleur qui utilise une redirection vers le d iè t ôl ( t d
Vue suivante
deuxième contrôleur (et non dans une page JSP) !
Le contrôleur MultiActionController
Ce contrôleur permet de gérer une page complexe comprenantCe contrôleur permet de gérer une page complexe comprenantplusieurs boutons et/ou plusieurs sous pages.(une action par bouton)
Affi h
Action1
Action1
Saisir
AfficherMethodeAction 1Action2
MethodeAction 2
retour MethodeAction 3
Action3
suite
MultiActionControleur (Spring3)( p g ) Classe annoté
@Controller et @RequestMapping("/url")@Controller et @RequestMapping( /url )@Controller@RequestMapping("/appointments")q pp g / pppublic class AppointmentsController {
On spécifie l’url de mapping sur la classe Les méthodes annoté @RequestMapping sont relatives gà l’URL globale (sur la classe)@RequestMapping(method = RequestMethod.GET)
bli M St i A i t t t() {public Map get() {return appointmentBook.getAppointmentsForToday();}
Autre variante :R tM i ( l "/ " th d R tM th d GET)@RequestMapping(value="/new", method = RequestMethod.GET)public AppointmentForm getNewForm() {return new AppointmentForm();}
On accède au contrôleur par
}
http://serveur/appointement/new
Comment mapper un bouton sur un contrôleur ? Rechercher dans doc.
Spring 2
Un MultiActionController doit être déclaré dans le ficher-servlet.xml, ainsi que la manière de déterminerles actions à exécuter en fonction de l’URL
Exemple: ici le choix de l’action se fera sur la présence d’un paramètrede la requête qui a le nom de l’une des actions
package web;Spring 2
import org.springframework.web.servlet.ModelAndView;import org.springframework.web.servlet.mvc.multiaction.MultiActionController;
public class MonController extends MultiActionController {public class MonController extends MultiActionController {// action par défaut: affichage page principalepublic ModelAndView action1(HttpServletRequest request,
HttpServletResponse response) {…return new ModelAndView(« vuePagePrincipale »);
}// action: affichage page secondairepublic ModelAndView action2(HttpServletRequest requestpublic ModelAndView action2(HttpServletRequest request,
HttpServletResponse response) {…return new ModelAndView(« vuePageSecondaire »);
}}// action : traitement retour page secondairepublic ModelAndView action3(HttpServletRequest request,
HttpServletResponse response) {…return new ModelAndView(« suite »);
}
Par exemple dans la page secondaire on aurait un formulaire avec un
Spring 2
Exemple de page jspdéclenchant les actions sur le controleur
// // //
/Insert title here
/f
Les MultiActionController et les SimpleFormController sont la base des applications SpringMVC
Get
Methode
Liste à sélectiondes noms despersonnes
Ajout
Voir Détails affichageListe
MethodeafficherDétails
Détails
MultiActionController
retour
MethodeajoutPersonne
Détailsd’une Personne
Formulaire desaisie des infos
Redirection
Retour
saisie des infosd’une personne Saisie
PersonneRedirectionSimpleFormController
Un exemple complet: Gestion des réservations de vol par des personnesUn exemple complet: Gestion des réservations de vol par des personnes
Point de départ: le métier Et les cas d’utilisation
Personnenom
Volid* * Consulter la liste des personnes etprenom departarrivee
* *
**
- Consulter la liste des personnes et avoir la possibilité de saisir une nouvelle personne
Consulter la liste des vols et avoir la
FabVol
*
FabPersonne
* - Consulter la liste des vols et avoir la possibilité de saisir un nouveau vol- Réserver un vol pour une personne
getIds()addVol()getVol()
getNoms()addPersonne()getPersonne()
On décide du modèle MVC de l’application:
Liste à sélectiondes noms des
Liste à sélectiondes ids des
Liste des personnes Liste des volsMultiActionController MultiActionControllerSession de l’utilisateur
Aj t
Voir Détails
des noms despersonnes
Aj t
Voir Détails
des ids desvolsListe
PersonnesListeVols
Ajout Ajout
Saisie Personne Saisie VolMultiActionController
SimpleFormController
SimpleFormController
RR
Retour
Formulaire desaisie des infosd’une personne
R t
Formulaire desaisie des infosd’un vol
SaisiePersonne
SaisieVolRéservation
Controller
Retour Retour
Liste à sélectionListe à sélection
Réservation
Voir Détails
des ids desvols
Voir Détails
des noms despersonnes
ChoisirChoisir
AnnulerConfirmer
Le fichier gestion-servlet.xml va configurer toute l’application.
1- On va avoir 5 contrôleurs qui seront affectés à différentes URL
1 On va avoir 5 contrôleurs qui seront affectés à différentes URL
ListePersonnesControllerSaisiePersonneControllerListeVolsControllerSaisieVolControllerSaisieVolControllerReservationController
Note:On peut externaliser
2- Les vues seront décrites dans le fichier vues.xml
On peut externaliser dans un fichier
/WEB-INF/vues/vues.xml
list
l j / lajoutvoir
/b
list
t " th dP N "
choixVolchoixPersonne
l i V l / lvoirVolvoirPersonneconfirmerannuler
/li t
true
t "f Vi "saisirPersonne
f b "V lid t P "/
saisirVol
f b "V lid t V l"/
personne/ t
vol/ t
/b
/b
6- On définit la couche métierd’abord les fabriques
7- Pour finir on définit lesobjets qui sont placés p p y p
objets qui sont placés dans les fabriques
p p y
Note:On peut utiliser un context globalpour déclarer ces objets.Voir slides 20 et 21.
Voir slides 20 et 21.
p p y p
Cela termine le fichier gestion-servlet.xml …..
Le fichier
5 vues JSPet4 redirections
/WEB-INF/vues/listerPersonnes.jsp
vues.xml4 redirections
Note:C’est du Spring 2.x
/WEB-INF/vues/saisirPersonne.jsp
Reste à écrire les 5 contrôleurs et les 5 vues JSPet les 2 validateurs…
Voir les sources en annexe
Remarque : L’objet HttpSession de l’utilisateur contient les informations qui doivent être mémorisées entre les appels aux contrôleurs
Pour finir un fichier index.jsp pour entrer dans l’application
Personnes et vols...
Choisissez:
Gestion des Personnes
Gestion des Personnes
Gestion des Vols
Gestion des Reservations
Plugin Eclipse pour Spring http://springide org/project/wiki/SpringideInstallhttp://springide.org/project/wiki/SpringideInstall
Bibliography Spring 3.x tutorials
htt // i di t/ i / i /i d ht l http://www.roseindia.net/spring/spring3/index.shtml http://yannart.developpez.com/java/spring/tutoriel/h // h id / i l/S i http://www.theserverside.com/tutorial/Spring‐30‐Tutorial‐Setting‐Up‐Configuring‐The‐Environment
Downloadh // i /d l d/ i http://www.springsource.com/download/community
Required Jar filesq For a typical web application you need the followingmodule jars: org.springframework.web.servlet org.springframework.web org springframework asm org.springframework.asm org.springframework.beans org.springframework.core org.springframework.context org.springframework.expression
Since most web applications use logging and basic AOP Since most web applications use logging and basic AOP features, you need the following required third‐party offerings:
l i commons‐logging‐1.1.1
Notes sur les annotations Un bean ne peut pas etre declare a la fois par @annotatedet par . Si on utilise les 2, il est declare 2 f l ‘ l d d ’fois, et le conteneur renvoie une erreur ‘already mapped ’
Si on utilise SimpleUrlHandlerMapping (dans le fichier de config), il capte tous les mapping, et les mapping fait dans config), il capte tous les mapping, et les mapping fait dans les controlleurs sont ignorés.
@Inject – vient de JSR 330; permet de faire de l’injection; fonctionne avec Spring 3; Inject le bean de type fonctionne avec Spring 3; Inject le bean de type correspondant; Ne permet pas de specifier le nom du bean;A i id i I j i i d S i @Autowire – identique a @Inject, mais vient de Spring.
Validation – La validation peut‐être effectue avec ’JSR‐303 Validator’; Utilise le tag @ValidValidator ; Utilise le tag @Valid
Installation Spring comprend un ensemble de jars de base, necessaire a
l’execution. Il est aussi possible de télécharger un environement de
dévelopement basé sur Eclipse
Les jar uniquement: http://www.springsource.org/download
L’environement Eclipse : Lenvironement Eclipse : SpringSource Update Site for Eclipse 3.7 (Release) http://dist.springsource.com/release/TOOLS/update/e3.7
TéléchargerTéléchargerL’environement Eclipsep
Documentations Tutoriaux
htt //bl i / / / / b http://blog.springsource.com/2011/01/04/green‐beans‐getting‐started‐with‐spring‐mvc/ Pas d ’explication sur comment récuperer les jars les déployer Pas d explication sur comment récuperer les jars, les déployer, …
http://static.springframework.org/docs/Spring‐MVC‐p p g g p gstep‐by‐step/overview.html 2.5. A adapter pour 3.x