2010-12-07 2 views
1

Ich lade ein Benutzerobjekt mein Aufruf eines Dienstes und dann diesen Benutzer als ein Befehlsobjekt im Modell auf GET in der Steuerung speichern. Dieses Benutzerobjekt verfügt über viele Eigenschaften, die nicht auf der JSP-Seite zugeordnet sind. Nachdem ich das Formular abgeschickt habe, bekomme ich das Befehlsobjekt i den Controller auf POST. Aber seltsamerweise sehe ich nur die Eigenschaften im Befehlsobjekt, die der jsp-Seite zugeordnet sind. Alle anderen Eigenschaften, die beim Laden des Objekts vorhanden waren, gehen verloren. Ich brauche alle Eigenschaften in Objekt, um es in der Datenbank erfolgreich speichern zu können.Spring MVC Annotation Based Controller Befehlsobjekt Verlust von Werten auf POST

Kann mir jemand helfen, dieses Problem zu verstehen? Vielen Dank!

aktualisieren

ich einige Code bin Hinzufügen besser zu verstehen. Im POST-Handler erwartete ich, dass das Befehlsobjekt alle Eigenschaften hat, die zusätzlich zu den Eigenschaften, die mit jsp verbunden sind, in den GET-Handler geladen wurden. Stattdessen verliere ich alle Eigenschaften außer denen, die an die JSP gebunden sind. Mache ich hier etwas falsch?

@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"; 
} 

aktualisieren

ich einige Code bin Hinzufügen besser zu verstehen. Im POST-Handler erwartete ich, dass das Befehlsobjekt alle Eigenschaften hat, die zusätzlich zu den Eigenschaften, die mit jsp verbunden sind, in den GET-Handler geladen wurden. Stattdessen verliere ich alle Eigenschaften außer denen, die an die JSP gebunden sind. Mache ich hier etwas falsch?

@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"; } 

aktualisieren

Wenn ich den Befehl Objekt in der Sitzung speichern, wie würde das die propeties jsp zu binden. Ich dachte, ich müsste es im Modell dafür speichern? Könnten Sie bitte erklären.

aktualisieren

den Befehl Objekt in der Sitzung zu speichern, löst das Problem. Ich konnte es mit

@SessionAttributes ("command") 

speichern Vielen Dank!

+0

Wenn Informationen Hinzufügen keine Antwort hinzuzufügen. Sie sollten Ihre Frage lieber aktualisieren. Ich habe es diesmal für dich gemacht (du solltest jetzt die 'Antwort' löschen). – Bozho

Antwort

1

Das ist das erwartete Verhalten. Spring nimmt Ihr vorhandenes Objekt nicht (wie würde es es bekommen?) - es erstellt ein neues und füllt es mit Daten.

Sie können die annotated-Methode @ModelAttribute verwenden, um eine Methode anzugeben, die das vorhandene Objekt aus dem Speicher (db?) Anhand seiner ID (submitted) lädt.

@ModelAttribute Annotationsmethoden werden vor der ausgewählten Annotated-Handlermethode @RequestMapping ausgeführt. Sie füllen das implizite Modell effektiv mit spezifischen Attributen aus, die oft aus einer Datenbank geladen werden. Auf ein solches Attribut kann dann bereits über die Parametermethode des @ModelAttribute-Annotated-Handlers in der ausgewählten Handler-Methode zugegriffen werden, möglicherweise mit einer darauf angewendeten Bindung und Validierung.

Siehe 15.3.2.8 of the MVC docs

+0

Für die faulen: http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-ann-modelattrib –

0

Die Frühlings-MVC Model Werte anfordern Rahmen werden in Ihrer JSP-Attribute.Dies ist eine einseitige Übersetzung. Spring-MVC stellt die Werte Model nicht wieder her, wenn der Benutzer ein Formular von Ihrer Seite aus POSTTIERT.

Wenn ich Informationen zwischen einem GET und einem POST speichern muss (dh, setze etwas auf ein GET und lese es auf einem POST zurück), setze ich ein Session-Attribut.

In Ihrem Fall, ich glaube, dass Sie eine der folgenden Optionen müssen tun:

  1. Anruf Util.getUser(session); im onSubmit Methode.
  2. Shop das command Objekt in der Sitzung in den showForm und Abrufen es in dem onSubmit Methode>
0

@ModelAttribute wird verwendet von der jsp die Werten im Student Objekt direclty gesetzt, andere wiesen im Servlet Sie muss die Eigenschaften mit request.getattribute() abrufen und dann die Methode "student setter" aufrufen. so können Sie beide Schlüsselwörter in der JSP-Seite verwenden.

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

oder

Verwandte Themen