0% ont trouvé ce document utile (0 vote)
51 vues82 pages

Introduction Spring MVC

Ce document décrit l'utilisation du framework Spring MVC pour le développement d'applications web suivant le modèle MVC. Il présente les concepts clés de Spring MVC tels que les contrôleurs, les vues et l'inversion de contrôle. Le document contient également des exemples de code pour illustrer la mise en œuvre d'une application simple avec Spring MVC.

Transféré par

tresbonarchitecte
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
51 vues82 pages

Introduction Spring MVC

Ce document décrit l'utilisation du framework Spring MVC pour le développement d'applications web suivant le modèle MVC. Il présente les concepts clés de Spring MVC tels que les contrôleurs, les vues et l'inversion de contrôle. Le document contient également des exemples de code pour illustrer la mise en œuvre d'une application simple avec Spring MVC.

Transféré par

tresbonarchitecte
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

JJean‐Marc

M G ib
Geib
Cedric Dumoulin
 Documentation
 [Link]
htt // t ti i / i /d / t/ i
ng‐framework‐reference/html/[Link]
 Tutorial
 [Link]
introduction spring mvc framework/
introduction‐spring‐mvc‐framework/
 Download Spring‐framework
 [Link]
htt // i / i
framework#download
 Utiliser 3.1.3
313
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


externe (xml)
( l) dé
décrivant
i lles objets
bj à créer,
é lles valeurs
l iinitiales
i i l et lles
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
g Pattern de l’Inversion du Contrôle : IoC
Exemple simplifié:
class Personne { String nom; Voiture car; }
Avec les classes:
class Voiture {String nom;}
et la description de contexte Spring:

<beans>
<bean id=
id=" user " class=
class=" Personne ">>
<property name=" nom " value=" jean "/>
<property name= " car " ref= "vehicule "/>
</bean>
<bean id=" vehicule " class=" Voiture ">
<property name=" nom " value=" megane "/>
</bean>
</beans>

Le contexte initial de l’application


l application dans le conteneur SPRING sera:

Personne Voiture
user nom:jean
j vehicule
nom:megane
car:
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


p g 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 xml du conteneur, sans
cchanger
a ge les
es ééléments
é e sp programmés!
og a és
Retour sur le modèle MVC

Une application 3tier classique:

U application
Une li ti 3ti3tier avec MVC
MVC:
La vision de SpringMVC

La [Link]
g p g p est le p
point d’entrée
générique qui délègue les requêtes à des Controller
Un [Link] prend en charge une requête,
et utilise la couche métier pour y répondre
répondre.
Un Controller fabrique un modèle sous la forme d’une [Link] contenant les
éléments de la réponse.
Un Controller
C choisit une [Link]
f qui sera
paramétrée par la Map pour donner la page qui sera affichée.
Spring 3.x

Controller Spring 3
 Spring 3 simplifie la création des contrôleurs:
 annotations @Controller
ll et @RequestMapping
 Pas d’interface à implémenter
 Le contrôleur le pplus simple:
p
 une classe annoté @Controller
 plus une méthode annoté @RequestMapping
 Cette méthode reçoit la requête, doit la traiter (c
(c’est
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")
q pp g( )
public ModelAndView helloWorld() {
ModelAndView mav = new ModelAndView();
[Link]("helloWorld");
[Link]("date",
j , new Date());
())
return mav;
}
}
URL DispatcherServlet

HandlerMapping Metier
Choix d’un contrôleur
en fonction de l’URL

MonControleur
HttpServletRequest
handleRequest ModelAndView =

N
Nom d
de vue + Model
M d l

Choix d
d’une
une vue
ViewResolver
Page
HTML Vue Model

fournit par Spring A fournir


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

public class Groupe {

private ArrayList<Object> membres;

public ArrayList<Object> getMembres() {


return membres;
}

public void setMembres(ArrayList<Object> membres) {


[Link] = membres;
}

public void addMembre (String membre) {


if ([Link](membre))
throw
h new MembrePresentException();
b i ()
[Link](membre);
}
}
Spring 3.x

Contrôleur Spring 3
@Controller @Controller
public class Affichage
p g { Pas d’interface
à implémenter
// un groupe de personnes fourni par le contexte de l'application
private Groupe groupe;

public Groupe getGroupe() { Le groupe sera injecté


return groupe; lors de la création du contexte
}

public void setGroupe(Groupe groupe) {


[Link] = groupe;
}

// gestion de la requête
@RequestMapping("/afficher")
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception {
Nom de la vue à utiliser
ModelAndView mav = new ModelAndView(); pour générer la page
[Link]("vuemembres");
[Link]("groupe", groupe);
return mav; Ajoutt d
Aj du groupe
} au modèle
Exemple: 3 – une page JSP-JSTL pour afficher les membres

<%@ page language="java" pageEncoding="ISO-8859-1"


contentType="text/html;charset=ISO-8859-1"%>
<%@ taglib prefix="c" uri="[Link] %>

<html>
<head>
<title>Affichage</title>
On retrouve
</head>
<body> le modèle
<h2>Groupe</h2>
<table border="1">
<tr>
<th colspan
colspan="3"
3 align
align="center">Membres
center >Membres du groupe</th>
</tr>
<tr>
<c:forEach var="personne" items="${[Link]}">
<td>${personne}</td>
</c:forEach>
</tr>
</table>
<a href="<c:url value="/[Link]"/>">Ajout</a>
</body>
</html> Fi hi //views/[Link]
Fichier i / b j
Exemple: 4: définir l’application WEB:

<?xml version="1.0" encoding="UTF-8"?>


<web-app xmlns:xsi="[Link]
xmlns="[Link]
xmlns= [Link]
sun com/xml/ns/javaee"
xmlns:web="[Link]
xsi:schemaLocation="[Link]
[Link]
id="WebApp
id= WebApp_ID
ID" version=
version="2
2.5
5">
>
<display-name>testspring3</display-name> On déclare la seule
<!-- la servlet --> Servlet principale
<servlet>
<servlet-name>membres</servlet-name>
<servlet name>membres</servlet name>
<servlet-class>
[Link]</servlet-class>
</servlet>
<!-- le mapping des url -->
<! >
<servlet-mapping>
<servlet-name>membres</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet mapping>
</servlet-mapping>
</web-app>

Ce fichier [Link] ne change jamais.


C fifichier
Ce hi estt d
dans lle répertoire
é t i WEB WEB-INF
INF
Exemple: 5 le contexte initial souhaité de l’application

Injection de dépendance

Pierre
groupe:
g p Paul
au
Jacques

Une instance de Une instance


Affichage Initialisée du métier

Cela doit être décrit dans un fichier WEB-INF/[Link]

Nom de la DispatcherServlet
Spring 3.x
Exemple
p : 5 - le fichier WEB-INF/[Link]

<?xml version="1.0" encoding="UTF-8"?>


<beans xmlns="[Link]
xmlns:xsi="[Link]
xmlns:jee [Link]
xmlns:jee="[Link]
xmlns:context="[Link]
xsi:schemaLocation="[Link]
[Link]
[Link]
[Link]
[Link]
[Link]

<!-- Scan package to discover spring annotations -->


<context:component-scan base-package="web"/>
pour découvrir
les annotations
Spring 3.x
Exemple
p : 5 - le fichier WEB-INF/[Link] ((suite))

<beans>
<!-- le controleur -->
<bean id="AffichageController" class="[Link]">
<
<property
t name="groupe"
" " ref="groupe"/>
f " "/>
</bean> La dépendance
pour injecter le groupe
<!– l’instance du metier
<b
<bean id
id="groupe"
" " class="[Link]"
l " ti G "
<property name="membres">
<list>
<value>Paul</value>
< al e>Mélanie</ al e>
<value>Mélanie</value>
<value>Jacques</value>
</list>
</property>
</bean>
Exemple: 6 – les mappings

1 - On veut que l’URL /[Link] 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 [Link]

Il faut
f t utiliser
tili un ViewResolver
Vi R l

Il faut les déclarer dans le fichier [Link]


Exemple: 6 – les mappings dans [Link]

<?xml version="1.0" encoding="UTF-8"?>


<beans xmlns="[Link]
xmlns:xsi="[Link]
xmlns:p="[Link]
p p // p gf g/ /p
xmlns:context="[Link]
xsi:schemaLocation="[Link]
[Link]
[Link]
p // p gf g/ /
[Link]

<!-- le ViewResolver -->


<bean id="viewResolver"
class="[Link]">

<property name="viewClass"
value="[Link]"
g p gf />
/
<property name="prefix" value="/WEB‐INF/vues/" />
<property name="suffix" value=".jsp" /> Le nom de la vue
</bean>
est utilisé pour former
le nom de la jsp
membres
WEB-INF
[Link]
[Link]
e b es se e

vues
[Link]
j p
src
metier
L’appli Web avec Spring: [Link]
web
[Link]
lib
[Link]
[Link]
[Link]
[Link]
ll ti j
classes

Lancement: [Link]
On peut sortir le mapping des vues du fichier de configuration

<!– un autre resolveur de vues -->


<bean class="[Link]">
<property name="location">
<value>/WEB-INF/vues/vues
<value>/WEB INF/vues/[Link]</value>
xml</value>
</property>
</bean>

Fichier /WEB-INF/vues/[Link]

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


<!DOCTYPE beans SYSTEM "[Link]
<beans>
<bean id="vuemembres" class="[Link]">
<property name="url">
<value>/WEB-INF/vues/[Link]</value>
</property>
/p p y
</bean>
</beans>
On peut créer un contexte global à l’application
l application web
web, utile pour y mettre
une fois pour toute la liaison avec la couche métier. Il faut utiliser pour cela
un fichier [Link].

Exemple de ce fichier /WEB-INF/[Link] pour notre application

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


<!DOCTYPE beans SYSTEM "[Link]
<beans>
<!– le contexte métier est la liste de personnes -->
<bean id="groupe" class="[Link]">
<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 [Link]

<?xml version=
version="1
1.0
0" encoding=
encoding="ISO-8859-1"?>
ISO 8859 1 ?>
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"[Link]
<web-app>
<!-- le chargeur du contexte de l'application -->
<listener>
<listener-class>
[Link]
</listener-class>
</listener>
...
</web-app>
membres
[Link]
WEB-INF
[Link]
[Link]
[Link]

vues
[Link]
L’appli Web avec Spring: [Link]
src
metier
[Link]
web
[Link]
lib
[Link]
spring jar
[Link]
[Link]
commons-collections
commons [Link]
jar
classes
Spring 3.x

Formulaire
 Met en œuvre:
 une page web b (ex:
( jsp)
j )
 un contrôleur avec jusque deux méthodes pour traiter
les 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

POJO annoté @Controller

GET Request

@RequestMapping(method = [Link]) Crée ou model


processGet(ModelMap model) retrouve implicite
view ’logicalview’
Formulaire formulaire Objet
prérempli Command
POST data

Utilise
@RequestMapping(method = [Link])
protected String processPost(…)

Page Metier
Objet
HTML ModelAndView
Initialiser l’objet
j de Command
 Par une méthode annoté @ModelAttribute

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

 Ou dans la méthode du ‘get


get ’
Spring 3.x

@Controller @RequestMapping("ajouter")
public class AjoutController {
private Groupe groupe;

@Inject Injecte un objet du type demandé


public void setGroupe(Groupe groupe) {
[Link] = groupe;}

@RequestMapping(method
q pp g = [Link])
q
protected Object processGet(ModelMap model) {
récupère le modèle implicite
// Create the command used to fill the jsp form
CommandAjout cmd = new CommandAjout(); crée l’objet command
[Link]("Entrez un nom");
// Add it to the implicit model
[Link]("commandAjout", cmd); la vue affichant le formulaire
// return the logical name of the view used to render the form.
return "formulaire";
} récupère
é è l’l’objet
bj t command
d
à partir du modèle implicite
@RequestMapping(method = [Link])
protected String processPost( @ModelAttribute("commandAjout") CommandAjout commandAjout,
BindingResult result, SessionStatus status ) throws Exception
p {
if( [Link]()) {
return "formulaire";} le résultat du bind
// Add new membre
[Link]([Link]());
status setComplete();
[Link](); indique la fin de la session
return "confirmation"; nettoie les attributs du modèle
}
}
Spring 3.x

[Link]
<body><h3>Formulaire Ajouter un membre </h3> nom de l’objet dans le modèle
<form:form commandName="commandAjout">
<table>
<tr> nom de propriete dans l’objet
<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>

confirmation jsp
[Link]
<body>
<h3>Confirmation de l'ajout</h3> valeur de la propriété
<table border="1">
<tr>
<td>Nouveau Membre </td>
<td>${[Link]}</td>
</tr>
</table>
< href="<c:url
<a h f "< l value="/[Link]"/>">Retour</a>
l "/ ffi h ht l"/>">R t </ >
</body>
Spring 3.x

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‐[Link]


<beans xmlns="[Link]
xmlns:xsi="[Link]
xmlns:jee="[Link]
xmlns:context="[Link]
xsi:schemaLocation="[Link]
[Link] beans [Link]
[Link]
[Link]
[Link]
[Link]
[Link]
htt //
[Link]
i f k / h / t t
[Link]

<!-- Scan package to discover spring annotations -->


<context:component-scan base-package="web"/>

</beans>
Spécifie le package à scanner
membres
[Link]
WEB-INF
[Link]
[Link]
applicationContext xml
[Link]

vues
[Link]
[Link]
[Link]
L’appli Web avec Spring: [Link]
src
metier
[Link]
web
[Link]
[Link]
[Link]
lib
[Link]
[Link]
[Link]
[Link]
classes
On peut terminer par mettre un « welcome file » dans le [Link]
<welcome-file-list>
<welcome-file>[Link]</welcome-file>
</welcome-file-list>

fichier [Link]:
<%@ page language="java" pageEncoding="ISO-8859-1"
contentType text/html;charset ISO 8859 1 %>
contentType="text/html;charset=ISO-8859-1"%>
<%@ taglib uri="/WEB-INF/[Link]" prefix="c" %>

<c:redirect url="/[Link]"/>

Et mettre des liens pour naviguer dans l’application.

- Dans [Link], pour permettre d’ajouter des membres

<a href="<c:url value="/[Link]"/>">Ajout</a>

- Dans
D [Link],
fi ti j pour retourner
t à lla liliste
t
<a href="<c:url value="/[Link]"/>">Retour</a>
membres
[Link]
[Link]
WEB-INF
[Link]
[Link]
b l t l
L’appli est terminée [Link]
et se lance par:
vues
[Link] [Link]
[Link]
[Link]
[Link]
fi ti j
src
metier
[Link]
p j
web
[Link]
[Link]
C
[Link]
dAj t j
lib
[Link]
[Link]
j
[Link]
[Link]
classes
Spring 3
Spring 3.x

Gestion des erreurs


 Les erreurs peuvent être issues :
• De
D mauvaises
i saisies
i i dans
d lles formulaires
f l i
• De données saisies non valables pour le métier
• Des
D exceptions
i remontant du d métier
éi

 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 = [Link])
protected String onSubmit(
@ModelAttribute("commandAjout") CommandAjout commandAjout,
BindingResult result,
result SessionStatus status ) throws Exception {

if( [Link]()) {
return "formulaire"; retourne au formulaire en cas d’erreurs
}

[Link]([Link]());
[Link]();
return "confirmation";
confirmation ; efface la session si ok
}

 @ModelAttribute permet de récupérer l’objet command.


 Il est peuplé à partir de la requete,
requete donc avec les valeurs saisies dans le formulaire.
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")
@RequestMapping( ajouter )
public class AjoutController {

@Inject L’objet validator


private ValidatePersonne validator;

@RequestMapping(method = [Link])
protected String onSubmit(
@ModelAttribute("commandAjout")
@ModelAttribute( commandAjout ) CommandAjout commandAjout,
commandAjout
BindingResult result, SessionStatus status ) throws Exception {

// validation
validator validate(commandAjout result);
[Link](commandAjout,
if( [Link]()) {
return "formulaire";
appel la validation. Utilise le BindResult
}


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

package web;

import [Link];

public class ValidatePersonne implements [Link] {

/** pour dire que c’est un validator de la classe CommandAjout


*/
public boolean supports(Class classe) {
boolean assignableFrom = [Link]([Link]);
return assignableFrom;
g ;
}

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 = [Link]();
if (membre == null || [Link]().length() == 0) {
// les erreurs sont stockées dans un objet de type Errors
[Link]("nouveauMembre",
"[Link]", (memberName, msgKey, defaultMsg)
"Le nom est nécessaire !");
}
}

}
[Link]
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
path, if any)
any), using the given error description
description.

void rejectValue(String field, String errorCode, String defaultMessage)


Register
g a field error for the specified
p field of the current object
j ((respecting
p g the
current nested path, if any), using the given error description.
Spring 3.x

Validation
 Peut aussi utiliser le standard
 ’JSR‐303
’JSR V lid t ’
Validator’
 Utilise le tag @Valid et des validators
 Nécessite
Né i une implémentation
i lé i d du standard
d d
 ex: Hibernate Validate

 Non développé ici 


Comment afficher les erreurs dans
les JSP ? (vers>2.5)
( )
 En utilisant un tag Spring : le tag
<form:errors path = xxxx />
c
 Le
L tag form:errors
f permet d’afficher
d’ ffi h lles erreurs
associées à l’objet désigné par le path (reject) ou à ses
attributs (rejectValue).
(rejectValue)

<form:form commandName="commandAjout" />



<form:errors path="nouveauMembre" />

</form:form>
Formulaire complété
pour afficher
ffi h les
l éventuelles
é ll erreurs (vers>2.5)
( 2 5)
<%@ page language="java" pageEncoding="ISO-8859-1"
contentType text/html;charset ISO 8859 1 %>
contentType="text/html;charset=ISO-8859-1"%>
<%@ taglib prefix="c" uri="[Link]
<%@ taglib prefix="form" uri="[Link]

<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>
ht l
<style>
.error {
color: #ff0000;
}
.errorblock{
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>
L gestion
La ti d des messages d’
d’erreurs

Dans le fichier de configuration


g il faut indiquer
q q
que l’on va utiliser
un fichier [Link] pour contenir les messages.

<!-- le fichier des messages -->


<bean id="messageSource"
class="[Link]">
<property name="basename">
<value>messages</value>
</property>
</bean>

Le fichier [Link]
messages properties :

[Link]=Un nom est nécessaire


[Link]=Echec de l'ajout

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


L gestion
La ti d des messages d’
d’erreurs – i18n
i18

Il p
peut y avoir un fichier de messages
g p pour chaque
q langue.
g
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 -->
<b
<bean id "
id="messageSource"
S "
class="[Link]">
<property name="basename">
<value>messages</value>
</property>
</bean>

messages_fr_FR.properties

[Link]=Un nom est nécessaire


[Link]=Echec de l'ajout

messages
g _en_US.properties
p p

[Link]=Name is mandatory
[Link]=Duplicate name
membres
[Link]
[Link]
WEB-INF
[Link]
[Link]
[Link]

vues
[Link]
[Link]
L’appli Web avec Spring: [Link]
[Link]
src
metier
[Link]
web
[Link]
g j
[Link]
[Link]
[Link]
lib
[Link]
[Link]
[Link]
[Link]
j
classes
[Link]
Accéder à un objet JNDI ou EJB
 L’objet doit exister dans un autre container
 On injecte le bean
 ex: injecter
j p g
un bean dans Spring

[Link]
<beans xmlns=
xmlns="[Link]
[Link]
springframework org/schema/beans"
xmlns:xsi="[Link]
xmlns:jee="[Link]
xsi:schemaLocation="[Link]
[Link] springframework org/schema/beans/spring-beans-2 5 xsd
[Link]
[Link]
[Link]

<bean id=
id="catalogController"
catalogController class=
class="ipint
[Link]
mysite CatalogController">
>
<property name="catalog" ref="catalogId"/>
</bean> injection

<jee:jndi lookup id=


<jee:jndi-lookup id="catalogId"
catalogId jndi
jndi-name="CatalogBean/remote"
name= CatalogBean/remote
cache="true" />
</beans> recherche du bean – lien nom l ogique <-> nom JNDI
Accéder à un objet
j JNDI ou EJB
 <jee:jndi-lookup>
<jee:jndi lookup>
 Acces par JNDI
 <jee:local-slsb>
 Acces a un bean local
 <jee:remote-slsb>
 Acces à un bean distant

<jee:local-slsb id=
id="myComponent"
myComponent jndi-name=
jndi-name="ejb/myBean"
ejb/myBean
business-interface="[Link]"/>
<bean id="myController" class="[Link]">
<property name
name="myComponent"
myComponent ref
ref="myComponent"/>
myComponent />
</bean>
Documentation
 Spring
 [Link]
 tutoriall
 [Link]
[Link]
 tutorial; a adapter pour la dernière version
 article
 [Link]
 synthese
y de Spring
p g
 documentation
 [Link]
 la reference
 pdf : ([Link]

 Exemples
 Exemples fournies avec Spring
 \spring‐framework‐2.5.x\samples
\ i f k \ l
Utiliser Spring 3
 Nécessite les jars
((situés dans spring3.x/dist)
p g3 / )
 [Link]
 [Link]
 [Link]
 [Link]
 [Link]
org springframework core
 [Link]
 [Link]

 Download:
 [Link]
Partie 2
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 peut être construite:


- à l’aide du lien (href) dans les pages JSP
l’utilisateur passe d’une pageg à 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…
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
JSP.

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:


L’attribut action du formulaire
n’est pas précisé !
Get
[Link]:
Simple
Formulaire
Form <form method = post >
Submit Controller ….
<input type=« Submit » >
</form>
Vue suivante
L’attribut action du formulaire
n’est pas précisé !
Get
[Link]:
Simple
Formulaire
Form <form
f method
th d = postt >
Submit Controller ….
<input type=« Submit » >
</form>
/form
Vue suivante

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 vers le contrôleur qui va générer
ce formulaire et va le recevoir en retour !!!
<bean class="[Link]">
<property name="mappings">
<props>
<prop key="/[Link]">SaisieNom</prop>
key="/SaisieNom html">SaisieNom</prop>
Exemple: <prop key="/[Link]">SaisiePrenom</prop>
</props>
</property>
</bean>

[Link]
public class SaisieNom extends SimpleFormController {

Saisie protected ModelAndView onSubmit() {
Nom
Nom return new ModelAndView("redirectionSaisiePrenom" );
}
Submit Controller }

[Link]
<bean id="redirectionSaisiePrenom"
[Link]=[Link]
Redirection class="[Link]">
[Link]=/[Link]
<property name="url"><value>/[Link]</value></property>
</bean>
/b

La séquence des deux pages(pour


Saisie
S i i l’utilisateur) est programmée
Prénom
Prenom dans le premier contrôleur qui
Submit Controller utilise une redirection vers le
d
deuxième
iè contrôleur
t ôl ((ett non d
dans
Vue suivante une page JSP) !
Le contrôleur MultiActionController

Ce contrôleur permet de gérer une page complexe comprenant


plusieurs boutons et/ou plusieurs sous pages.
(une action par bouton)
Action1

Action1
Affi h
Afficher
Methode
Action2 Action 1
Saisir

Methode
Action 2

retour Action3 Methode


Action 3

suite
MultiActionControleur (Spring3)
( p g )
 Classe annoté
@Controller et @RequestMapping(
@RequestMapping("/url")
/url )
@Controller
@RequestMapping("/appointments")
q pp g / pp
public class AppointmentsController {

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


 Les méthodes annoté @RequestMapping
g sont relatives
à l’URL globale (sur la classe)
@RequestMapping(method = [Link])
public
bli Map<String,
M St i A
Appointment>
i t t get()
t() {
return [Link]();
}
 Autre variante :
@RequestMapping(value="/new",
R tM i ( l "/ " method
th d = [Link])
R tM th d GET)
public AppointmentForm getNewForm() {
return new AppointmentForm();
}

 On accède au contrôleur par


[Link]

 Comment mapper un bouton sur un contrôleur ?


 Rechercher dans doc.
Spring 2

Un MultiActionController doit être déclaré dans le ficher


<projet>-[Link], 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="[Link]">
<property name="methodNameResolver">
<ref local="MaMethodNameResolver"/>
</property>
</bean>
<bean id="MaMethodNameResolver
MaMethodNameResolver"
class="[Link]">
<property name="defaultMethodName"><value>action1</value></property>
<property name="methodParamNames">
<list>
<value>action2</value>
<value>action3</value>
</list>
</property>
</bean>
Spring 2
package web;

import [Link];
import [Link];

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

Exemple de page jsp


déclenchant les actions sur le controleur

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"


pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD
// // HTML 4.01 Transitional//EN"
//
"[Link]
<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>
/f
</body>
</html>
Les MultiActionController et les SimpleFormController
sont la base des applications SpringMVC

Get

Liste à sélection
des noms des
personnes
Methode
Voir Détails affichageListe
Ajout Methode
afficherDétails
MultiActionController
Détails
d’une Methode
Personne ajoutPersonne
retour

Redirection

Formulaire de
saisie des infos
d’une personne Saisie
SimpleFormController
Redirection Retour Personne
Un exemple complet: Gestion des réservations de vol par des personnes

Point de départ: le métier Et les cas d’utilisation

Personne Vol
nom id
prenom * * depart - Consulter la liste des personnes et
arrivee avoir la possibilité de saisir une
nouvelle personne
* * - Consulter la liste des vols et avoir la
possibilité de saisir un nouveau vol
FabPersonne FabVol - Réserver un vol pour une personne

getNoms() getIds()
addPersonne() addVol()
getPersonne() getVol()
On décide du modèle MVC de l’application:

Liste des personnes Liste des vols


MultiActionController MultiActionController
Session de
Liste à sélection l’utilisateur Liste à sélection
des noms des des ids des
personnes Liste Liste vols
Personnes Vols
Voir Détails Voir Détails
Aj t
Ajout Aj t
Ajout

Saisie Personne R SimpleForm


R
Saisie Vol
SimpleForm
Controller MultiActionController Controller
Formulaire de Formulaire de
saisie des infos Saisie Saisie saisie des infos
d’une personne
Personne Réservation Vol d’un vol

Retour R t
Retour

Réservation
Liste à sélection Liste à sélection
des noms des des ids des
personnes vols

Voir Détails Voir Détails


Choisir Choisir

Confirmer Annuler
Le fichier [Link] va configurer toute l’application.

1- On va avoir 5 contrôleurs qui seront affectés à différentes URL


1
<bean class="[Link]">
<property name="mappings">
<props>
<prop key="/[Link]">ListePersonnesController</prop>
<prop key="/[Link]">SaisiePersonneController</prop>
<prop key="/[Link]">ListeVolsController</prop>
<prop key=
key="/saisieVol
/[Link]
html">SaisieVolController</prop>
>SaisieVolController</prop>
<prop key="/[Link]">ReservationController</prop>
</props>
</property> Note:
</bean> On peut externaliser
dans un fichier

2- Les vues seront décrites dans le fichier [Link]


<!-- le resolveur de vues externalisees -->
<bean class="[Link]">
<property name="location">
<value>/WEB-INF/vues/[Link]</value>
</property>
</bean>
<bean id="ListePersonnesController" <bean id="ListeVolsController"
class="[Link]"> class="[Link]">
<property name="methodNameResolver"> <property name="methodNameResolver">
<ref local=
local="ListeMethodNameResolver"/>
ListeMethodNameResolver /> <ref local=
local="ListeMethodNameResolver"/>
ListeMethodNameResolver />
</property> </property>
<property name="fabPersonne"> <property name="fabVol">
<ref bean="fabriquePersonne"/> <ref bean="fabriqueVol"/>
</property> </property>
</bean> </bean>

<bean id=
id="ReservationController"
ReservationController
class="[Link]">
<property name="methodNameResolver">
<ref local="ReservationMethodNameResolver"/>
</property> 3- Trois contrôleurs sont des
<property name="fabVol"> MultiActionController. On leur
<ref bean="fabriqueVol"/> injecte le métier nécessaire.
</property>
<property name=
name="fabPersonne">
fabPersonne >
<ref bean="fabriquePersonne"/>
</property>
</bean>
4- On définit les actions reconnues par les MultiActionController

<bean id="ListeMethodNameResolver"
class="[Link]">
<property name="defaultMethodName"><value>list</value></property>
<property name="methodParamNames">
<list>
<value>ajout</value>
l j / l
<value>voir</value>
</list>
</property>
</bean>
/b
<bean id="ReservationMethodNameResolver"
class="[Link]">
<property name="defaultMethodName"><value>list</value></property>
<propertyt name="methodParamNames">
" th dP N "
<list>
<value>choixVol</value>
<value>choixPersonne</value>
<value>voirVol</value>
l iV l / l
<value>voirPersonne</value>
<value>confirmer</value>
<value>annuler</value>
</list>
/li t
</property>
</bean>
<bean id="SaisiePersonneController" <bean id="SaisieVolController"
class="[Link]">
l " bS i i P C t ll " class="[Link]">
l " b S i i V lC t ll "
<property name="sessionForm"> <property name="sessionForm">
<value>true</value> <value>true</value>
</property> </property>
<property t name="formView">
"f Vi " <propertyt name="formView">
"f Vi "
<value>saisirPersonne</value> <value>saisirVol</value>
</property> </property>
<property name="validator"> <property name="validator">
<reff bean="ValidatePersonne"/>
b "V lid t P "/ <reff bean="ValidateVol"/>
b "V lid t V l"/
</property> </property>
<property name="commandName"> <property name="commandName">
<value>personne</value> <value>vol</value>
</property>
/ t </property>
/ t
<property name="fabPersonne"> <property name="fabVol">
<ref bean="fabriquePersonne"/> <ref bean="fabriqueVol"/>
</property> </property>
</bean>
/b </bean>
/b

5- Les 2 autres contrôleurs sont des


<bean id="ValidatePersonne" Si l F
SimpleFormController.
C t ll IlIls ontt d
des
class="[Link]"/>
<bean id="ValidateVol"
validateurs associés. On leur injecte
class="[Link]"/> aussi le métier.
6- On définit la couche métier
d’abord
d abord les fabriques
ici initialisées avec deux Personnes et deux Vols

<bean id=
id="fabriquePersonne"
fabriquePersonne <bean id=
id="fabriqueVol"
fabriqueVol
class="[Link]"> class="[Link]">
<property name="personnes"> <property name="vols">
<map> <map>
<entry> <entry>
<key> <value>Geib</value></key> <key> <value>AF322</value></key>
<ref local="PersonneGeib" /> <ref local="volAF322" />
</entry> </entry>
<entry> <key> <value>Tison</value></key> <entry> <key> <value>AF645</value></key>
<ref local="PersonneTison" /> <ref local="volAF645" />
</entry> </entry>
</map> </map>
</property> </property>
</bean> </bean>
<bean id="PersonneGeib" class="[Link]">
7- Pour finir on définit les <property name="nom" value="Geib" />
p p y name="prenom"
<property p value="Jean-Marc" />
objets qui sont placés </bean>
dans les fabriques
<bean id="PersonneTison" class="[Link]">
<property
p p y name="nom" value="Tison" />
<property name="prenom" value="Sophie" />
</bean>

<bean id="volAF322" class="[Link]">


Note: <property name="id" value="AF322" />
On peut utiliser un context global <property name="depart" value="Lille" />
pour déclarer ces objets. <property name="arrivee" value="Lyon" />
Voir slides 20 et 21. </bean>

<bean id="volAF645" class="[Link]">


<property name="id" value="AF645" />
<property
p p y name="depart"
p value="Paris" />
<property name="arrivee" value="Toulouse" />
</bean>

Cela termine le fichier [Link] …..


<?xml version="1.0" encoding="ISO_8859-1"?> 5 vues JSP
<!DOCTYPE beans SYSTEM "[Link]
et
Le fichier
<beans>
<!
<!-- -->
> 4 redirections
[Link]
<bean id="listerPersonnes" class="[Link]">
<property name="url"><value>/WEB-INF/vues/[Link]</value></property>
</bean> Note:
<!-- --> C’est du Spring 2.x
<bean id="saisirPersonne" class="[Link]">
<property name="url"><value>/WEB-INF/vues/[Link]</value></property>
</bean>
<!-- redirectionListePersonnes -->
<bean idid="redirectionListePersonnes"
redirectionListePersonnes class
class="[Link]
[Link]
<property name="url"><value>/[Link]</value></property>
<property name="contextRelative"><value>true</value></property>
<property name="http10Compatible"><value>false</value></property>
</bean>
<!
<!-- redirectionSaisiePersonneController -->>
<bean id="redirectionSaisiePersonneController" class="[Link]
<property name="url"><value>/[Link]</value></property>
<property name="contextRelative"><value>true</value></property>
<property name="http10Compatible"><value>false</value></property>
</bean>
<!-- listVols -->
<bean id="listerVols" class="[Link]">
<property name="url"><value>/WEB-INF/vues/[Link]</value></property>
</bean>
/
<!-- -->
<bean id="saisirVol" class="[Link]">
<property name="url"><value>/WEB-INF/vues/[Link]</value></property>
</bean>
<!
<!-- redirectionListeVols -->>
<bean id="redirectionListeVols" class="[Link]">
<property name="url"><value>/[Link]</value></property>
<property name="contextRelative"><value>true</value></property>
<property name="http10Compatible"><value>false</value></property>
Reste à écrire les 5 contrôleurs et les 5 vues JSP
et 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 [Link] pour entrer dans l’application


<html>
<body><h3>

Personnes et vols... <br>


Choisissez: <br>
<a href=
href="<c:url
<c:url value=
value="listePersonnes
[Link]
html"/>">Gestion
/> >Gestion des Personnes</a><br>
<a href="<c:url value="[Link]"/>">Gestion des Vols</a><br>
<a href="<c:url value="[Link]"/>">Gestion des Reservations</a><br>

</h3></body>
</html>
 Plugin Eclipse pour Spring
[Link] org/project/wiki/SpringideInstall
[Link]
Bibliography
 Spring 3.x tutorials
 [Link]
htt // i di t/ i / i /i d ht l
 [Link]
 [Link]
h // h id / i l/S i
Tutorial‐Setting‐Up‐Configuring‐The‐Environment

 Download
 [Link]
h // i /d l d/ i
Required
q Jar files
 For a typical web application you need the following
module jars:
 [Link]
 [Link]
 org springframework asm
[Link]
 [Link]
 [Link]
 [Link]
 [Link]
 Since most web applications use logging and basic AOP
features, you need the following required third‐party
offerings:
 commons‐logging‐1.1.1
l i
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
f
fois, et le
l conteneur renvoie une erreur ‘already
‘ l d mapped 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 le bean de type
correspondant; Ne permet pas de specifier le nom du bean
;
 @Autowire
A i – identique
id i a @Inject,
I j mais
i vient
i d
de Spring.
S i
 Validation – La validation peut‐être effectue avec ’JSR‐303
Validator’;; Utilise le tag @Valid
Validator
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:


 [Link]
 L
L’environement
environement Eclipse :
 SpringSource Update Site for Eclipse 3.7 (Release)
 [Link]
Télécharger
L’environement Eclipse
p
Documentations
 Tutoriaux
 [Link]
htt //bl i / / / / b
getting‐started‐with‐spring‐mvc/
 Pas d ’explication
explication sur comment récuperer les jars,
jars les déployer,
déployer

 [Link]
p p g g p g
step‐by‐step/[Link]
 2.5. A adapter pour 3.x

Vous aimerez peut-être aussi