Web Spring MVC, @ModelAttribute et @RequestParam ensemble
J'ai un contrôleur avec une méthode GET écrit comme suit:
@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";
}
}
Le haricot est correct (getters et setters), le service d'appel renvoie le bon ThingBean avec le thingId, et ma page JSP à la chose/modifier.jsp affiche.
La JSP est:
<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>
Encore, les JSP affiche les valeurs vides pour l'objet et le message. Oui, il y a des getters/setters sur ces propriétés.
J'ai une très similaires Contrôleur qui fonctionne très bien, sauf qu'il n'y est pas de @RequestParam dans la signature de la méthode mappée.
Je n'ai pas vu de n'importe où dans le Printemps WebMVC docs qui dit que je ne peut pas le faire - pourquoi n'est-il pas de travail? Pourquoi n'est-elle pas la mise à jour ModelAttribute objet lié dans la JSP forme?
EDIT:
Ce contrôleur, et il en est de même pour les REÇOIS des appels a travaillé de nombreux de nombreux endroits différents, -- la variable annotée avec @ModelAttribute est rempli par la méthode alors disponible pour la page JSP d'affichage. Pourquoi, en ajoutant un @RequestParam annotation, faut-il s'arrêter?
@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";
}
Édité question d'ajouter de contre-exemple.
Comme je l'ai mentionné dans ma réponse dans le contrôleur que vous avez posté, vous êtes affectation une variable (l'argument de méthode) vous n'êtes PAS devoir changer l'objet que vous passer dans la méthode. Dans le contrôleur de vous dire que c'est fonctionne vous ajouter quelque chose à un objet qui fonctionne comme un objet de modèle. Fondamentalement, c'est tout à fait différent.
OriginalL'auteur Jim Jarrett | 2013-09-05
Vous devez vous connecter pour publier un commentaire.
Le problème est que vous ne sont que l'attribution d'une nouvelle référence à la chose, qui ne va jamais à travailler en Java. Vous devez le mettre dans le modèle à l'autre, il ne sera pas connu à votre vue.
Donc au lieu de faire ce
Qui me fait me demander pourquoi vous avez même un attribut du modèle dans cette méthode? Il est pratiquement inutile.
Au lieu de ce qui précède, je voudrais faire quelque chose comme ceci
Maintenant cette méthode sera invoquée avant toute demande de la méthode de gestion. Dans lequel vous pouvez tout simplement se référer à elle au lieu d'avoir à chercher à chaque fois. (Et à en juger par votre code votre Thingbean attribut de modèle dans votre méthode est assez inutile je réécriture à la suivante)
Comme je l'ai mentionné dans mon autre commentaire, ils ne sont pas la même chose... Dans celle qui n'est pas le travail que vous êtes affectation, alors que l'autre est mise à jour le modèle objet.
ARGH. Stupide programmeur syndrome. J'ai été d'en faire trop côté-programmation en C ces derniers temps. Merci, bien sûr, je le vois maintenant.
OriginalL'auteur M. Deinum
Vous avez oublié de spécifier l'
ModelAttribute
nom, à la suite de la correction:Si ci-dessus ne fonctionne pas, utilisez ceci:
Si possible, je vous recommande d'utiliser mieux convention de nommage pour les composants, par exemple-
thingModel
au lieu dething
. Cela favorise une meilleure lisibilité pour vous et les autres.Par ailleurs, vous ne devez pas spécifier de nom dans Java 8.
OriginalL'auteur aces.