Ich habe einen Controller mit einer Methode GET wie so geschrieben:Spring Web MVC, @ModelAttribute und @RequestParam zusammen
@Controller
public class ThingController {
@RequestMapping(value = "/Thing.html", method = RequestMethod.GET)
public String editThing(@RequestParam("thingId") String thingId, @ModelAttribute ThingBean thing, BindingResult result) {
thing = <some service call using thingId>
logger.debug("The thing to edit is {}", thingBean);
return "thing/edit";
}
}
Die Bohne ist richtig (Getter und Setter), der Service Aufruf gibt die richtige ThingBean mit Die ThingId, und meine JSP-Seite bei thing/edit.jsp zeigt sich.
Die JSP ist:
<html>
<body>
<h1 id="title" class="title">Edit Thing</h1>
<form:form id="thing" modelAttribute="thing">
<form:input path="subject" id="subject" tabindex="1" />
<form:textarea path="message" />
</form:form>
</body>
</html>
Dennoch zeigt die JSP leere Werte für den Betreff und die Nachricht. Ja, es gibt Getter/Setter für diese Eigenschaften.
Ich habe einen sehr ähnlichen Controller, der gut funktioniert, nur gibt es kein @RequestParam in der Signatur der GET - mapped Methode dort.
Ich habe nirgendwo in der Frühjahr WebMVC Dokumentation gesehen, die besagt, dass ich das nicht tun kann - warum funktioniert es nicht? Warum wird das aktualisierte ModelAttribute-Objekt nicht in das JSP-Formular eingebunden?
EDIT:
Dieser Controller, und das gleiche Muster für GET Anrufe hat viele vielen verschiedenen Orten gearbeitet - die Variable mit @ModelAttribute kommentierte wird durch das Verfahren dann für die JSP-Seite angezeigt werden ausgefüllt. Warum hört es auf, indem eine @RequestParam-Annotation hinzugefügt wird?
@RequestMapping(value = "/Things.html", method = RequestMethod.GET)
public String getThings(@ModelAttribute ThingForm thingForm, BindingResult result) {
try {
// need to get list of Things
List<Thing> Things = <service call that gets list of Things>;
thingForm.setThings(Things);
logger.debug("Things are {}", Things);
}
catch (ResourceNotFoundException e) {
return "error";
}
logger.debug("Thing list loading - end");
// Go to jsp
return "thing/list";
}
Können Sie uns Ihre anderen controller.and zeigen Was M.Deinum gesagt hat, richtig ist. – beinghuman
Bearbeitete Frage zum Hinzufügen eines Gegenbeispiels. –
Wie ich in meiner Antwort in dem Controller, den Sie gepostet haben, erwähnt habe, dass Sie ** eine Variable neu zuweisen (das Methodenargument), verändern Sie NICHT das Objekt, das Sie an die Methode übergeben. In der Steuerung sagst du, dass es funktioniert, dass du ** etwas zu einem Objekt hinzufügst, das als Modellobjekt fungiert. Grundsätzlich ist das ganz anders. –