Vous êtes sur la page 1sur 82
Jean ‐ Marc Geib Cedric Dumoulin
Jean ‐ Marc Geib
Cedric Dumoulin
 Documentation  http: // s ta ti c.spr i ngsource.org / spr ing /d

Documentation

http://s ta tic.springsource.org/spring/d ocs/curren t/spri ngframeworkreference/html/mvc.html

Tutorial

http://viralpatel.net/blogs/tutorialspring3 mvc introduction spr i ngmvc f ramework/

Download Springframework

http://w ww.springsource.org/springframework#download

Utili ser 3 .1.3

Le cœur de l’environnement Spring est un « conteneur léger » Un conteneur léger sert
Le cœur de l’environnement Spring est un « conteneur léger »
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
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 externe (xml) décrivant les objets
Ce contexte initial est souvent construit à partir d’une description
externe (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
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 : IoC
C’est le Design Pattern de l’Inversion du Contrôle : IoC
Exem le sim lifié: p p
Exem le sim lifié:
p
p

Avec les classes:

class Personne { String nom; Voiture car; } class Voiture {String nom;}
class Personne { String nom; Voiture car; }
class Voiture {String nom;}
et la description de contexte Spring: <beans> <bean id= user " <property name=" nom "
et la description de contexte Spring:
<beans>
<bean id= user
"
<property name=" nom " value=" jean "/>
<property name= " car " ref= "vehicule "/>
"
"
class= Personne >
"
</bean>
<bean id=" vehicule " class=" Voiture ">
<property name=" nom " value=" megane "/>
</bean>
</beans>

Le contexte initial de lapplication dans le conteneur SPRING sera:

user

Personne Voiture nom:jean nom:megane car:
Personne
Voiture
nom:jean
nom:megane
car:

vehicule

SpringMVC est un framework de présentation, pour application WEB, suivant le modèle MVC, et fondé
SpringMVC est un framework de présentation, pour application WEB, suivant le modèle MVC, et fondé
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: -Le contexte de l’application
Dans le cas de SpringMVC le conteneur va servir à créer:
-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 comportement de l’application, en modifiant la description
L’inversion du contrôle permet ensuite de changer le comportement
de l’application, en modifiant la description xml du conteneur, sans
changer les éléments programmés!
Retour sur le modèle MVC
Retour sur le modèle MVC

Une application 3tier classique:

Retour sur le modèle MVC Une application 3tier classique: U ne app licati on 3ti er

Une application 3tier avec MVC:

Retour sur le modèle MVC Une application 3tier classique: U ne app licati on 3ti er
La vision de SpringMVC La or g.sp rin g framework.web.servlet.Dis p atcherServlet est le p

La vision de SpringMVC

La vision de SpringMVC La or g.sp rin g framework.web.servlet.Dis p atcherServlet est le p oint

La org.springframework.web.servlet.DispatcherServlet est le point d’entrée générique qui délègue les requêtes à des Controller

Un org.springframework.web.servlet.mvc.Controller prend en charge une requête, et utilise la couche métier pour y pondre.

Un Controller fabrique un modèle sous la forme d’une java.util.Map contenant les éléments de la réponse. Un Controller choisit une org.springframework.web.servlet.View qui sera paramétrée par la Map pour donner la page qui sera affichée.

Spring 3.x C ontro er pr ng ll S i 3
Spring 3.x
C
ontro er pr ng
ll
S
i
3

Spring 3 simplifie la création des contrôleurs:

annotations @Controll er et @RequestMapping

Pas d’interface à implémenter

Le contrôleur le plus sim ple:

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

@Controller public class HelloWorldController { @RequestMapping("/helloWorld") public ModelAndView helloWorld()
@Controller
public class HelloWorldController {
@RequestMapping("/helloWorld")
public ModelAndView helloWorld() {
ModelAndView mav = new ModelAndView();
mav.setViewName("helloWorld");
mav.addObject("date", new Date());
return mav;
}
}
DispatcherServlet URL HandlerMapping Metier Choix d’un contrôleur en fonction de l’URL MonControleur
DispatcherServlet URL HandlerMapping Metier Choix d’un contrôleur en fonction de l’URL MonControleur
DispatcherServlet
URL
HandlerMapping
Metier
Choix d’un contrôleur
en fonction de l’URL
MonControleur
HttpServletRequest
handleRequest
ModelAndView =
Nom de vue +
Model
Choix d’une vue
ViewResolver
Page
HTML
Vue
Model
A fournir
fournit par Spring
Exemple: 1 - Une couche métier – Class Group public class Groupe { private ArrayList<Object>

Exemple: 1 - Une couche métier – Class Group

public class Groupe { private ArrayList<Object> membres; public ArrayList<Object> getMembres() { return
public class Groupe {
private ArrayList<Object> membres;
public ArrayList<Object> getMembres() {
return membres;
}
public void setMembres(ArrayList<Object> membres) {
this.membres = membres;
}
public void addMembre (String membre) {
if (membres.contains(membre))
throw new MembrePresentException();
membres.add(membre);
}
}
Spring 3.x Contrôleur Spring 3
Spring 3.x
Contrôleur Spring 3
@ Controller public class Affichage { @Controller Pas d’interface à implémenter // un groupe de
@
Controller
public class Affichage {
@Controller
Pas d’interface
à implémenter
// un groupe de personnes fourni par le contexte de l'application
private Groupe groupe;
public Groupe getGroupe() {
return groupe;
}
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 à utiliser
pour générer la page
ModelAndView mav = new ModelAndView();
mav.setViewName("vuemembres");
mav.addObject("groupe", groupe);
return mav;
Ajout du groupe
au modèle
}

Le groupe sera injecté lors de la création du contexte

Exemple: 3 – une page JSP-JSTL pour afficher les membres <%@ page language="java"

Exemple: 3 – une page JSP-JSTL pour afficher les membres

<%@ page language="java" pageEncoding="ISO-8859-1"
<%@ page language="java" pageEncoding="ISO-8859-1"
contentType="text/html;charset=ISO-8859-1"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Affichage</title>
On retrouve
</head>
le modèle
<body>
<h2>Groupe</h2>
<table border="1">
<tr>
<th colspan="3" align="center">Membres du groupe</th>
</tr>
<tr>
<c:forEach var="personne" items="${groupe.membres}">
<td>${personne}</td>
</c:forEach>
</tr>
</table>
<a href="<c:url value="/ajouter.html"/>">Ajout</a>
</body>
</html>
Fichier /views/vuemembres.jsp
Exemple: 4: définir l’application WEB:
Exemple: 4: définir l’application WEB:
<?xml version="1.0" encoding="UTF-8"?> <web-app
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>testspring3</display-name>
<!-- la servlet -->
On déclare la seule
Servlet principale
<servlet>
<servlet-name>membres</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<!-- le mapping des url -->
<servlet-mapping>
<servlet-name>membres</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
</web-app>

Ce fichier web.xml ne change jamais. Ce fichier est dans le répertoire WEB-INF

Exemple: 5 le contexte initial souhaité de l’application Injection de dépendance Pierre groupe: Paul Jacques

Exemple: 5 le contexte initial souhaité de l’application

Injection de dépendance Pierre groupe: Paul Jacques Une instance de Affichage Une instance Initialisée du
Injection de dépendance
Pierre
groupe:
Paul
Jacques
Une instance de
Affichage
Une instance
Initialisée du métier

Cela doit être décrit dans un fichier WEB-INF/membres-servlet.xml

Initialisée du métier Cela doit être décrit dans un fichier WEB-INF/ membres -servlet.xml Nom de la

Nom de la DispatcherServlet

Spring 3.x Exemple : 5 - le fichier WEB-INF/membres-servlet.xml
Spring 3.x
Exemple : 5 - le fichier WEB-INF/membres-servlet.xml
<?xml version="1.0" encoding="UTF-8"?> < beans
<?xml version="1.0" encoding="UTF-8"?>
< beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/jee
http://www.springframework.org/schema/jee/spring-jee-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- Scan package to discover spring annotations -->
<context:component-scan base-package="web"/>
pour découvrir les anno t a ti ons
pour découvrir
les anno t a ti ons
Spring 3.x Exemple : 5 - le fichier WEB-INF/membres-servlet.xml (suite)
Spring 3.x
Exemple : 5 - le fichier WEB-INF/membres-servlet.xml (suite)
<beans> <!-- le controleur --> <bean id="AffichageController"
<beans>
<!-- le controleur -->
<bean id="AffichageController" class="web.Affichage">
<property name="groupe" ref="groupe"/>
</bean>
La dépendance
pour injecter le groupe
<!– l’instance du metier
<bean id= groupe class= metier.Groupe
<property name="membres">
<list>
<value>Paul</value>
<value>Mélanie</value>
<value>Jacques</value>
</list>
</property>
</bean>
"
"
"
"
Exemple: 6 – les mappings 1 - On veut que l’URL / afficher.html déclenche notre

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)
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 faut utiliser un ViewResolver
Il faut utiliser un ViewResolver

Il faut les déclarer dans le fichier membres -servlet.xml

Exemple: 6 – les mappings dans membres-servlet.xml <?xml version="1.0" encoding="UTF-8"?> <

Exemple: 6 – les mappings dans membres-servlet.xml

<?xml version="1.0" encoding="UTF-8"?> < beans xmlns = "http://www.springframewor
<?xml version="1.0" encoding="UTF-8"?>
< beans
xmlns = "http://www.springframewor k.org/schema/beans"
xmlns:xsi = "http://www.w3.org/ 2001/XMLSchema ‐ instance"
xmlns: p = "htt p : // www.s p rin gf ramework.or g/ schema /p "
xmlns:context= "http://www.springframework .org/schema/context"
xsi:schemaLocation= "http://www.springfram ework.org/schema/beans
http://www.springframework. org/schema/beans/spring‐ beans ‐ 3.0.xsd
htt p : // www.s p rin gf ramework.or g/ schema / context
http://www.springframework. org/schema/context/spring ‐ context ‐ 3.0.xsd " >
<!-- le ViewResolver -->
<bean id="viewResolver"
class = "org.springframework.web.servlet .view.UrlBasedViewResolver">
<property name = "viewClass"
value = "or g .s p rin gf ramework.web.servle t.view.JstlView" />
<property name = "prefix" value = "/WEB ‐ INF/vues/" />
<property name = "suffix" value = ".jsp" />
</bean >
Le nom de la vue
est utilisé pour former
le nom de la jsp
L’appli Web avec Spring: membres WEB-INF web.xml membres-servlet.xml vues vuemembres.jsp src metier Groupe.java

L’appli Web avec Spring:

membres WEB-INF web.xml membres-servlet.xml vues vuemembres.jsp src metier Groupe.java web Affichage.java lib
membres
WEB-INF
web.xml
membres-servlet.xml
vues
vuemembres.jsp
src
metier
Groupe.java
web
Affichage.java
lib
spring.jar
standard.jar
jstl.jar
commons-collections.jar
classes
Lancement: http://localhost:8080/membres/afficher.html
Lancement: http://localhost:8080/membres/afficher.html
On peut sortir le mapping des vues du fichier de configuration <!– un autre resolveur

On peut sortir le mapping des vues du fichier de configuration

<!– un autre resolveur de vues --> <bean
<!– un autre resolveur de vues -->
<bean class="org.springframework.web.servlet.view.XmlViewResolver">
<property name="location">
<value>/WEB-INF/vues/vues.xml</value>
</property>
</bean>

Fichier /WEB-INF/vues/vues.xml

<?xml version="1.0" encoding="ISO_8859-1"?> <!DOCTYPE beans SYSTEM
<?xml version="1.0" encoding="ISO_8859-1"?>
<!DOCTYPE beans SYSTEM "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="vuemembres" class="org.springframework.web.servlet.view.JstlView">
<property name="url">
<value>/WEB-INF/vues/vuemembres.jsp</value>
</property>
</bean>
</beans>
On p eut créer un contexte g lobal à l ’ application web , utile

On peut créer un contexte global à lapplication web, utile pour y mettre une fois pour toute la liaison avec la couche métier. Il faut utiliser pour cela un fichier applicationContext.xml.

Exemple de ce fichier /WEB-INF/applicationContext.xml pour notre application <?xml version="1.0"
Exemple de ce fichier /WEB-INF/applicationContext.xml pour notre application
<?xml version="1.0" encoding="ISO_8859-1"?>
<!DOCTYPE beans SYSTEM "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!– le contexte métier est la liste de personnes -->
<bean id="groupe" class="metier.Groupe">
<property name="membres">
<list>
<value>Paul</value>
<value>Mélanie</value>
<value>Jacques</value>
</list>
</property>
</bean>
</beans>
Et il faut demander le chargement de ce contexte dans le web.xml . <!DOCTYPE web-app

Et il faut demander le chargement de ce contexte dans le web.xml

. <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" <?xml
.
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
<?xml version="1 0" encodin ="ISO-8859-1"?>
g
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<!-- le chargeur du contexte de l'application -->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
</web-app>
L’appli Web avec Spring: membres mappings.properties WEB-INF web.xml membres-servlet.xml applicationContext.xml

L’appli Web avec Spring:

membres mappings.properties WEB-INF web.xml membres-servlet.xml applicationContext.xml vues vues.xml
membres
mappings.properties
WEB-INF
web.xml
membres-servlet.xml
applicationContext.xml
vues
vues.xml
vuemembres.jsp
src
metier
Groupe.java
web
Affichage.java
lib
spring.jar
standard.jar
jstl.jar
commons-collections.jar
classes
Spring 3.x
Spring 3.x

Formulaire

Met en œuvre:

une page we b (ex: j sp)

un contrôleur avec jusque deux méthodes pour traiter l es requ ê tes get et post

un objet command pour passer les données entre le formulaire et le contrôleur

Une méthode pour initialiser l’objet command

Spring 3.x
Spring 3.x
POJO annoté @Controller
POJO annoté @Controller
GET Request @RequestMapping(method = RequestMethod.GET) processGet(ModelMap model) Crée ou model retrouve implicite
GET Request
@RequestMapping(method = RequestMethod.GET)
processGet(ModelMap model)
Crée ou
model
retrouve
implicite
view
’logicalview’
Objet
formulaire
Command
POST data
Utilise
@RequestMapping(method = RequestMethod.POST)
protected String processPost(…)
Metier
Objet
ModelAndView
= RequestMethod.POST) protected String processPost(…) Metier Objet ModelAndView Formulaire prérempli Page HTML

Formulaire

prérempli

= RequestMethod.POST) protected String processPost(…) Metier Objet ModelAndView Formulaire prérempli Page HTML

Page

HTML

Initialiser l’ob jet de Command  Par une méthode annoté @ModelAttribute @ModelAttribute(" commandAjout

Initialiser l’ob jet de Command

Par une méthode annoté @ModelAttribute

@ModelAttribute(" commandAjout ") public userInfoData initFormObject ( HttpSer vletRequest request ) {
@ModelAttribute(" commandAjout ")
public userInfoData initFormObject ( HttpSer vletRequest request ) {
CommandAjout command = new CommandAjout();
return command ;
}

Ou dans la méthode du get

Spring 3.x
Spring 3.x
@Controller @RequestMapping("ajouter") public class AjoutController { private Groupe groupe; Injecte un objet
@Controller @RequestMapping("ajouter")
public class AjoutController {
private Groupe groupe;
Injecte un objet du type demandé
@Inject
public void setGroupe(Groupe groupe) {
this.groupe = groupe;}
@RequestMapping(method = RequestMethod.GET)
protected Object processGet(ModelMap model) {
// Create the command used to fill the jsp form
récupère le modèle implicite
CommandAjout cmd = new CommandAjout();
cmd.setNouveauMembre("Entrez un nom");
crée l’objet command
c
model.addAttribute("commandAjout", cmd);
// Add it t
o
th
e
i
mp
li it
mo e
d l
la vue affichant le formulaire
// return the logical name of the view used to render the form.
return "formulaire";
}
ré cupè re l obj e t command
à partir du modèle implicite
@RequestMapping(method = RequestMethod.POST)
protected String processPost( @ModelAttribute("commandAjout") CommandAjout commandAjout,
BindingResult result, SessionStatus status ) throws Exception {
if( result.hasErrors()) {
le résultat du bind
return "formulaire";}
// Add new membre
.
return "confirmation";
groupe.addMembre(commandAjout.getNouveauMembre());
status setCom lete()
p
;
indi ue la fin de la session
q
nettoie les attributs du modèle
}
}
status setCom lete() p ; indi ue la fin de la session q nettoie les attributs
status setCom lete() p ; indi ue la fin de la session q nettoie les attributs
Spring 3.x
Spring 3.x
formulaire.jsp nom de l’objet dans le modèle <body><h3>Formulaire Ajouter un membre </h3>
formulaire.jsp
nom de l’objet dans le modèle
<body><h3>Formulaire Ajouter un membre </h3>
<form:form commandName="commandAjout">
<table>
<tr>
<td>Nouveau Membre</td>
<td><form:input path="nouveauMembre" /></td>
<%-- Show errors for name field --%>
<td><form:errors path="nouveauMembre" /></td>
</tr>
<tr>
<td colspan="3"><input type="submit" value="Envoyer" /></td>
</tr>
</table>
</form:form>

nom de propriete dans l’objet

confirmation . jsp <body> <h3>Confirmation de l'ajout</h3> valeur de la propriété
confirmation . jsp
<body>
<h3>Confirmation de l'ajout</h3>
valeur de la propriété
<table border="1">
<tr>
<td>Nouveau Membre </td>
<td>${commandAjout.nouveauMembre}</td>
</tr>
</table>
<a href="<c:url value="/afficher.html"/>">Retour</a>
</body>
Spring 3.x
Spring 3.x
Il ne faut plus déclarer les contrôleurs. Ils seront découvert grâce aux annotations
Il ne faut plus déclarer les contrôleurs. Ils seront découvert grâce aux annotations
Demander le scan auto des annotations – dans membres‐ servlet.xml
Demander le scan auto des annotations – dans membres‐ servlet.xml
< beans xmlns="http://www.springframework.org/schema/beans"
< beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/jee
http://www.springframework.org/schema/jee/spring-jee-2.5.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- Scan package to discover spring annotations -->
<context:component-scan base-package="web"/>
</beans>
Spécifie le package à scanner
L’appli Web avec Spring: membres mappings.properties WEB-INF web.xml membres-servlet.xml applicationContext.xml

L’appli Web avec Spring:

membres mappings.properties WEB-INF web.xml membres-servlet.xml applicationContext.xml vues vues.xml
membres
mappings.properties
WEB-INF
web.xml
membres-servlet.xml
applicationContext.xml
vues
vues.xml
vuemembres.jsp
formulaire.jsp
confirmation.jsp
src
metier
Groupe.java
web
AffichageControler.java
AjoutControler.java
CommandAjout.java
lib
spring.jar
standard.jar
jstl.jar
commons-collections.jar
classes
On peut terminer par mettre un « welcome file » dans le web.xml
On peut terminer par mettre un « welcome file » dans le web.xml
<welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>

fichier index.jsp:

<%@ page language="java" pageEncoding="ISO-8859-1"
<%@ page language="java" pageEncoding="ISO-8859-1"
contentType="text/html;charset=ISO-8859-1"%>
<%@ taglib uri="/WEB-INF/c.tld" prefix="c" %>
<c:redirect url="/afficher.html"/>

Et mettre des liens pour naviguer dans l’application. - Dans vuesmembres.jsp, pour permettre d’ajouter des membres

<a href="<c:url value="/ajouter.html"/>">Ajout</a>
<a href="<c:url value="/ajouter.html"/>">Ajout</a>

- Dans confirmation.jsp, pour retourner à la liste

<a href="<c:url value="/afficher.html"/>">Retour</a>
<a href="<c:url value="/afficher.html"/>">Retour</a>
L’appli est terminée et se lance par: http://localhost:8080/membres membres mappings.properties index.jsp WEB-INF

L’appli est terminée et se lance par:

http://localhost:8080/membres
http://localhost:8080/membres
membres mappings.properties index.jsp WEB-INF web.xml membres-servlet.xml applicationContext.xml vues vues.xml
membres
mappings.properties
index.jsp
WEB-INF
web.xml
membres-servlet.xml
applicationContext.xml
vues
vues.xml
vuemembres.jsp
formulaire.jsp
confirmation.jsp
src
metier
Groupe.java
web
Affichage.java
Ajout.java
CommandAjout.java
lib
spring.jar
standard.jar
jstl.jar
commons-collections.jar
classes
Spring 3
Spring 3
Spring 3.x
Spring 3.x

Gestion des erreurs

Les erreurs peuvent être issues :

De mauva ises sais ies d ans les formu la ires

De données saisies non valables pour le métier

Des except ions remontant d u 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
Spring 3.x

Erreur de conversion

@RequestMapping(method = RequestMethod.POST) protected String onSubmit( @ModelAttribute("commandAjout")
@RequestMapping(method = RequestMethod.POST)
protected String onSubmit(
@ModelAttribute("commandAjout") CommandAjout commandAjout,
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 .

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
Spring 3.x

Validation

Doit se faire explicitement

@Controller @RequestMapping("ajouter") public class AjoutController { @Inject pr va e L’objet validator i
@Controller @RequestMapping("ajouter")
public class AjoutController {
@Inject
pr va e
L’objet validator
i
t
V lid t P
a
a e ersonne va
lid t
a or;
@RequestMapping(method = RequestMethod.POST)
protected
String onSubmit(
@M d lAtt ib t
o e
r
u e( comman
"
dA
jou
t"
)
C
omman
dA
jou
t
comman
dA
jou ,
t
BindingResult result, SessionStatus status ) throws Exception {
// validation
validator.validate(commandAjout, result);
if( result.hasErrors()) {
return
"formulaire";
appel la validation. Utilise le BindResult
}
Un validator pour détecter les saisies vide du nouveau membre package web; import

Un validator pour détecter les saisies vide du nouveau membre

package web;

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;

}

public void validate(Object obj, Errors erreurs) { // on récupère la personne postée CommandAjout command = (CommandAjout) obj; // on vérifie le prénom String membre = command.getNouveauMembre(); if (membre == null || membre.trim().length() == 0) {

// les erreurs sont stockées dans un objet de type Errors

erreurs.rejectValue("nouveauMembre",

"commandAjout.nouveauMembre.necessaire", "Le nom est nécessaire !");

}

}

}

(memberName, msgKey, defaultMsg)

org.springframework.validation.Errors void reject ( String errorCode) Regi ste r a global e rr o r

org.springframework.validation.Errors

void reject(String errorCode)

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

void rejectValue(String field, String errorCode, 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 description.

Spring 3.x
Spring 3.x

Validation

Peut aussi utiliser le standard

’ JSR 303 Va lid a tor

Utilise le tag @Valid et des validators

Né cess ite une imp mentation d u stan d ard

ex: Hibernate Validate

Non développé ici

C
C

omment afficher les erreurs dans les JSP ? ( vers>2.5)

En utilisant un tag Spring : le tag f

h

< orm:errors pat = xxxx />

c

L e tag form:errors permet d’a ffi c her l es erreurs associées à l’objet désigné par le path (reject) ou à ses attributs ( rejectValue) .

<form:form commandName="commandAjout" /> … <form:errors path="nouveauMembre" /> …
<form:form commandName="commandAjout" />
<form:errors path="nouveauMembre" />
</form:form>
Formulaire complété pour affi ch er l es éventue ll es erreurs (vers> 2.5) <%@

Formulaire complété pour affi ch er les éventuell es erreurs (vers> 2.5)

<%@ page language="java" pageEncoding="ISO-8859-1"
<%@ page language="java" pageEncoding="ISO-8859-1"
contentType="text/html;charset=ISO-8859-1"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<html>
<head>
<title>formulaire Ajout</title>
</head>
<body>
<h3>Formulaire Ajouter un membre</h3>
<form:form commandName="commandAjout" acceptCharset="UTF-8">
<form:errors path="*" />
<table>
<tr>
<td>Nouveau Membre</td>
<td><form:input path="nouveauMembre" /></td>
<%-- Show errors for name field --%>
<td><form:errors path="nouveauMembre" /></td>
</tr>
<tr>
<td colspan="3"><input type="submit" value="Envoyer" /></td>
</tr>
</table>
</form:form>
</body>
</html>
Erreurs en couleurs : déclarer un style et l’utiliser dans l’erreur < html> <style> .error
Erreurs en couleurs : déclarer un style et l’utiliser dans l’erreur
Erreurs en couleurs : déclarer un style et l’utiliser dans l’erreur
< html> <style> .error { color: #ff0000; } .errorblock{ color: #000; background-color: #ffEEEE;
< html>
<style>
.error {
color: #ff0000;
}
.errorblock{
color: #000;
background-color: #ffEEEE;
border: 3px solid #ff0000;
padding:8px;
margin:16px;
}
</style>
<body>
<form:form commandName="commandAjout" acceptCharset="UTF-8">
<form:errors path="*" cssClass="error"/>
<table>
<tr>
<td><form:label path="nouveauMembre">Nouveau Membre:</form:label></td>
<td><form:input path="nouveauMembre" /></td>
<%-- Show errors for name field --%>
<td><form:errors path="nouveauMembre" cssClass="error"/></td>
</tr>
<tr>
<td colspan="3"><input type="submit" value="Envoyer" /></td>
</tr>
</table>
</form:form>
La gestion des messages d’erreurs
La gestion des messages d’erreurs

Dans le fichier de configuration il faut indiquer que l’on va utiliser un fichier messages.properties pour contenir les messages.

<!-- le fichier des messages --> <bean id="messageSource"
<!-- le fichier des messages -->
<bean id="messageSource"
class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename">
<value>messages</value>
</property>
</bean>
Le fichier messa es g .p ro erties : p commandAjout.nouveauMembre.necessaire=Un nom est nécessaire
Le fichier messa es
g
.p
ro erties :
p
commandAjout.nouveauMembre.necessaire=Un nom est nécessaire
commandAjout.echec=Echec de l'ajout

Il doit être dans le classpath et il est lu au chargement de l’application.

La gestion des messages d’erreurs – i18n
La gestion des messages d’erreurs – i18n

Il peut y avoir un fichier de messages pour chaque langue. Suffixer le nom par le local et le country :

•fr_FR •en_US •de_DE Le framework choisit le fichier en fonction des préférences utilisateur

<!-- le fichier des messages --> <bean id="messageSource"
<!-- le fichier des messages -->
<bean id="messageSource"
class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename">
<value>messages</value>
</property>
</bean>
messages_fr_FR.properties
commandAjout.nouveauMembre.necessaire=Un nom est nécessaire
commandAjout.echec=Echec de l'ajout
messages en US.properties commandAjout.nouveauMembre.necessaire=Name is mandatory commandAjout.echec=Duplicate name
messages
en
US.properties
commandAjout.nouveauMembre.necessaire=Name is mandatory
commandAjout.echec=Duplicate name
L’appli Web avec Spring: membres mappings.properties index.jsp WEB-INF web.xml membres-servlet.xml

L’appli Web avec Spring:

membres mappings.properties index.jsp WEB-INF web.xml membres-servlet.xml applicationContext.xml vues vues.xml
membres
mappings.properties
index.jsp
WEB-INF
web.xml
membres-servlet.xml
applicationContext.xml
vues
vues.xml
vuemembres.jsp
formulaire.jsp
confirmation.jsp
src
metier
Groupe.java
web
Affichage.java
Ajout.java
CommandAjout.java
ValidatePersonne.java
lib
spring.jar
standard.jar
jstl.jar
commons-collections.jar
classes
messages.properties
Accéder à un objet JNDI ou EJB  L’objet doit exister dans un autre container

Accéder à un objet JNDI ou EJB

L’objet doit exister dans un autre container

On injecte le bean

 ex: in jecter un bean dans S prin g  membres-servlet.xml <beans
 ex: in jecter un bean dans S prin g 
membres-servlet.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/jee
http://www.springframework.org/schema/jee/spring-jee-2.5.xsd">
<bean id="catalogController" class="ipint.mysite.CatalogController">
<property name="catalog" ref="catalogId"/>
injection
</bean>
k
cache="true" />
</beans>
<
jee:jn
di-l
oo up
id="
ca a og
t l
Id"
jn
di-
name
="C t l
a a og ean remo e
B
/
t
"
recherche du bean – lien nom l ogique <-> nom JNDI
Accéder à un ob jet JNDI ou EJB  < jee:jndi -lookup>  Acces par

Accéder à un ob jet JNDI ou EJB

<jee:jndi-lookup>

Acces par JNDI

<jee:local-slsb>

Acces a un bean local

<jee:remote-slsb>

Acces à un bean di s t an t

<jee:local-slsb id="myComponent" jndi-name="ejb/myBean"
<jee:local-slsb id="myComponent" jndi-name="ejb/myBean"
business-interface="com.mycom.MyComponent"/>
<bean id="myController" class="com.mycom.myController">
<property name="myComponent" ref="myComponent"/>
</bean>
Documentation  Spring  http://www.springframework.org/  tutoria l 

Documentation

Spring

http://www.springframework.org/

tutoria l

http://www.springframework.org/docs/MVCstepby step/Spring MVC stepby step.html

tutorial; a adapter pour la d ern iè re versi on

article

http://www.theserverside.com/tt/articles/article.tss?l=IntrotoSpring25

synthese de S prin 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/springreference.pdf )

Exemples

Exemples fournies avec Spring

\ spri ngframework 2.5.x \ samples

Utiliser Spring 3  Nécessite les jars ( situés dans sp rin g3 .x /

Utiliser Spring 3

Nécessite les jars (situés dans sp rin g3 .x/dist)

org.springframework.web.servlet

org.springframework.web

org.springframework.asm

org.springframework.beans

org. springframework. core

org.springframework.context

org.springframework.expression

Download:

http://www.springsource.org/download

Partie 2
Partie 2
La navigation dans une application MVC La navigation dans une application MVC précise comment les
La navigation dans une application MVC
La navigation dans une application MVC
La navigation dans une application MVC précise comment les pages s’enchaînent pour l’utilisateur.
La navigation dans une application MVC précise comment
les pages s’enchaînent pour l’utilisateur.
La navigation peut être construite: - à l’aide du lien (href) dans les pages JSP
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 lien
- à l’aide de boutons de formulaires dans les pages JSP
l’utilisateur en cliquant sur le bouton déclenche une action
dans le serveur, action qui retournera une autre page
- à l’aide de redirections du navigateur
c’est ici le serveur qui indique au navigateur l’URL de poursuite
L’utilisation simultanée de ces trois mécanismes rend complexe l’expression de la navigation dans une application…
L’utilisation simultanée de ces trois mécanismes rend complexe
l’expression de la navigation dans une application…
Le modèle Spring MVC essaie de simplifier cet aspect en permettant d’exprimer la navigation uniquement
Le modèle Spring MVC essaie de simplifier cet aspect en permettant d’exprimer la navigation uniquement
Le modèle Spring MVC essaie de simplifier cet aspect en
permettant d’exprimer la navigation uniquement dans les contrôleurs
et non dans les pages JSP.
Pour cela dans le modèle Spring MVC, un formulaire est toujours envoyé par un contrôleur
Pour cela dans le modèle Spring MVC, un formulaire est
toujours envoyé par un contrôleur et retournera (une fois
rempli par l’utilisateur) toujours au contrôleur qui l’a envoyé.

C’est le cas du SimpleFormController vu précédemment:

Get Simple Formulaire Form Controller Submit Vue suivante
Get
Simple
Formulaire
Form
Controller
Submit
Vue suivante

L’attribut action du formulaire n’est pas précisé !

L’attribut action du formulaire n’est pas précisé ! Formulaire.jsp: <form method = post > ….
Formulaire.jsp: <form method = post > …. <input type=« Submit » > </form>
Formulaire.jsp:
<form method = post >
….
<input type=« Submit » >
</form>
L’attribut action du formulaire n est pas précisé ! ’ Get
L’attribut action du formulaire
n est pas précisé !
Get
Simple Formulaire Form Controller Submit
Simple
Formulaire
Form
Controller
Submit

Vue suivante

Simple Formulaire Form Controller Submit Vue suivante Formulaire.jsp: <form method = post > ….
Simple Formulaire Form Controller Submit Vue suivante Formulaire.jsp: <form method = post > ….
Formulaire.jsp: <form method = post > …. <input type=« Submit » > </form>
Formulaire.jsp:
<form method = post >
….
<input type=« Submit » >
</form>
La vue suivante peut être une autre page JSP (JstlView) ou une redirection vers un
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 alors il faut faire une redirection
Si la page suivante doit aussi contenir un formulaire alors
il faut faire une redirection vers le contrôleur qui va générer
ce formulaire et va le recevoir en retour !!!
Exemple:
Exemple:
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key= /SaisieNom.html >SaisieNom</prop>
<prop key="/SaisiePrenom.html">SaisiePrenom</prop>
</props>
</property>
</bean>
"
"
public class SaisieNom extends SimpleFormController {
Saisie
pro ec e
t
t
d M
o
d
e
lA
n
dVi
ew on
S
u
b
m
it
() {
Nom
Nom
return new ModelAndView("redirectionSaisiePrenom" );
}
Controller
Submit
}
vues.xml
redirectionSaisiePrenom.class=org.springframework.web.servlet.view.RedirectView <bean id="redirectionSaisiePrenom"
Redirection
redirectionSaisiePrenom.url=/SaisiePrenom.html class="org.springframework.web.servlet.view.RedirectView">
<property name="url"><value>/SaisiePrenom.html</value></property>
</bean>
Saisie
Prénom
Prenom
Controller
Submit
</bean> Saisie Prénom Prenom Controller Submit Vue suivante La séquence des deux pages(pour
</bean> Saisie Prénom Prenom Controller Submit Vue suivante La séquence des deux pages(pour

Vue suivante

La séquence des deux pages(pour l’utilisateur) est programmée dans le premier contrôleur qui utilise une
La séquence des deux pages(pour
l’utilisateur) est programmée
dans le premier contrôleur qui
utilise une redirection vers le
deuxième contrôleur (et non dans
une page JSP) !
contrôleur qui utilise une redirection vers le deuxième contrôleur (et non dans une page JSP) !

SaisieNom.html

Le contrôleur MultiActionController Ce contrôleur permet de gérer une page complexe comprenant plusieurs boutons et/ou
Le contrôleur MultiActionController
Le contrôleur MultiActionController
Ce contrôleur permet de gérer une page complexe comprenant plusieurs boutons et/ou plusieurs sous pages.
Ce contrôleur permet de gérer une page complexe comprenant
plusieurs boutons et/ou plusieurs sous pages.
(une action par bouton)
Action1 Action1 Afficher Methode Action2 Action 1 Saisir Methode Action 2 retour Action3 Methode Action
Action1
Action1
Afficher
Methode
Action2
Action 1
Saisir
Methode
Action 2
retour
Action3
Methode
Action 3
suite
MultiActionControleur (S p rin g3)  Classe annoté @Controller et @ RequestMapping ( " /ur

MultiActionControleur (S p rin g3)

Classe annoté @Controller et @ RequestMapping ( " /url " )

@Controller @RequestMapping("/appointments") public class AppointmentsController {
@Controller
@RequestMapping("/appointments")
public class AppointmentsController {

On spécifie l’url de mapping sur la classe

Les méthodes annoté @RequestMappin g sont relatives à l’URL globale (sur la classe)

@RequestMapping(method = RequestMethod.GET) public Map<String, Appointment> get() { return
@RequestMapping(method = RequestMethod.GET)
public Map<String, Appointment> get() {
return appointmentBook.getAppointmentsForToday();
}
 Autre variante : @RequestMapping(value="/new", method = RequestMethod.GET) public AppointmentForm

Autre variante :

@RequestMapping(value="/new", method = RequestMethod.GET) public AppointmentForm getNewForm() { return new
@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
Spring 2
Un MultiActionController doit être déclaré dans le ficher <projet>-servlet.xml, ainsi que la manière de
Un MultiActionController doit être déclaré dans le ficher
<projet>-servlet.xml, ainsi que la manière de déterminer
les actions à exécuter en fonction de l’URL

Exemple: ici le choix de l’action se fera sur la présence d’un paramètre de la requête qui a le nom de l’une des actions

<bean id="MonController" class="web.MonController"> <property
<bean id="MonController"
class="web.MonController">
<property name="methodNameResolver">
<ref local="MaMethodNameResolver"/>
</property>
</bean>
<bean id="MaMethodNameResolver"
class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
<property name="defaultMethodName"><value>action1</value></property>
<property name="methodParamNames">
<list>
<value>action2</value>
<value>action3</value>
</list>
</property>
</bean>
Spring 2
Spring 2
package web; import org.springframework.web.servlet.ModelAndView; import
package web;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;
public class MonController extends MultiActionController {
// action par défaut: affichage page principale
public ModelAndView action1(HttpServletRequest request,
HttpServletResponse response) {
return new ModelAndView(« vuePagePrincipale »);
}
// action: affichage page secondaire
public ModelAndView action2(HttpServletRequest request,
HttpServletResponse response) {
return new ModelAndView(« vuePageSecondaire »);
}
// action : traitement retour page secondaire
public ModelAndView action3(HttpServletRequest request,
HttpServletResponse response) {
return new ModelAndView(« suite »);
}

Par exemple dans la page secondaire on aurait un formulaire avec un <input type="submit" name="action1" value="Retour" >

Spring 2
Spring 2
Exemple de page jsp déclenchant les actions sur le controleur
Exemple de page jsp
déclenchant les actions sur le controleur
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<form method="post">
<input type="submit" name="action1" value="Afficher">
<input type="submit" name="action2" value="Saisir">
<input type="submit" name="action3" value="Retour">
</form>
</body>
</html>
Les MultiActionController et les SimpleFormController sont la base des applications SpringMVC
Les MultiActionController et les SimpleFormController
sont la base des applications SpringMVC
Get Liste à sélection des noms des personnes Methode affichageListe Voir Détails Ajout Methode
Get
Liste à sélection
des noms des
personnes
Methode
affichageListe
Voir Détails
Ajout
Methode
MultiActionController
afficherDétails
Dét il
a
s
d’une
Methode
Personne
ajoutPersonne
retour
Redirection
Formulaire de
saisie des infos
d’une personne
Saisie
SimpleFormController
Personne
Retour
Redirection
Un exemple complet: Gestion des réservations de vol par des personnes
Un exemple complet: Gestion des réservations de vol par des personnes
Point de départ: le métier Personne Vol nom id * * prenom depart arrivee *
Point de départ: le métier
Personne
Vol
nom
id
*
*
prenom
depart
arrivee
*
*
FabPersonne
FabVol
getNoms()
getIds()
addPersonne()
addVol()
getPersonne()
getVol()

Et les cas d’utilisation

- Consulter la liste des personnes et avoir la possibilité de saisir une nouvelle personne
- Consulter la liste des personnes et
avoir la possibilité de saisir une
nouvelle personne
- Consulter la liste des vols et avoir la
possibilité de saisir un nouveau vol
- Réserver un vol pour une personne
On décide du modèle MVC de l’application:
On décide du modèle MVC de l’application:
Liste des vols MultiActionController MultiActionController Session de Liste à sélection des noms des personnes
Liste des vols
MultiActionController
MultiActionController
Session de
Liste à sélection
des noms des
personnes
l’utilisateur
Liste
Liste
Liste à sélection
des ids des
vols
Personnes
Vols
Voir Détails
Voir Détails
Ajout
Ajout
R
R
Saisie Personne
SimpleForm
Saisie Vol
SimpleForm
Controller
MultiActionController
Controller
Formulaire de
saisie des infos
d’une personne
Saisie
Saisie
Réservation
Personne
Vol
Formulaire de
saisie des infos
d’un vol
Retour
Retour
Réservation
Liste à sélection
des noms des
personnes
Liste à sélection
des ids des
vols
Voir Détails
Voir Détails
Choisir
Choisir
Confirmer
Annuler

Liste des personnes

à sélection des ids des vols Voir Détails Voir Détails Choisir Choisir Confirmer Annuler Liste des
Le fichier gestion-servlet.xml va configurer toute l’application. 1- On va avoir 5 contrôleurs q ui
Le fichier gestion-servlet.xml va configurer toute l’application.
Le fichier gestion-servlet.xml va configurer toute l’application.

1- On va avoir 5 contrôleurs

q ui seront affectés à différentes URL

<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
>
props
<prop key="/listePersonnes.html">ListePersonnesController</prop>
<prop key="/saisiePersonne.html">SaisiePersonneController</prop>
<prop key="/listeVols.html">ListeVolsController</prop>
<prop key="/saisieVol.html">SaisieVolController</prop>
<prop key="/reservation.html">ReservationController</prop>
</props>
<
Note:
</property>
</b
ean
>
On peut externaliser
dans un fichier

2- Les vues seront décrites dans le fichier vues.xml

<!-- le resolveur de vues externalisees --> <bean
<!-- le resolveur de vues externalisees -->
<bean class="org.springframework.web.servlet.view.XmlViewResolver">
<property name="location">
<value>/WEB-INF/vues/vues.xml</value>
</property>
</bean>
<bean id="ListePersonnesController" class="web.ListePersonnesController"> <property
<bean id="ListePersonnesController" class="web.ListePersonnesController"> <property
<bean id="ListePersonnesController"
class="web.ListePersonnesController">
<property name="methodNameResolver">
o
<
re
f l
oca
l="Li t
s e
M
e
th
dN
ame
R
eso ver
l
"/>
</property>
<property name="fabPersonne">
<ref bean="fabriquePersonne"/>
</
proper y
t
>
</bean>
<bean id="ListeVolsController" class="web.ListeVolsController"> <property
<bean id="ListeVolsController"
class="web.ListeVolsController">
<property name="methodNameResolver">
<
</property>
<property name="fabVol">
<ref bean="fabriqueVol"/>
t
re
f l
oca
l="Li t
s e
M
e
th dN
o
ame
R
eso ver
l
"/>
</
proper y
>
</bean>
<bean id= ReservationController " class="web.ReservationController"> <property
<bean id= ReservationController
"
class="web.ReservationController">
<property name="methodNameResolver">
<ref local="ReservationMethodNameResolver"/>
</property>
<property name="fabVol">
<ref bean="fabriqueVol"/>
</property>
<property name= fabPersonne >
<ref bean="fabriquePersonne"/>
</property>
</bean>
"
"
"

3- Trois contrôleurs sont des MultiActionController. On leur injecte le métier nécessaire.

4- On définit les actions reconnues par les MultiActionController
4- On définit les actions reconnues par les MultiActionController
<bean id="ListeMethodNameResolver"
<bean id="ListeMethodNameResolver"
class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
<property name="defaultMethodName"><value>list</value></property>
<property name="methodParamNames">
<list>
<value>ajout</value>
<value>voir</value>
</list>
</property>
</bean>
<bean id="ReservationMethodNameResolver"
class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
<property name="defaultMethodName"><value>list</value></property>
<property name="methodParamNames">
<list>
<value>choixVol</value>
<value>choixPersonne</value>
<value>voirVol</value>
<value>voirPersonne</value>
<value>confirmer</value>
<value>annuler</value>
</list>
</property>
</bean>
<bean id="SaisiePersonneController" class="web.SaisiePersonneController"> <property
<bean id="SaisiePersonneController" class="web.SaisiePersonneController"> <property
<bean id="SaisiePersonneController"
class="web.SaisiePersonneController">
<property name="sessionForm">
<value>true</value>
</property>
<property name="formView">
<value>saisirPersonne</value>
</property>
<property name="validator">
<ref bean="ValidatePersonne"/>
</property>
<property name="commandName">
<value>personne</value>
</property>
<property name="fabPersonne">
<ref bean="fabriquePersonne"/>
</property>
</bean>
<bean id="SaisieVolController" class="web.SaisieVolController"> <property
<bean id="SaisieVolController"
class="web.SaisieVolController">
<property name="sessionForm">
<value>true</value>
</property>
<property name="formView">
<value>saisirVol</value>
</property>
<property name="validator">
<ref bean="ValidateVol"/>
</property>
<property name="commandName">
<value>vol</value>
</property>
<property name="fabVol">
<ref bean="fabriqueVol"/>
</property>
</bean>
<bean id= ValidatePersonne " " class="web.ValidatePersonne"/> <bean
<bean id= ValidatePersonne
"
"
class="web.ValidatePersonne"/>
<bean id="ValidateVol"
class="web.ValidateVol"/>

5- Les 2 autres contrôleurs sont des SimpleFormController. Ils ont des validateurs associés. On leur injecte aussi le métier.

6- On définit la couche métier d’ abord les fabriques ici initialisées avec deux Personnes

6- On définit la couche métier d’abord les fabriques ici initialisées avec deux Personnes et deux Vols

<bean id= fabriquePersonne " " class="metier.FabPersonne"> <property
<bean id= fabriquePersonne
"
"
class="metier.FabPersonne">
<property name="personnes">
<map>
<entry>
<key> <value>Geib</value></key>
<ref local="PersonneGeib" />
</entry>
<
en ry
t
> <k
ey
> <
va ue
l
>Ti
son
</
va ue
l
></k
ey
>
<ref local="PersonneTison" />
</entry>
</map>
</
proper y
t
>
</bean>
<bean id= fabriqueVol " " class="metier.FabVol"> <property name="vols">
<bean id= fabriqueVol
"
"
class="metier.FabVol">
<property name="vols">
<map>
<entry>
<key> <value>AF322</value></key>
<ref local="volAF322" />
</entry>
<
en ry
t
> <k
ey
> <
va ue
l
>AF645</
va ue
l
></k
ey
>
<ref local="volAF645" />
</entry>
</map>
</
proper y
t
>
</bean>
7- Pour finir on définit les objets qui sont placés dans les fabriques Note: On

7- Pour finir on définit les objets qui sont placés dans les fabriques

Note: On peut utiliser un context global pour déclarer ces objets. Voir slides 20 et
Note:
On peut utiliser un context global
pour déclarer ces objets.
Voir slides 20 et 21.
<bean id="PersonneGeib" class="metier.Personne"> <property name="nom"
<bean id="PersonneGeib" class="metier.Personne">
<property name="nom" value="Geib" />
<property name="prenom" value="Jean-Marc" />
</bean>
<bean id="PersonneTison" class="metier.Personne">
<property name="nom" value="Tison" />
<property name="prenom" value="Sophie" />
</bean>
<bean id="volAF322" class="metier.Vol">
<property name="id" value="AF322" />
<property name="depart" value="Lille" />
<property name="arrivee" value="Lyon" />
</bean>
<bean id="volAF645" class="metier.Vol">
<property name="id" value="AF645" />
<property name="depart" value="Paris" />
<property name="arrivee" value="Toulouse" />
</bean>
Cela termine le fichier gestion-servlet.xml …
Cela termine le fichier gestion-servlet.xml …
Le fichier
Le fichier

5 vues JSP

et

<?xml version="1.0" encoding="ISO_8859-1"?>

<!DOCTYPE beans SYSTEM "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

 

4

di

ti

<!--

-->

re

rec ons

<bean id="listerPersonnes" class="org.springframework.web.servlet.view.JstlView"> <property name="url"><value>/WEB-INF/vues/listerPersonnes.jsp</value></property>

</bean>

<!--

<bean id="saisirPersonne" class="org.springframework.web.servlet.view.JstlView"> <property name="url"><value>/WEB-INF/vues/saisirPersonne.jsp</value></property> </bean> <!-- redirectionListePersonnes --> <bean id="redirectionListePersonnes" class="org.springframework.web.servlet.view.Redirect <property name="url"><value>/listePersonnes.html</value></property> <property name="contextRelative"><value>true</value></property> <property name="http10Compatible"><value>false</value></property> </bean> <!-- redirectionSaisiePersonneController --> <bean id="redirectionSaisiePersonneController" class="org.springframework.web.servlet.vie <property name="url"><value>/saisiePersonne.html</value></property> <property name="contextRelative"><value>true</value></property> <property name="http10Compatible"><value>false</value></property> </bean> <!-- listVols --> <bean id="listerVols" class="org.springframework.web.servlet.view.JstlView"> <property name="url"><value>/WEB-INF/vues/listerVols.jsp</value></property> </bean> <!-- --> <bean id="saisirVol" class="org.springframework.web.servlet.view.JstlView"> <property name="url"><value>/WEB-INF/vues/saisirVol.jsp</value></property> </bean> <!-- redirectionListeVols --> <bean id="redirectionListeVols" class="org.springframework.web.servlet.view.RedirectView" <property name="url"><value>/listeVols.html</value></property> <property name="contextRelative"><value>true</value></property> <property name="http10Compatible"><value>false</value></property>

Note:

C’est du Spring 2.x

-->

vues.xml

Reste à écrire les 5 contrôleurs et les 5 vues JSP et les 2 validateurs…

Reste à écrire les 5 contrôleurs et les 5 vues JSP et les 2 validateurs…

Voir les sources en annexe
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 <html> <body><h3> Personnes et
Pour finir un fichier index.jsp pour entrer dans l’application
<html>
<body><h3>
Personnes et vols
<br>
Choisissez: <br>
<a href="<c:url value="listePersonnes.html"/>">Gestion des Personnes</a><br>
<a href="<c:url value="listeVols.html"/>">Gestion des Vols</a><br>
<a href="<c:url value="reservation.html"/>">Gestion des Reservations</a><br>
</h3></body>
</html>
 Plugin Eclipse pour Spring h ttp://springi d e. org/project/wi ki/Springi deInsta ll

Plugin Eclipse pour Spring

h ttp://springi de. org/project/wi ki/Springi deInsta ll

Bibliography  Spring 3.x tutorials  http: // www.rose in di a.ne t/ spr i

Bibliography

Spring 3.x tutorials

http://www.rose in dia.ne t/spring/spring3 /in d ex.s html

http://yannart.developpez.com/java/spring/tutoriel/

h ttp://www.theservers id e.com/tutoria l/Spring30TutorialSettingUpConfiguringThe Environment

Download

h ttp://www.springsource.com/d ownl oad/commun ity

Req uired Jar files  For a typical web application you need the following module

Req uired Jar files

For a typical web application you need the following module jars:

org.springframework.web.servlet

org.springframework.web

org. springframework. asm

org.springframework.beans

org.springframework.core

org.springframework.context

org.springframework.expression

Since most web a pp lications use logging and basic AOP features, you need the following required thirdparty offerings:

commonsloggi ng1.1.1

Notes sur les annotations  Un bean ne peut pas etre declare a la fois

Notes sur les annotations

Un bean ne peut pas etre declare a la fois par @annotated et par <bean></bean>. Si on utilise les 2, il est declare 2 fois, et le conteneur renvoie une erreur ‘a lrea dy mappe d ’

Si on utilise SimpleUrlHandlerMapping (dans le fichier de 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 l e bean de type correspondant; Ne permet pas de specifier le nom du bean

;

@Autow i re – identi que a @Inj ect, mai s v i ent de S pr i ng.

Validation – La validation peut être effectue avec ’JSR303 Validator’; Utilise le tag @Valid

Installation  Spring comprend un ensemble de jars de base, necessaire a l’execution.  Il

Installation

Spring comprend un ensemble de jars de base, necessaire a l’execution.

Il es t aussi possible de télécharger un environement de dévelopement basé sur Eclipse

Les jar uniquement:

http://www.springsource.org/download

L’envi ronemen t Eclipse :

SpringSource Update Site for Eclipse 3.7 (Release)

http://dist.springsource.com/release/TOOLS/update/e3.7

Télécharger L’environement Ecli p se

Télécharger L’environement Ecli pse

Télécharger L’environement Ecli p se
Documentations  Tutoriaux  http: //bl og.spr i ngsource.com / 2011 /01/04/ green ‐ b

Documentations

Tutoriaux

http://blog.springsource.com/2011/01/04/green b eans gettingstarted with springmvc/

Pas d ’exp li ca ti on sur commen t ré cuperer l es jars, l es dé p l oyer,

http ://static.sp rin gframework.org/docs/Sprin gMVC stepby step/overview.html

2.5. A adapter pour 3.x