<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://blog.netapsys.fr/index.php/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
  <title>Netapsys Blog</title>
  <link>http://blog.netapsys.fr/index.php/</link>
  <atom:link href="http://blog.netapsys.fr/index.php/feed/author/mounir_gzady/rss2" rel="self" type="application/rss+xml"/>
  <description></description>
  <language>fr</language>
  <pubDate>Wed, 08 Feb 2012 20:39:38 +0100</pubDate>
  <copyright>Netapsys 2008 - 2011</copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>La validation spring mvc</title>
    <link>http://blog.netapsys.fr/index.php/post/2009/11/02/La-validation-spring-mvc4</link>
    <guid isPermaLink="false">urn:md5:4275cd664e42dc133e9c931e67c06e5e</guid>
    <pubDate>Mon, 02 Nov 2009 00:53:00 +0100</pubDate>
    <dc:creator>Mounir Gzady</dc:creator>
        <category>Java J2EE</category>
            
    <description>&lt;p&gt;Ce billet a pour objectif de définir la validation et de décrire sa mise en place au sein d’une application spring-mvc utilisant le paramétrage XML.&lt;/p&gt;    &lt;p&gt;Je définirais la validation comme un procédé permettant de pouvoir s’assurer de la présence d’une donnée dans un formulaire et d'en vérifier le type ou la nature. Par exemple, on doit pouvoir s’assurer que lorsqu’on s’attend à recevoir une donnée numérique, celle-ci est bien de type numérique.&lt;/p&gt;


&lt;p&gt;Comme présenté dans mon précédent billet, on peut définir deux phases dans le cycle de vie d’un controller spring-mvc&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La première phase consiste à afficher le formulaire. Dans cette phase,  toutes les méthodes destinées à préparer les informations qui devront être affichées, seront appelées.&lt;/li&gt;
&lt;li&gt;Dans la seconde phase, le controller procède au traitement des données saisies. C’est dans cette deuxième phase que le procédé de validation intervient. Si un valideur est déclaré, celui-ci est appelé avant toute autre méthode du controller. S’il ne trouve pas d’erreur, il passe la main au controller qui procède au traitement. S'il trouve au moins une erreur, le traitement prend fin et la page du formulaire est réaffichée pour une nouvelle saisie.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;


&lt;h2&gt;Déclaration du valideur&lt;/h2&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;La validation est effectuée par l’intermédiaire d’un «&amp;nbsp;valideur ».  Pour pouvoir effectuer la validation d’un formulaire vous devrez donc déclarer  votre valideur.  Ci-dessous un exemple de déclaration&amp;nbsp;:&lt;/p&gt;

&lt;pre class=&quot;xml&quot;&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;bean&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;id&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;saisieArticleReceptionValidator&amp;quot;&lt;/span&gt; 
	&lt;span style=&quot;color: #000066;&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;com.madura.validator.SaisieArticleReceptionValidator&amp;gt;&lt;/span&gt;
			&lt;span style=&quot;color: #009900;&quot;&gt;&amp;lt;property name=&amp;quot;&lt;/span&gt;articleManager&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot; ref=&amp;quot;&lt;/span&gt;articleManager&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot; /&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: #009900;&quot;&gt;&amp;lt;/bean&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;
Comme vous pouvez le voir ci-dessus, les valideurs spring-mvc se déclarent comme tous les autres beans coté XML. Ils ont un id qui permet de les référencer dans le contexte spring-mvc  et le nom pleinement qualifié de la classe du valideur.
Et comme tous les autres beans, on peut y injecter d’autres beans.
Coté java, le valideur se présente de la manière suivante&amp;nbsp;:&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;public class PersonValidator implements Validator {
       /**
         * This Validator validates just Person instances
      */
            public boolean supports(Class clazz) {
	        return Person.class.equals(clazz);
            }
          public void validate(Object obj, Errors e) {
	        //code
          }
      }&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;
Pour pouvoir écrire un valideur, vous devez déclarer comme ci-dessus une classe implémentant l’interface «&amp;nbsp;validator&amp;nbsp;» fournie par spring-mvc.
Validator possède deux méthodes que vous devrez implémenter.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La méthode «&amp;nbsp;supports&amp;nbsp;» qui permet d’indiquer au valideur quelle classe il va devoir valider.&lt;/li&gt;
&lt;li&gt;La méthode «&amp;nbsp;validate&amp;nbsp;» qui contiendra le code destiné à valider les informations saisies par l’utilisateur.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Utilisation du valideur&lt;/h2&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Une fois votre valideur écrit, il faut l’utiliser. Pour cela vous allez devoir le déclarer au sein de votre classe controller.
Ci-dessous, dans le cas d’un SimpleFormController&amp;nbsp;:&lt;/p&gt;

&lt;pre class=&quot;xml&quot;&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;bean&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;id&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;identificationController&amp;quot;&lt;/span&gt;  &lt;span style=&quot;color: #000066;&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;com.madura.controller.IdentificationController&amp;quot;&lt;/span&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
	&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;property&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;name&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;formView&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;value&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;identification&amp;quot;&lt;/span&gt; &lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
	&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;property&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;name&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;commandName&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;value&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;utilisateur&amp;quot;&lt;/span&gt; &lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
	&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;property&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;name&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;commandClass&amp;quot;&lt;/span&gt;  &lt;span style=&quot;color: #000066;&quot;&gt;value&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;com.madura.view.impl.UtilisateurInfo&amp;quot;&lt;/span&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
	&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;property&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;name&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;userManager&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;ref&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;utilisateurManager&amp;quot;&lt;/span&gt; &lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
	&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;property&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;name&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;validator&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;ref&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;identificationValidator&amp;quot;&lt;/span&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;/bean&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Comme vous pouvez le voir, pour utiliser votre valideur, il vous suffira de l’injecter au sein de la configuration du controller sous la propriété «&amp;nbsp;validator&amp;nbsp;» en indiquant la classe à laquelle  il fait référence.
Note&amp;nbsp;: vous avez la possibilité de déclarer directement votre valideur au sein de votre controller. L’avantage de le déclarer à l’extérieur, selon moi, est d’avoir une meilleure lisibilité et de pouvoir le réutiliser dans un autre controller.&lt;/p&gt;


&lt;h2&gt;ValidationUtils et Errors&lt;/h2&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Pour effectuer la validation, spring-mvc met à votre disposition la classe abstraite ValidationUtils et l’interface Errors. ValidationUtils vous permettra d’utiliser tout un panel de méthodes statics qui vous permettront de vérifier les champs de votre objet formulaire.
Lors de chaque vérification, si la classe ValidationUtils trouve une erreur dans la saisie, ou une information manquante, elle ajoutera une erreur dans Errors.
Une fois la validation terminée, si l’objet contient ne serait ce qu’une seule erreur, la page du formulaire est renvoyée à nouveau pour une nouvelle saisie.
Si aucune des méthodes utilitaire fournies avec ValidationUtils ne convient, vous avez la possibilité d’effectuer par vous-même le contrôle de vos champs en utilisant Errors.
Voici un exemple d’utilisation&amp;nbsp;:&lt;/p&gt;

&lt;pre class=&quot;xml&quot;&gt;ValidationUtils.rejectIfEmptyOrWhitespace(errors,  &amp;quot;matricule&amp;quot;,  
                                                &amp;quot;Veuillez saisir un identifiant utilisateur&amp;quot;);&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Vous trouverez plusieurs surcharges pour chaque type de contrôle. Ici la méthode «&amp;nbsp;rejectIfEmptyOrWhitespace&amp;nbsp;»  contrôle que la donnée du champ «&amp;nbsp;matricule&amp;nbsp;» n’est pas vide et ne contient pas d’espace. Dans le cas ou la donnée n’est pas valide, elle permet de définir un message de retour et ajoute une erreur dans l’objet «&amp;nbsp;errors ».
Ci-dessous, vous trouverez la méthode correspondante de l’objet errors. La différence, dans ce cas, est que vous devrez procéder vous-même à tous les contrôles.&lt;/p&gt;

&lt;pre class=&quot;xml&quot;&gt;errors.rejectValue(&amp;quot;matricule&amp;quot;,  &amp;quot;utilisateur.matricule&amp;quot;, 
                                               &amp;quot; Veuillez saisir un identifiant utilisateur &amp;quot;);&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2&gt;Validation dans le AbstractWizardFormController&lt;/h2&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Maintenant que nous avons vu comment on procéde à la validation dans le SimpleFormController, voyons le cas du AbstractWizardFormController. Comme je l’ai indiqué dans mon billet sur les différents controllers, l’AbstractWizardFormController est un controller qui vous permet de créer des formulaires multi pages. La validation dans ce controller est donc assez spécifique.
En effet, il n’y a pas la possibilité de créer de valideur dans celui-ci. Pour pouvoir procéder à la validation de votre formulaire vous devrez réécrire la méthode validate au sein même du controller.&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;@Override    
protected void validatePage(final Object command, final Errors errors, final int page)  {        
	switch (page) {            
		case 0 : validatePage0(command, errors);                		
break;            
		case 1 : validatePage1(command, errors);                
			break;
		default : break;        
	}        	
	super.validatePage(command, errors, page);
&amp;nbsp;
}&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;
Le paramètre «&amp;nbsp;page&amp;nbsp;» vous permettra de pouvoir effectuer un traitement spécifique pour chacune des pages que vous souhaiterez valider.
&lt;br /&gt;&lt;/p&gt;


&lt;h2&gt;Cas du MultiActionFormController&lt;/h2&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Le MultiActionFormController est un cas encore plus spécifique. Celui-ci n’est pas vraiment fait pour les procédés de validation. En effet, son utilisation est préconisée seulement pour les pages qui ne nécessitent que de l’affichage. Je vous déconseille donc de vous en servir pour le traitement de formulaire.
&lt;br /&gt;&lt;/p&gt;


&lt;h2&gt;Affichage des erreurs dans le formulaire&lt;/h2&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Une fois que les erreurs ont été trouvées, il faut indiquer à l’utilisateur les champs qu’il n’a pas saisis ou mal saisis. Pour cela spring-mvc met à votre disposition le tag &amp;lt;form :errors&amp;gt; qui récupère l’information et affiche les messages d’erreurs.&lt;/p&gt;

&lt;pre class=&quot;xml&quot;&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;tr&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;		
		&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;td&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;colspan&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;3&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;align&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;center&amp;quot;&lt;/span&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;					
                      &lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;font&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;color&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;red&amp;quot;&lt;/span&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;							
                         &lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;b&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;						
                                &lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;form:errors&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;path&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;matricule&amp;quot;&lt;/span&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;				
                         &lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;/b&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
		       &lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;/font&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;		
		&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;/td&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;	
	&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;/tr&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;
Ce tag prend pour simple paramètre le nom du champ du formulaire. Vous avez la possibilité d’afficher tous les messages d’erreur en une seule fois en plaçant le paramètre path à «&amp;nbsp;* ».&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.netapsys.fr/index.php/post/2009/11/02/La-validation-spring-mvc4#comment-form</comments>
      <wfw:comment>http://blog.netapsys.fr/index.php/post/2009/11/02/La-validation-spring-mvc4#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.netapsys.fr/index.php/feed/atom/comments/120</wfw:commentRss>
      </item>
    
  <item>
    <title>Formation interne des collaborateurs Netapsys</title>
    <link>http://blog.netapsys.fr/index.php/post/2009/10/05/Formation-interne-des-collaborateurs-Netapsys</link>
    <guid isPermaLink="false">urn:md5:d3367c1f432d9b694ed72866abe7fa95</guid>
    <pubDate>Mon, 05 Oct 2009 08:47:00 +0200</pubDate>
    <dc:creator>Mounir Gzady</dc:creator>
        <category>Netapsys</category>
            
    <description>    &lt;p&gt;Netapsys a mis en place une politique pour encourager ses salariés à passer des certifications dans
leurs domaines de prédilection.
Dans cette optique, Sébastien Hébert, Directeur de projet et responsable de pôle chez Netapsys, organise des séances de préparation aux certifications java délivrées par Sun. Sébastien est lui-même certifié java. Il anime les séances de travail en nous faisant partager son expérience et en dispensant ses précieux conseils. L'objectif est de nous aider dans notre préparation et de favoriser notre succès aux tests de certification.&lt;/p&gt;


&lt;p&gt;Objectif déjà atteint, puisque les deux premiers collaborateurs ayant participé à ces séances de préparation viennent d'obtenir leurs certifications.&lt;/p&gt;


&lt;p&gt;Le travail en groupe a créé une émulation au sein de l'équipe et nous a permis de progresser plus vite et d'obtenir des résultats supérieurs à ceux que nous aurions pu obtenir seul.&lt;/p&gt;


&lt;p&gt;Grâce à cette politique nous bénéficions d'une formation régulière et nous pouvons obtenir des certifications reconnues dans le monde professionnel.&lt;/p&gt;


&lt;p&gt;Merci beaucoup à Sébastien et bon courage aux futurs certifiés!&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.netapsys.fr/index.php/post/2009/10/05/Formation-interne-des-collaborateurs-Netapsys#comment-form</comments>
      <wfw:comment>http://blog.netapsys.fr/index.php/post/2009/10/05/Formation-interne-des-collaborateurs-Netapsys#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.netapsys.fr/index.php/feed/atom/comments/109</wfw:commentRss>
      </item>
    
  <item>
    <title>Les controllers SPRING MVC</title>
    <link>http://blog.netapsys.fr/index.php/post/2009/06/23/Les-controllers-SPRING-MVC</link>
    <guid isPermaLink="false">urn:md5:0c34896daa6c1dd7abed6b49c79d3a61</guid>
    <pubDate>Tue, 23 Jun 2009 14:09:00 +0200</pubDate>
    <dc:creator>Mounir Gzady</dc:creator>
        <category>Java J2EE</category>
        <category>controller</category><category>spring MVC</category>    
    <description>&lt;p&gt;Cet article a pour but de passer en revue les controllers SPRING MVC les plus courants en fournissant une brève description de ceux-ci, de décrire dans quels cas ils sont utilisés et comment les mettre en place.&lt;/p&gt;    &lt;h2&gt;Le SimpleFormController&lt;/h2&gt;



&lt;p&gt;Le SimpleFormController est le controller standard fourni par Spring MVC. Il implémente comme tous les controllers l'interface Controller et met à disposition de son utilisateur toute une gamme de méthodes pour effectuer le traitement des formulaires basiques.
SimpleFormController permet de gérer&amp;nbsp;:&lt;/p&gt;


&lt;ul&gt;
&lt;li&gt;Les GET pour la préparation et l'envoi du formulaire HTML.&lt;/li&gt;
&lt;li&gt;Les POST pour l'envoi des données saisies au serveur.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;SimpleFormController implémente un certain nombre de méthodes qui s'exécutent dans un certain ordre en fonction de la méthode qu'il appelle.
Dans le cas d'un GET les méthodes exécutées sont dans l'ordre:&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;formBackingObject -&amp;gt; initBinder -&amp;gt; showForm -&amp;gt; referenceData&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;formBackingObject:&lt;/strong&gt; si elle n'est pas redéfinie, elle renvoie un objet de type commandClass défini dans la configuration. Si vous choisissez de la redéfinir vous devez renvoyer un objet qui permettra d'initialiser le formulaire (objet command). Si l'attribut session est placé à true, cet objet est placé en session&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;initBinder:&lt;/strong&gt;cette méthode permet de déclarer les éditeurs de propriétés. Elle permet de convertir les propriétés de l'objet command de type non String en type String&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;showForm:&lt;/strong&gt; c'est cette méthode qui va renvoyer l'objet commandClass au formulaire sous le nom commandName prédéfini dans la configuration&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;referenceData:&lt;/strong&gt; Cette méthode est appelée par showForm, elle permet d'envoyer au formulaire un dictionnaire de classes qui permet d'envoyer au formulaire des objets autres que commandClass, si besoin est.
Une fois que le formulaire a été saisi et que celui-ci a été validé, le controller doit être appelé par la méthode POST. Cette fois ci les méthodes appelées sont dans l'ordre:&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;formBackingObject-&amp;gt; onBind-&amp;gt; validateOnBinding-&amp;gt; onBindAndValidate-&amp;gt; onSubmit&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;formBackingObject:&lt;/strong&gt; la méthode permet de créer l'objet qui va permettre l'enregistrement des données du formulaire au cas où la propriété session est à false. Si celle-ci est placée à true alors l'objet est récupéré dans la session. Les valeurs saisies sont placées dans les propriétés de commandClass du même nom. Si des éditeurs avaient été déclarés précédemment ils auraient été appelés pour effectuer la conversion de type inverse String-&amp;gt;type&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;onBind:&lt;/strong&gt;par défaut cette méthode ne fait rien. Elle peut être redéfinie pour effectuer certaines conversions manuellement.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;validateOnBinding:&lt;/strong&gt; cette méthode renvoie un booléen qui s'il est égal à true permet l'appel d'un objet validator pour la validation des données saisies.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;onBindAndValidate:&lt;/strong&gt;par défaut cette méthode ne fait rien. Elle peut néanmoins servir pour effectuer des validations de saisie sans objet validator.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;onSubmit:&lt;/strong&gt; Il existe plusieurs surcharges de la méthode onSubmit qui appelle elle même la méthode doSubmitAction. Le traitement des formulaires étant spécifique vous serez amenés à choisir une de ces méthodes pour la redéfinir en fonction de vos besoins. Votre choix se portera selon la nature des objets que vous souhaitez utiliser. Vous pourrez ensuite renvoyer selon vos besoins une collection d'objets (Map) associée à une vue ou tout simplement une vue (successView)&lt;/p&gt;



&lt;p&gt;Tout ceci peut paraître un peu compliqué, mais dans la pratique vous n'aurez à redéfinir, sauf cas extrême, que 2 ou 3 de ces méthodes.
Pour pouvoir utiliser un controller, il va falloir le déclarer dans vos fichiers de configuration (sauf si vous choisissez d'utiliser les annotations). Dans ce cas vous devrez le déclarer suivant la forme suivante:&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;bean&lt;/span&gt;  &lt;span style=&quot;color: #000066;&quot;&gt;id&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;creerPickingController&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;com.netapsys.controller.CreerPickingController&amp;quot;&lt;/span&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
           &lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;property&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;name&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;formView&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;value&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;creerPicking&amp;quot;&lt;/span&gt; &lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt; 
           &lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;property&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;name&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;successView&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;value&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;creerPickingSuccess&amp;quot;&lt;/span&gt; &lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt; 
           &lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;property&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;name&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;commandName&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;value&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;creerPickingInfo&amp;quot;&lt;/span&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt; 
           &lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;property&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;name&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;commandClass&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;value&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;com.netapsys.view.impl.CreerPickingInfo&amp;quot;&lt;/span&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt; 
           &lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;property&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;name&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;creerPicking&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;ref&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;creerPickingBean&amp;quot;&lt;/span&gt; &lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
           &lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;property&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;name&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;validator&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;ref&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;creerPickingValidator&amp;quot;&lt;/span&gt; &lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;/bean&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;id:&lt;/strong&gt; nom que vous donnerez à votre controller dans le contexte Spring&lt;br /&gt;
&lt;strong&gt;class:&lt;/strong&gt;nom pleinement qualifié de la class controller&lt;br /&gt;
&lt;strong&gt;formview:&lt;/strong&gt;formulaire pour lequel le controller sera appelé (obligatoire)&lt;br /&gt;
&lt;strong&gt;successView:&lt;/strong&gt; page qui sera affichée si le formulaire est convenablement saisi et validé (optionnel)&lt;br /&gt;
&lt;strong&gt;validator:&lt;/strong&gt; classe de validation qui permettra de valider le formulaire avant que celui-ci soit traité par le controller (optionnel)&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Toutes les autres propriétés correspondent à des classes injectées dans le controller.&lt;/p&gt;


&lt;h2&gt;&lt;strong&gt;Le MultiActionController&lt;/strong&gt;&lt;/h2&gt;


&lt;p&gt;Le MultiActionController est un controller spring mvc qui permet le traitement de plusieurs requêtes par un seul et unique controller. Il permet de mutualiser les pages qui nécessitent un traitement qui pourrait être plus ou moins similaire et de réduire la multiplication des controllers Spring.
MultiActionController est une classe abstraite et doit par conséquent être dérivée. Deux requêtes différentes pourront alors être traitées par une méthode ayant la signature suivante:&lt;/p&gt;

&lt;pre class=&quot;xml&quot;&gt;ModelAndView actionName(HttpServletRequest request, HttpServletResponse response);&lt;/pre&gt;


&lt;p&gt;actionName est le nom de la méthode. Chaque requête peut être traitée par une méthode différente.
Alors, comment  le MultiActionController peut-il savoir la méthode correspondant à une requête donnée? Le MultiActionController utilise pour cela un resolver qui permettra de mapper une requête sur le traitement correspondant.
Voici un exemple de mapping:&lt;/p&gt;


&lt;p&gt;La déclaration du controller se fait de la manière suivante:
&lt;br /&gt;&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;bean&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;id&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;dispatcherController&amp;quot;&lt;/span&gt;	&lt;span style=&quot;color: #000066;&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;com.netapsys.controller.DispatcherController&amp;quot;&lt;/span&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
		&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;property&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;name&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;methodNameResolver&amp;quot;&lt;/span&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
			&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;ref&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;local&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;dispatcher&amp;quot;&lt;/span&gt; &lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
		&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;/property&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;%%%
		&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;property&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;name&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;articleManager&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;ref&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;articleManager&amp;quot;&lt;/span&gt; &lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;/bean&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Comme tous les controllers Spring mvc, la déclaration du bean comporte un attribut id qui correspond au nom du bean dans le contexte Spring
et un attribut class qui correspond au nom pleinement qualifié du controller. Vous trouvez également la présence des beans injectés dans le controller. La spécificité de ce controller réside dans la propriété &quot;méthodeNameResolver&quot; qui référence un resolver de nom qui a pour fonction de lier les noms des requêtes aux méthodes correspondantes. Dans le cas présent le resolver a pour nom &quot;dispatcher&quot; (voir ci-dessous).&lt;/p&gt;

&lt;pre class=&quot;xml&quot;&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;bean&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;id&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;dispatcher&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver&amp;quot;&lt;/span&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;%%%
&amp;nbsp;
                &lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;property&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;name&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;defaultMethodName&amp;quot;&lt;/span&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
			&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;value&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;ajouter&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;/value&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
		&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;/property&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&amp;nbsp;
		&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;property&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;name&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;methodParamNames&amp;quot;&lt;/span&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
			&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;list&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&amp;nbsp;
				&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;value&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;ajouter&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;/value&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
				&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;value&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;deplacer&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;/value&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
				&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;value&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;supprimer&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;/value&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
			&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;/list&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
		&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;/property&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;/bean&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Le code ci-dessus est la déclaration du resolver de noms de spring-mvc.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;id:&lt;/strong&gt;nom du resolver dans le contexte spring. Bien entendu, celui-ci doit être le même que celui qui a été déclaré précédemment dans votre controller&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;class:&lt;/strong&gt;nom pleinement qualifié de la classe spring-mvc qui servira de resolver de nom&lt;/p&gt;


&lt;p&gt;Les propriétés:&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;defaultMethodName:&lt;/strong&gt; méthodes qui vont être exécutées si aucun nom de méthode ne correspond au nom de la requête émise. Vous pouvez en déclarer plusieurs mais généralement seule la première est exécutée.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;methodParamNames:&lt;/strong&gt;liste des noms des méthodes déclarées dans le MultiActionController. L'ordre n'a pas grande importance, seul le nom prime.&lt;/p&gt;



&lt;p&gt;Remarque: il existe d'autres resolvers, celui décrit ci-dessus étant le plus simple à mettre en place. Vous pourrez donc en choisir un autre si besoin.&lt;/p&gt;


&lt;p&gt;Voici un aperçu de la classe qui correspond au mapping précédent:&lt;/p&gt;


&lt;pre class=&quot;xml&quot;&gt;public class DispatcherController extends MultiActionController
{
&amp;nbsp;
    public ModelAndView ajouter(final HttpServletRequest request,
            final HttpServletResponse response)
	{	 ...	
	}
&amp;nbsp;
   public ModelAndView deplacer(final HttpServletRequest request,
            final HttpServletResponse response)
	{	 ...	
	}
&amp;nbsp;
    public ModelAndView supprimer(final HttpServletRequest request,
            final HttpServletResponse response)
    {  … 
	}
	…
}&lt;/pre&gt;


&lt;p&gt;Donc pour le controller DispatcherController, la méthode &quot;deplacer&quot; ne sera exécutée que si et seulement si l'une des jsp mappées à ce controller contient un bouton de type submit qui est activé. Idem pour la méthode &quot;supprimer&quot;. Seule la méthode &quot;ajouter&quot; pourra être exécutée dans 2 cas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Si une requête correspond à son nom&lt;/li&gt;
&lt;li&gt;Si une requête ne correspond au nom d'aucune méthode étant donné que c'est la méthode exécutée par défaut (defaultMethodName)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Remarque:&lt;/strong&gt; il est conseillé d'utiliser le MultiActionController uniquement pour les pages qui ne font qu'afficher des informations. Les procédés de validation dans celui-ci étant fastidieux et complexe, il est déconseillé de s'en servir pour les formulaires nécessitant une validation.&lt;/p&gt;





&lt;h2&gt;AbstractWizardFormController&lt;/h2&gt;


&lt;p&gt;Ce controller permet de construire des formulaires formés de plusieurs pages. Tout comme le MultiActionController, l'AbstractWizardFormController est une classe abstraite et doit donc être dérivée.
AbstractWizardFormController dérive de AbstractFormController, c'était déjà le cas du SimpleFormController. On trouvera donc des similarités.
Voici un exemple de mapping:&lt;/p&gt;

&lt;pre class=&quot;xml&quot;&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;bean&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;id&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;editionPaletteController&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;com.netapsys.controller.AuteurController&amp;quot;&lt;/span&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;		
&amp;nbsp;
		&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;property&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;name&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;commandName&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;value&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;auteurInfo&amp;quot;&lt;/span&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
		&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;property&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;name&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;commandClass&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;value&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;com.netapsys.view.impl.AuteurInfo&amp;quot;&lt;/span&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;			
&amp;nbsp;
		&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;property&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;name&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;pages&amp;quot;&lt;/span&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
			&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;list&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
				&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;value&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;saisirNom&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;/value&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
				&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;value&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;saisirPrenom&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;/value&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
			&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;/list&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
		&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;/property&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
		&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;property&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;name&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;allowDirtyBack&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;value&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
		&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;property&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;name&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;allowDirtyForward&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;value&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&amp;nbsp;
		&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;property&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;name&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;auteur&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;ref&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;auteur&amp;quot;&lt;/span&gt; &lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;/bean&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Comme pour chaque controller on trouve les attributs id et class qui correspondent toujours au nom de la classe dans le contexte Spring et au nom pleinement qualifié de celle-ci. Les propriétés commandName, commandClass sont les mêmes que pour le SimpleFormController.&lt;/p&gt;


&lt;p&gt;Les autres propriétés sont:&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;pages:&lt;/strong&gt; listes des pages qui vont contenir le formulaire multipages sans l'extension. L'ordre est extrêmement important étant donné qu'il déterminera l'ordre d'affichage.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;allowDirtyBack et allowDirtyForward:&lt;/strong&gt; lors du passage d'une page à une autre, l'AbstractWizardFormController procède toujours à une validation, quel que soit le sens de navigation dans les pages. La propriété allowDirtyBack contrôle la validation arrière et allowDirtyForward contrôle la validation de la navigation avant. Ces 2 propriétés sont à true par défaut. Placé à false la validation lors de la navigation est désactivée. Dans ce cas, la validation n'est effectuée que lors de la validation définitive du formulaire à la dernière page de celui-ci.&lt;/p&gt;


&lt;p&gt;Bien entendu vous trouverez également la liste de toutes les classes injectées dans le controller.&lt;/p&gt;


&lt;p&gt;Voici un aperçu du code de la classe mappée ci-dessus&lt;/p&gt;

&lt;pre class=&quot;xml&quot;&gt;public class AssistantController extends AbstractWizardFormController {
&amp;nbsp;
      //Methode qui permet la validation définitive du formulaire associé
      protected ModelAndView processFinish(HttpServletRequest request, HttpServletResponse response, Object command, BindException   
      errors) throws Exception {
&amp;nbsp;
        ..............
     }
&amp;nbsp;
     //Methode permettant l'annulation de toutes les saisies
     protected ModelAndView processCancel(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors)
     throws Exception {
&amp;nbsp;
        ............
&amp;nbsp;
    }
&amp;nbsp;
    //Méthode permettant la validation page à page du formulaire
    protected void validatePage(Object formulaire, Errors errors, int page) {
&amp;nbsp;
       ......
&amp;nbsp;
   }
&amp;nbsp;
&amp;nbsp;
&amp;nbsp;
}&lt;/pre&gt;


&lt;p&gt;Une fois le mapping achevé, il reste néanmoins un dernier détail. Il faut indiquer dans les jsp les traitements souhaités.
Pour cela il faut définir certains champs dans les formulaires de chaque page&amp;nbsp;:&lt;/p&gt;


&lt;pre class=&quot;xml&quot;&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;input&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;type&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;hidden&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;name&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;_page&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;value&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;x&amp;quot;&lt;/span&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Le champ _page permet d'indiquer à chaque jsp quel est son ordre dans le formulaire. Pour cela il faut définir x en sachant que la première page a toujours le numéro 0.&lt;/p&gt;


&lt;pre class=&quot;xml&quot;&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;input&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;type&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;submit&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;value&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Suivant&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;name&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;_targetx&amp;quot;&lt;/span&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Dans chaque page (sauf la dernière du formulaire) il faut nommer le bouton submit &quot;_targetx&quot;, x étant le numéro de la page à atteindre.
Cela vous permettra de naviguer dans le formulaire dans n'importe quel sens. Il suffit pour cela de définir x avec un nombre plus petit que le numéro de la page courante pour naviguer vers l'arrière et de définir x avec un nombre plus grand pour naviguer vers l'avant.&lt;/p&gt;


&lt;p&gt;Remarque: vous n'êtes pas obligés de passer directement à la page suivante, vous pouvez sauter des pages si besoin et passer par exemple de la page 1 à la page 3 sans passer par la 2.&lt;/p&gt;


&lt;pre class=&quot;xml&quot;&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;input&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;type&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;submit&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;value&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Annuler&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;name&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;_cancel&amp;quot;&lt;/span&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Vous pouvez placer si vous le souhaitez dans chaque page un bouton _cancel qui fera appel à la méthode processCancel du controller et qui par défaut annule la saisie du formulaire.&lt;/p&gt;


&lt;pre class=&quot;xml&quot;&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;input&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;type&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;submit&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;value&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Valider&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;name&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;_finish&amp;quot;&lt;/span&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Arrivé à la dernière page du formulaire, on envoie les données au serveur via le bouton &quot;_finish&quot;. Celui-ci fait appel à la méthode processFinish du controller qui procède au traitement des données après validation par la méthode validatePage.&lt;/p&gt;


&lt;p&gt;Remarque: la page affichée à la fin de la validation finale (équivalent du successView) ne doit pas être dans la liste des pages référencées par le controller. Celle-ci peut être définie soit par une propriété injectée soit directement dans la classe.&lt;/p&gt;



&lt;p&gt;Cette brève description devrait vous aider à savoir quel controller utiliser. J'espère vous avoir donné une idée des possibilités qui vous sont offertes par ces controllers. Néanmoins vous pourrez également si le besoin s'en ressent être amenés à utiliser d'autres controllers qui ne sont pas présentés ici.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.netapsys.fr/index.php/post/2009/06/23/Les-controllers-SPRING-MVC#comment-form</comments>
      <wfw:comment>http://blog.netapsys.fr/index.php/post/2009/06/23/Les-controllers-SPRING-MVC#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.netapsys.fr/index.php/feed/atom/comments/98</wfw:commentRss>
      </item>
    
</channel>
</rss>
