春季MVC:请解释@RequestParam和@ModelAttribute之间的区别
我是Spring MVC的新手。请帮我解压缩文档。
文档
春季MVC文档状态(强调我的):
@ModelAttribute
on 方法参数指示应从模型中检索该参数。如果模型中不存在,则应首先实例化参数,然后将其添加到模型中。一旦出现在模型中,就应该从具有匹配名称的所有请求参数中填充参数的字段。类将请求参数名称(包括查询字符串参数和表单字段)与按名称对属性字段进行建模进行匹配。@RequestParam
将请求参数绑定到控制器中的方法参数。
免责声明/澄清器
我知道和不是一回事,不是相互排斥的,不执行相同的角色,并且可以同时使用,就像在这个问题中一样 - 确实,可以用来填充字段。我的问题更倾向于他们内部运作之间的差异。@ModelAttribute
@RequestParam
@RequestParam
@ModelAttribute
问题:
(用于方法参数,而不是方法)和之间有什么区别?具体说来:@ModelAttribute
@RequestParam
-
源:是否具有相同的信息/人口来源,即URL中的请求参数,这些参数可能已作为被编辑的表单/模型的元素提供?
@RequestParam
@ModelAttribute
POST
-
用法:用 的变量被丢弃(除非传递到模型中),而用 的变量自动馈送到模型中返回,这是否正确?
@RequestParam
@ModelAttribute
或者在非常基本的编码示例中,这两个示例之间的真正工作区别是什么?
示例 1: :@RequestParam
// foo and bar are thrown away, and are just used (e.g.) to control flow?
@RequestMapping(method = RequestMethod.POST)
public String testFooBar(@RequestParam("foo") String foo,
@RequestParam("bar") String bar, ModelMap model) {
try {
doStuff(foo, bar);
}
// other code
}
示例 2: :@ModelAttribute
// FOOBAR CLASS
// Fields could of course be explicitly populated from parameters by @RequestParam
public class FooBar{
private String foo;
private String bar;
// plus set() and get() methods
}
// CONTROLLER
// Foo and Bar become part of the model to be returned for the next view?
@RequestMapping(method = RequestMethod.POST)
public String setupForm(@ModelAttribute("fooBar") FooBar foobar) {
String foo = fooBar.getFoo();
String bar = fooBar.getBar();
try {
doStuff(foo, bar);
}
// other code
}
我目前的理解:
@ModelAttribute
并且两者都询问请求参数以获取信息,但它们以不同的方式使用此信息:@RequestParam
@RequestParam
只是填充独立变量(当然可能是类中的字段)。控制器完成后,这些变量将被丢弃,除非它们已被馈送到模型中。@ModelAttribute
@ModelAttribute
填充类的字段,然后类填充要传递回视图的模型的属性
这是正确的吗?