Vous êtes sur la page 1sur 16

Lobjectif est de montrer avec dtail comment prendre en main le framework SpringMVC v3.

Cet article sadresse aux nuls avec comme seul pr-requis de connatre (un peu) le
framework Spring.
SpringMVC, dans sa dernire version, offre dnormes simplifications si on sait lexploiter.
Il apporte une rponse lgante pour bon nombre de problmatiques relles.
Le projet web dmo est bas sur maven3 et java 5+ et toujours avec full annotations .
Il commence par crer le projet Maven partir dune template.
Le pom.xml est configur pour utiliser tomcat ou jetty embarqus.
Dans la premire partie, une classe Controller de traitement et une page jsp sont crites
afin dafficher le fameux Hello World.
Dans la seconde partie, la fonctionnalit standard de cration dune entit mtier est
rajoute.
Pour cela, on crit un Controller qui affiche le formulaire de saisie et un autre qui gre les
donnes saisies et soumises.
Passons la mise en pratique.
PREMIRE PARTIE: Juste un hello world
Voici les tapes de la premire partie de la dmo.
ETAPE 1. Crer le projet maven
Dans le workspace de votre eclipse, lancer la console dos puis taper la commande:
mvn archetype:generate -Dfilter=maven-archetype-webapp
La commande permet de crer interactivement le projet web maven et il suffit de rpondre
aux questions poses.
Un nouveau rpertoire est cr dans le workspace.
Placer vous dans ce rpertoire et lancer la commande:
mvn eclipse:eclipse

Enfin, importer le projet dans eclipse.


ETAPE 2. Configurer les dpendances maven.
Tlcharger le fichier pom.xml ici. Recopier le contenu (uniquement les blocs properties,
dpendencies & build) dans le pom de votre projet.
ETAPE 3. Configurer le projet web.
Comme notre dmo est une application web, configurons son fichier web.xml :
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>2</load-on-startup>
<init-param>
<param-name>contextConfigLocation</param-name>

<param-value>/WEB-INF/applicationContext.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
Les points importants dans le web.xml sont:
a- Le header du web.xml mentionne la version de la servlet utilise 2.5 ( /web-app_2_5.xsd
).
b- La seule servlet DispactherServlet enregistre est nomme dispatcher . Cest le point
dentre des requtes (cf. point d ci-dessous).
c- La servlet SpringMVC dispatcher fait office de controller frontal (de faade).
d- Le mapping indique que toute URL avec extension .html sera intercepte par la servlet
dispatcher .
e- Le paramtre init-param fait pointer ContextConfigLocation sur le fichier de spring
(nomm applicationContext.xml).
Ce paramtre devient optionnel si on respecte le principe convention over configuration
en nommant le fichier de spring dispacher-context.xml .
Explications:
Le contenu du fichier web.xml signifie que:
Toutes les requtes dextension.html sont interceptes par le controller frontal SpringMVC
(servlet dispatcher).
Le controller frontal comme son nom lindique ne fait aucun traitement.

Il ne fait que dlguer (dispatcher) dautres controller de traitements mtier (voir


paragraphe suivant).
A larrive dune requte http, le controller frontal dtermine selon une stratgie (par
dfaut ou dfinir) quelle mthode appele et quelle vue renvoye.
Exemple:
Supposons quune requte /HOST:PORT/CONTEXT_WEB_PROJ/hello.html est reue.
Puisque lextension .html est prsente, le dispatcher analyse lURL pour identifier le
controller de traitement.
Lannotation @Controller permet au dispatcher didentifier la classe controller de
traitement de la requte.
ETAPE 4. Le controller de traitement
Notre premier controller est simple presque minimaliste pour faciliter la prise en main de
Spring MVC3.
package fr.netapsys.mvc3;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class PersonController {

@RequestMapping("/hello")
public String salut(Model model){
model.addAttribute("hello","Hello world spring mvc3");
return "WEB-INF/jsp/hello.jsp";

}
}
Dcouvrons les concepts cls qui sont:
a) La classe est annote avec @Controller, cest elle le controller de traitement.
Lannotation @Controller est une spcialisation de @Component qui sera auto-dtecte et
injecte par le conteneur Spring.
Voir ci-aprs le fichier de config de Spring.
La mthode salut annote avec @RequestMapping( /hello ) montre que cest cette
mthode qui traite lURI /hello.html .
Cette mthode ajoute un attribut ayant le scope request et nomm hello dans lobjet
Model (Map).
Puis elle retourne la chane WEB-INF/views/hello.jsp qui indique explicitement la page
jsp qui se charge de prsenter la vue (rponse).
Cest une page JSP code en dur . Ceci est trs mauvais puisque il couple le code java avec la
vue!
Dans la seconde partie, on amliore ce point en configurant dans spring la stratgie de
prsentation (vue).
ETAPE 5. Configurer Spring
Le fichier de spring nomm applicationContext.xml comme mentionn dans le web.xml
localis dans /WEB-INF/ contient peu de lignes:
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="

http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context.xsd

http://www.springframework.org/schema/mvc

http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

<context:component-scan base-package="fr.netapsys.mvc3" />


</beans>
Ce fichier contient une seule ligne pour linstant.
Ceci ordonne au conteneur spring de scanner le package (et ses sous packages) pour charger
les classes annotes.
ETAPE 6. Page JSP de la prsentation
La page jsp se nomme hello.jsp localise dans WEB-INF/jsp.
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>HELLO Page</title>
</head>
<body>
<c:out value="${hello}"/>
</body>
</html>
Deux points importants mritent dtre dtaills:
a) La prsence dans lentte du jsp de la directive :
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

Noter la prsence de jsp dans le namespace /jsp/jstl/core.


La version 1.2 de jstl doit tre inclus dans le pom du projet. Le web.xml doit pointer sur la
servlet 2.5+.
b) La taglib jstl permet dafficher lattribut hello (lattribut hello de ltape 4).
ETAPE 7. Tester lapplication web
Lancer sur la console dos la commande :
mvn tomcat:run
ou
mvn jetty:run
Saisir dans le browser lurl http://localhost:8080/NOM_CONTEXT/hello.html aprs avoir
remplac le NOM_CONTEXT par le nom de votre projet (context web).
Le message Hello world spring mvc3 doit safficher.
Rsum de la premire partie:
Cette premire partie a permis dexpliquer comment configurer le controller frontal ou de
faade nomm dispacher de SpringMVC.
A luri /hello.html envoye par le navigateur, le dispatcher identifie via lannotation
@Controller la classe qui va grer la requte puis via lannotation @RequestMapping la
mthode excuter.
Cest cette mthode qui indique via une chane renvoye la vue retourner lutilisateur.
Cest pourquoi un premier controller de traitement a t crit. Et la vue est matrialise
par une page jsp nomm hello.jsp.
Noter que le retour de la mthode salut est, cod en dur, /WEB-INF/jsp/hello.jsp
dtermine la vue retourner.
Ce dernier point est un dfaut de conception (et de scurit). La seconde partie le corrige.
SECONDE PARTIE: Gestion dun formulaire de cration
Dabord on doit comprendre la cinmatique de cration dune nouvelle entit. Dans notre
cas, il sagit de crer une nouvelle personne:
Lutilisateur clique sur un lien de cration ou saisit une URL pour voir un formulaire vide
safficher lui permettant de saisir les donnes attendues.

Le clic sur ce lien correspond une requte http de type GET.


Pour cela un premier controller est crit pour traiter cette requte GET et une page jsp est
associe.
Lorsque lutilisateur complte le formulaire et confirme via le bouton submit, un second
controller doit se charger de traiter le formulaire soumis et diriger vers une page jsp la
rponse lutilisateur.
En ralit, cest un seul controller et cest toujours la classe PersonController avec les deux
mthodes de gestion:
- de laffichage du formulaire,
- de traitement de la soumission des donnes (mthode de type POST).
Voici le tableau de correspondances entre les URI saisies, les mthodes excutes et les
pages jsp prsentes.

Mais avant cela, on va corriger le dfaut de conception de la premire partie en configurant


dans Spring la stratgie de choisir la vue.
ETAPE 1: Complter le fichier de config de spring
Ajouter dans le fichier applicationContext.xml de la premire partie ce bout de code xml:
<bean id="viewResolver"
class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>

Explications:
On laisse Spring utiliser la stratgie UrlBasedViewResolver pour dterminer laide de la
chane renvoye par la mthode grant la requte quelle vue retourne.
La stratgie UrlBasedViewResolver se base sur la chane retourne en la prfixant et
suffixant des lments indiqus dans la configuration.
Par exemple, si la mthode retourne la chane view alors la vue sera /WEBINF/jsp/view.jsp .
ETAPE 2: Adapter la classe PersonController
Maintenant quune stratgie de la vue est dclare, on doit rectifier la mthode salut de la
classe PersonController comme suit:
@RequestMapping("/hello")
public String salut(Model model){
model.addAttribute("hello","Hello world spring mvc3");
return "hello";
}
Elle retourne dsormais une chane hello au lieu /WEB-INF/jsp/hello.jsp de la
premire partie.
Ainsi pour tout le reste, les mthodes retourneront une chane.
ETAPE 3: Classe POJO (DTO)
La classe POJO PersonForm va tre utilise dans cette partie. Voici son code simple sans les
getters/setters.
public class PersonForm implements Serializable{
private static final long serialVersionUID = 1L;
private String name;
private String dateBirth;

@Override
public String toString() {
return "PersonForm [name=" + name +
", dateBirth=" + dateBirth + "]";
}
}
Les proprits sont toutes volontairement des String.
ETAPE 4: Affichage du formulaire de saisie
Ceci correspond donc luri /person.
ETAPE 4.1: Page jsp daffichage
Pour cela, la page jsp view.jsp est ncessaire. Voici son code :
<%@page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Formulaire de saisie</title>
</head>

<body>
<br/>
<div><br/>
<form:errors cssClass="errors"/>
<form:form modelAttribute="person" action="create.html">
<label for="name">Nom:</label>
<form:input path="name" maxlength="30" size="30"/><br/><br/>
<label for="name">Date naissance:</label>
<form:input path="dateBirth" />
<input type="submit" id="ok" value="OK" />
</form:form>
</div></body>
</html>
Explications:
Dans cette page jsp, nous recourons aux taglibs de Spring. Do les inclusions de lentte.
Laction lors de la soumission du formulaire est create.html comme lindique le tag
<form:form.
La prorpit path du tag <form:input permet de faire le lien entre une proprit du POJO
PersonForm du model et le champ de saisie.
ETAPE 4.2: Controller daffichage
Ajoutons au controller PersonController de la premire partie la mthode display suivante:

@RequestMapping("/person")
public String display(@ModelAttribute("person") PersonForm pf){
return "view";
}
Lannotation @RequestMapping de la mthode assure que cest elle qui traite lURI /person.
Vous constatez que la mthode display retourne une chane view.
La mthode display prend en argument un objet de type PersonForm annote avec
@ModelAttribute.
Ceci indique SpringMVC que lobjet PersonForm est un lment du model et quun objet
vide doit exister dans le scope request.
Vous constatez aussi que, dans la page view.jsp, le tag <form:form utilise une proprit
modelAttribute fixe person.
SpringMVC assure via ce tag la correspodance entre lattribut du Model et les lments du
formulaire de la page jsp.
ETAPE 5: Test de lapplication
Relancer la commande :
mvn tomcat:run
Puis saisir lurl localhost:8080/NOM_CONTEXT/person.html; vous verrez alors le formulaire
suivant safficher:

Si jusque l tout va bien, il nous reste crire le bout de code java pour traiter le clic sur le
bouton OK.
Cest lobjet de ltape suivante.

ETAPE 6: Traitement des donnes saisies


La classe controller va tre complte avec la mthode valide comme suit:
@RequestMapping(value="/create", method=RequestMethod.POST)
public String valider(@ModelAttribute("person") PersonForm pf,
BindingResult result, Model mp){
/* convert personForm and persist it with JPA */
//mp.addAttribute("person",pf);
return "success";
}
Bien videmment, aucun traitement nest effectu. Dans la ralit, cest ici que le controller
appelle le service qui doit raliser la persistance de lobjet PersonForm dans la base par
exemple.
Mais avant de le persister, une conversion vers un objet annot correctement doit tre faite.
Ce sujet sera abord dans un prochain article sur ce blog.
ETAPE 7: Test de lapplication
Relancer la commande :
mvn tomcat:run
Puis saisir lurl localhost:8080/NOM_CONTEXT/person.html, complter la saisie du
formulaire puis cliquer sur le bouton OK.
En cas de succs, lcran appropri saffiche. Par exemple, si je saisis le nom: Agent 007 et sa
date de naissance:12/12/1960, lcran affiche:

Enfin, la page /WEB-INF/jsp/success.jsp contient ces quelques lignes:


<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Success Page</title>
</head><body><br/>
Utilisateur enregistr avec succes
<br/><br/>Nom:
<c:out value="${person.name}"/>
<br/>N(e) le:
<c:out value="${person.dateBirth}"/>
</body>
</html>
Ici on a utilis la taglib jstl pour afficher la personne cre.
Rsum de la seconde partie:
Nous avons introduit une stratgie de dfinition de la vue pour ne pas coupler le code java
avec les aspects de prsentation.
Ceci nous a conduit adapter notre controller de la premire partie.

Ce controller a t complt pour traiter lURI GET /person.html et lURI POST /create.html.
La premire URI permet dafficher le formulaire de saisie vide.
La seconde URI permet denregistrer les donnes saisies dans la base (par exemple).
Nous navons pas abord la persistance des donnes mais nous y reviendrons bientt dans
ce blog.
Jespre que ce billet vous a facilit la prise en main de SpringMVC.
Nous introduisons dans la suite de cet article, Spring-JS (Javascript de Spring) & ses DOJO
afin de mieux prsenter la vue.
Aussi, nous nous intressons la validation de la saisie.
Tous ces aspects vont illustrer les simplifications apportes par SpringMVC