@RequestParam只填充独立变量(当然可能是
@ModelAttribute类中的字段)。完成控制器后,这些变量将被丢弃,除非将它们输入到模型中。
不要将“模型”一词与会话混淆。http对话通常是:
HTTP.GET,服务器响应,然后HTTP.POST。当
@ModelAttribute使用注释时,你总是在构造一个已注释内容的实例,这就是让你认为“向模型提供内容”可能会使变量存在的原因。这是不正确的,一旦
HttpServletRequest完成,这些变量就不应再成为浏览器/服务器对话的一部分,除非它们已保存在会话中。
@ModelAttribute填充类的字段,然后填充类的属性以传递回视图
是! 正确地说,是让
@ModelAttributeSpring使用其默认的Web数据绑定器来填充来自的数据的实例
HttpServletRequest。选择将此数据传递回视图取决于程序员。当你使用注释方法时
@ModelAttribute,每次代码访问该servlet时都会调用该方法。当你拥有
@ModelAttribute方法的参数之一时,我们正在谈论传入的Http表单数据绑定。
Calling
@RequestParam是说话的捷径
request.getParameter("foo"); 在幕后,Java HttpServletRequest允许你通过执行key-> value查找来从请求对象获取值。返回的值是对象类型。如果你不使用Web应用程序中的Spring,这将是你要键入的内容。
当你开始使用Spring时,Spring将使这一抽象更进一步
@ModelAttribute。该注释采用了数据绑定的概念。数据绑定的目标是
request.getParameter("foo1"),对于每个表单元素,控制器中的代码都不必调用。假设你有一个包含5个字段的Web表单。如果没有数据绑定,程序员必须手动检索并验证每个字段。程序员必须确保请求包含该属性,该属性的值存在,并且该属性的值是每个字段期望的类型。使用可以@ModelAttribute告诉Spring为你完成这项工作。
如果你使用注释控制器中的方法,则
@ModelAttribute("fooBar") FooBar fooBar 的实例FooBar将始终由Spring构造并提供给你的方法。数据绑定起作用的地方是在方法的参数中使用此注释时;Spring查看的实例,看看HttpServletRequest它是否可以将请求中的数据与的实例上的right属性进行匹配
FooBar。这是基于Java属性约定的,在该约定中,你有一个诸如
foo和的字段,它们分别是和公共获取器和设置器,称为
getFoo和
setFoo。这看起来似乎很神奇,但是如果你违反约定,那么Spring数据绑定将停止工作,因为它无法从你的位置知道将数据绑定到何处
HttpServletRequest。
FooBar,但不会将属性设置为请求中的任何值。



