mam kontrolera z metody GET napisane tak:wiosny Web MVC, @ModelAttribute i @RequestParam razem
@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";
}
}
Fasola jest prawidłowe (pobierające i ustawiające), wywołanie usługa zwraca poprawną ThingBean z pojawi się thingId i moja strona JSP w thing/edit.jsp.
JSP jest:
<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>
Jednak JSP wyświetla puste wartości przedmiotu oraz wiadomości. Tak, istnieją właściwości pobierające/ustawiające na tych właściwościach.
Mam bardzo podobny kontroler, który działa dobrze, z wyjątkiem tego, że nie ma @RequestParam w sygnaturze metody odwzorowanej GET.
Nie widziałem nigdzie w wiosennych dokumentach WebMVC, które mówią, że nie mogę tego zrobić - dlaczego to nie działa? Dlaczego zaktualizowany obiekt ModelAttribute nie jest powiązany z formularzem JSP?
EDIT:
Sterownik ten i ten sam wzór dla połączeń GET współpracował wiele wiele różnych miejsc - zmienną opatrzone @ModelAttribute wypełnia się następnie metodą dostępną dla strony JSP do wyświetlenia. Dlaczego, dodając adnotację @RequestParam, zatrzymuje się?
@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";
}
można pokazać nam swoją drugą controller.and Co M.Deinum powiedział, jest prawidłowe. – beinghuman
Edytowane pytanie w celu dodania kontrprzykładu. –
Jak wspomniałem w mojej odpowiedzi w kontrolerze, który napisałeś, jesteś ** ponownie przypisujesz ** zmienną (argument metody) NIE prześladujesz obiektu, który przekazałeś do metody. W kontrolerze powiesz, że to działa ** dodajesz ** coś do obiektu, który działa jako obiekt modelu. Zasadniczo jest zupełnie inaczej. –