2010-12-07 28 views
1

Je charge un objet utilisateur appelant un service, puis stocke cet utilisateur en tant qu'objet de commande dans le modèle sur GET dans le contrôleur. Cet objet utilisateur a de nombreuses propriétés qui ne sont pas mappées dans la page jsp. Après avoir envoyé le formulaire, j'obtiens l'objet de commande dans le contrôleur sur POST. Mais bizarrement, je ne vois que les propriétés de l'objet de commande qui sont mappées à la page jsp. Toutes les autres propriétés qui étaient là quand je charge l'objet sont perdues. J'ai besoin de toutes les propriétés dans l'objet pour pouvoir l'enregistrer avec succès dans la base de données.Objet de commande Spring MVC Annotation Based Controller perdant des valeurs sur POST

Quelqu'un peut-il m'aider à comprendre ce problème? Merci!

Mise à jour

J'ajoute du code pour mieux le comprendre. Dans le gestionnaire POST, je m'attendais à ce que l'objet de commande possède toutes les propriétés chargées dans le gestionnaire GET en plus des propriétés liées à jsp. Au lieu de cela, je perds toutes les propriétés sauf celles qui sont liées au jsp. Est-ce que je fais quelque chose de mal ici?

@RequestMapping(method = RequestMethod.GET) 
    public String showForm(ModelMap model, HttpSession session, HttpServletRequest request) throws Exception { 
     UserBean user = Util.getUser(session); 
     UserBean command = (UserBean)userProfileService.loadByUserName(user.getUserName()); 
     model.addAttribute("command", command); 
     return formView; 
    } 

@RequestMapping(method = RequestMethod.POST) 
    public String onSubmit(@ModelAttribute("command") UserBean command, BindingResult result, HttpSession session) throws Exception { 
    UserBean user = (UserBean) command; 
     userProfileService.saveUser(user); 
     return "successView"; 
} 

Mise à jour

J'ajoute du code pour mieux le comprendre. Dans le gestionnaire POST, je m'attendais à ce que l'objet de commande possède toutes les propriétés chargées dans le gestionnaire GET en plus des propriétés liées à jsp. Au lieu de cela, je perds toutes les propriétés sauf celles qui sont liées au jsp. Est-ce que je fais quelque chose de mal ici?

@RequestMapping(method = RequestMethod.GET) public String showForm(ModelMap model, HttpSession session, HttpServletRequest request) throws Exception { UserBean user = Util.getUser(session); UserBean command = (UserBean)userProfileService.loadByUserName(user.getUserName()); model.addAttribute("command", command); return formView; } 

@RequestMapping(method = RequestMethod.POST) public String onSubmit(@ModelAttribute("command") UserBean command, BindingResult result, HttpSession session) throws Exception { UserBean user = (UserBean) command; userProfileService.saveUser(user); return "successView"; } 

Mise à jour

Si je stocke l'objet de commande en session comment le jsp lier les propeties. Je pensais que j'avais besoin de le stocker dans le modèle pour cela? Pourriez-vous expliquer s'il vous plaît.

Mise à jour

stocker l'objet de commande en session permet de résoudre le problème. J'ai été en mesure de le stocker en utilisant

@SessionAttributes ("command") 

Merci beaucoup!

+0

Lors de l'ajout d'informations ne pas ajouter une réponse. Vous devriez plutôt mettre à jour votre question. Je l'ai fait cette fois pour vous (vous devriez maintenant supprimer la 'réponse'). – Bozho

Répondre

1

C'est le comportement attendu. Le printemps ne prend pas votre objet existant (comment l'obtiendrait-il?) - il en crée un nouveau et le remplit de données.

Vous pouvez utiliser la méthode annotée @ModelAttribute pour spécifier une méthode qui chargera l'objet existant à partir du stockage (db?) Par son ID (soumis).

Les méthodes @ModelAttribute annotées sont exécutées avant la méthode du gestionnaire annoté @RequestMapping choisi. Ils pré-remplissent efficacement le modèle implicite avec des attributs spécifiques, souvent chargés à partir d'une base de données. Un tel attribut peut alors être déjà accédé par l'intermédiaire de paramètres de méthode de gestionnaire annoté @ModelAttribute dans la méthode de gestionnaire choisie, éventuellement avec une liaison et une validation qui lui sont appliquées.

Voir 15.3.2.8 of the MVC docs

+0

Pour les fainéants: http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-ann-modelattrib –

0

Les valeurs Spring MVC Model se demande dans votre champ d'application des attributs JSP.Ceci est une traduction à sens unique, Spring-MVC ne restaure pas les valeurs Model lorsque l'utilisateur POSTE un formulaire de votre page.

Lorsque j'ai besoin de stocker des informations entre un GET et un POST (c'est-à-dire, définir quelque chose sur un GET et le relire sur un POST), j'ai défini un attribut de session.

Dans votre cas, je crois que vous devez faire une des opérations suivantes:

  1. Appel Util.getUser(session); dans la méthode onSubmit.
  2. Stocker l'objet command lors de la session dans le showForm et le récupérer dans la méthode onSubmit>
0

@ModelAttribute est utilisé pour définir direclty les valeurs dans l'objet de l'étudiant du jsp, d'autres sages dans le servlet devez obtenir les propriétés en utilisant request.getattribute() et que d'appeler la méthode setter d'étudiant. donc vous pouvez utiliser les deux mots-clés dans la page jsp.

<form action="grade" method="get" name="contact1" modelAttribute="contact1"> 
       </form> 

ou