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
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.
@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">
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.
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