2010-11-05 3 views
3

J'essaie de comprendre le concept de de liaison de données dans Spring-MVC avec Velocity (j'apprends ce framework et le portage d'une application sur cette plateforme).Comprendre le concept de liaison de données dans une application Spring-MVC

Je suis habitué à obtenir des variables de formulaire en utilisant request.getParameter("username"), dans le monde de printemps, il semble que je peux effectuer la validation et par exemple contre "objets de formulaire" par exemple. un objet de style datamodel qui représente tous les champs d'un formulaire.

Le concept d'un validateur est logique, mais le marshaling des données d'une chaîne de requête à ces objets est flou pour moi encore. C'est le concept de "Data Binding" correct?

Si je ne me trompe pas à ce point quelques questions spécifiques:

  • Lorsqu'un « liaison » est faite entre une variable de formulaire (par exemple "username" par exemple) et le champ d'un objet (par exemple org.a.b.MyNewUserFormObj.username) est-ce que "lier" une définition permanente telle que tous les posts http suivants de cette forme provoquent l'affectation de la variable de formulaire username à org.a.b.MyNewUserFormObj.username?
  • Comment puis-je accomplir la définition de liaison ci-dessus? (Si ce que j'ai dit jusqu'à maintenant est correct, je me sens comme Costello dans 'Who's on First', je ne sais même pas ce que je viens de dire!), j'ai juste besoin d'une image conceptuelle.

Merci d'avoir mis un cerveau droit égaré.

Répondre

5

Il n'y a pas de magie dans la liaison de données. En fait, Spring remplit simplement les propriétés de l'objet @ModelAttribute avec les valeurs des paramètres de requête avec les noms correspondants (dans le cas le plus simple, le paramètre de requête a le même nom qu'une propriété, mais nested properties sont également pris en charge).

Donc, si vous avez

<input type = "text" name = "firstName" /> 

et

public class Person { 
    private String firstName; 
    ... getters, setters ... 
} 

vous obtenez une valeur du champ de formulaire. Spring fournit également une méthode pratique pour créer des formulaires HTML. Ainsi, au lieu de créer des champs de formulaire manuellement, vous pouvez écrire en JSP:

<form:form modelAttribute = "person" ...> 
    <form:input path = "firstName" /> 
</form:form> 

ou Velocity (notez que dans ce cas <form> est créé manuellement et le chemin de la propriété est préfixé avec le modèle nom d'attribut):

<form ...> 
    #springFormInput("person.firstName" "") 
</form> 

Les champs des formulaires générés de cette manière seront pré-remplis avec les valeurs des propriétés correspondantes de l'attribut du modèle (c'est pourquoi le nom de l'attribut du modèle est nécessaire).

+0

Je suis encore un peu confus quant à savoir qui mappe les données querystring/post à un objet Person. Comment spring sait-il que l'objet Person est l'objet qui doit être créé à partir d'un formulaire particulier, et comment fait-il correspondre les noms des données de formulaire aux setters de l'objet Person? –

+0

@David: Spring ne sait rien sur la cartographie d'un formulaire particulier.Lorsque la requête arrive au contrôleur, Spring regarde la signature de la méthode du contrôleur et mappe les paramètres de la requête aux arguments de la méthode. Donc, pour l'argument '@ ModelAttribute', il crée un objet du type spécifié et lie les paramètres de la requête à ses propriétés. Les règles de mappage des noms sont indiquées dans http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/validation.html#beans-beans-conventions – axtavt

+1

Lorsque vous dites qu'il "lie la requête en se référant, par exemple, à un objet MyPerson dans les paramètres de méthode du contrôleur, voulez-vous dire que pour chaque variable de formulaire soumise, elle tentera d'appeler un setter de l'objet MyPerson. Par exemple, s'il existe un paramètre de formulaire appelé "firstname" et "lastname", Spring créera automagiquement un nouveau MyPerson(), puis appellera myPerson.setFirstname (value_from_form) et myPerson.setLastname (value_from_form). Est-ce que c'est ce qui se passe dans les coulisses? –

Questions connexes