gpt4 book ai didi

spring-mvc - Spring Web MVC、@ModelAttribute 和 @RequestParam 一起使用

转载 作者:行者123 更新时间:2023-12-03 11:38:02 31 4
gpt4 key购买 nike

我有一个带有 GET 方法的 Controller ,如下所示:

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

bean 是正确的(getter 和 setter),服务调用返回带有 thingId 的正确 ThingBean,并且我在 thing/edit.jsp 的 JSP 页面出现了。

JSP 是:
<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>

然而,JSP 显示主题和消息的空白值。是的,这些属性上有 getter/setter。

我有一个非常相似的 Controller ,它工作得很好,除了那里的 GET 映射方法的签名中没有 @RequestParam。

我在 Spring WebMVC 文档中没有看到任何地方说我不能这样做 - 为什么它不起作用?为什么更新后的 ModelAttribute 对象没有绑定(bind)到 JSP 表单中?

编辑:

这个 Controller 和 GET 调用的相同模式在很多不同的地方都工作过——用 @ModelAttribute 注释的变量由方法填充,然后可用于 JSP 页面显示。为什么通过添加 @RequestParam 注释,它会停止?
@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";
}

最佳答案

问题是您只是为事物分配了一个新的引用,这在 Java 中永远不会工作。您必须将其放入模型中,否则您的 View 将不知道它。

@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> // This is only assigning a new reference not updating
logger.debug("The thing to edit is {}", thingBean);
return "thing/edit";
}

所以改为这样做
@RequestMapping( value = "/Thing.html", method = RequestMethod.GET )
public String editThing(@RequestParam( "thingId" ) String thingId, @ModelAttribute ThingBean thing, BindingResult result, Model model) {
thing = <some service call using thingId>
model.addAttribute("thing", thing);
logger.debug("The thing to edit is {}", thingBean);
return "thing/edit";
}

这让我想知道为什么你甚至在这个方法中有一个模型属性?基本上是没用的。

而不是上面我会做这样的事情
@ModelAttribute("thing")
public Thing prepareModel(@RequestParam("thingId") String thingId) {
return thingSergice.findById(thingId);
}

现在这个方法将在每个请求处理方法之前被调用。您可以在其中简单地引用它,而不必每次都查找它。 (从您的代码来看,您的方法中的 Thingbean 模型属性非常没用,我会将其重写为以下内容)
@RequestMapping( value = "/Thing.html", method = RequestMethod.GET )
public String editThing() {
return "thing/edit";
}

关于spring-mvc - Spring Web MVC、@ModelAttribute 和 @RequestParam 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18646130/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com