Java 使用ModelAttribute作为RequestMapping方法的方法参数可以吗?
我一直在使用以下代码:Java 使用ModelAttribute作为RequestMapping方法的方法参数可以吗?,java,jsp,spring-mvc,Java,Jsp,Spring Mvc,我一直在使用以下代码: @RequestMapping(value="/myUrl", method=RequestMethod.GET) public ModelAndView myRequestHandler( HttpServletRequest request, HttpServletResponse response, @ModelAttribute(value="paramName") @ValidMyModelForm form) // automatically
@RequestMapping(value="/myUrl", method=RequestMethod.GET)
public ModelAndView myRequestHandler(
HttpServletRequest request, HttpServletResponse response,
@ModelAttribute(value="paramName") @ValidMyModelForm form)
// automatically populates form setters from form:form in JSP view
{
}
阅读下面链接中的答案,我开始怀疑我在这里使用ModelAttribute是否正确
我用对了吗?这似乎有效,但我想确保我没有做错任何事
表单对象通过单独的方法添加到模型中,使用如下代码:
modelAndView.addObject("formName", new MyModelForm());
在JSP视图中,我添加了一个表单名称,作为
commandName=“formName”
此签名也应该对您非常有效:
public ModelAndView myRequestHandler(@Valid MyModelForm form)
在这里,SpringMVC将确保根据表单提交的内容创建并绑定一个MyModelForm
实例
现在,附加的@modeldattribute
为您带来了什么:
首先是简单的情况:
public ModelAndView myRequestHandler(@ModelAttribute("paramName") @Valid MyModelForm form)
假设您没有使用@modeldattribute
的任何其他方法,上述操作将按名称paramName
查找一个模型,由于该假设,该模型不太可能出现,然后将像以前一样创建并绑定MyModelForm的实例,除此之外,您现在有了一个名为paramName
的模型对象,可以在视图中使用:
paramName.myformValue
等
因此,本质上:
public ModelAndView myRequestHandler(@ModelAttribute("paramName") @Valid MyModelForm form)
相当于:
public ModelAndView myRequestHandler(@Valid MyModelForm form, Model model) {
...
model.addAttribute("paramName", form)
}
其次,如果您有一个用@modeldattribute注释的方法,该方法预加载MyModelForm的一部分:
@ModelAttribute("paramName");
public MyModelForm loadModel(int id) {
MyModelForm fromDB = loadFromDB(id);
}
现在,您的方法签名的优点是:
public ModelAndView myRequestHandler(@ModelAttribute("paramName") @Valid MyModelForm form)
您从数据库中预先填充的模型将通过表单中提交的内容得到增强。确保您是否做错了的唯一方法是尝试。哦,到目前为止,它对我来说一直很好。。。但是我想检查我是否滥用了这样一个事实,即当一个自动连接的bean与我的model属性具有相同的名称时,会创建一个新bean并调用setter。虽然它是有效的,但我想知道它是否只是碰巧起作用,如果是的话,是否有一种更“标准的方式”来使用表单:spring中的表单?链接问题中的解释促使我重新思考这种编码方式。我明白了。。。既然你说优势。。。这是否意味着它是连接JSP和模型中spring
标记的首选/唯一方法。由于模型将通过我在表单中提交的内容得到增强,我希望它只是表单的副本,而不是数据库自动修改的数据副本。我想对装饰JPA实体的模型表单做一些检查。。。我认为,如果我在某个时间点调用merge,仅将实体作为参数,那么更改应该发送到数据库。这种推理还取决于这样一个事实:每次使用ajax获取表单时,我都会在模型表单的构造函数中创建一个新的ModelForm,并使用new ModelEntity()。用户填充除主键字段之外的所有字段并提交表单。我根据表单中的一些其他参数设置主键字段。我想只要我不叫合并就可以了。