Java Spring MVC:请解释@RequestParam和@ModelAttribute之间的区别

Java Spring MVC:请解释@RequestParam和@ModelAttribute之间的区别,java,spring,spring-mvc,spring-annotations,Java,Spring,Spring Mvc,Spring Annotations,我是Spring MVC的新手。请帮我打开文件包 文档 各国(强调地雷): 方法参数上的@modeldattribute指示应从模型中检索参数。如果模型中不存在参数,则应首先实例化该参数,然后将其添加到模型中。一旦出现在模型中,参数的字段应该从具有匹配名称的所有请求参数中填充。WebDataBinder类与请求参数名称匹配 — 包括查询字符串参数和表单字段 — 按名称为属性字段建模 @RequestParam将请求参数绑定到控制器中的方法参数 免责声明/澄清声明 我知道@modeldattr

我是Spring MVC的新手。请帮我打开文件包

文档

各国(强调地雷):


  • 方法参数上的
    @modeldattribute
    指示应从模型中检索参数。如果模型中不存在参数,则应首先实例化该参数,然后将其添加到模型中。一旦出现在模型中,参数的字段应该从具有匹配名称的所有请求参数中填充。WebDataBinder类与请求参数名称匹配 — 包括查询字符串参数和表单字段 — 按名称为属性字段建模

  • @RequestParam
    将请求参数绑定到控制器中的方法参数

免责声明/澄清声明

我知道
@modeldattribute
@RequestParam
不是一回事,不是相互排斥的,不执行相同的角色,并且可以同时使用,就像在中一样-事实上,
@RequestParam
可以用来填充
@modeldattribute
的字段。我的问题更倾向于他们内部运作的差异

问题:

@modeldattribute
(用于方法参数而不是方法)和
@RequestParam
之间有什么区别?具体而言:

  • 来源:是否
    @RequestParam
    @modeldattribute
    具有相同的数据源 信息/填充,即URL中的请求参数,可能已作为
    POST
    ed的表单/模型的元素提供
  • 用法:使用
    @RequestParam
    检索的变量会被丢弃(除非传递到模型中),而使用
    @modeldattribute
    检索的变量会自动馈送到要返回的模型中,这是否正确
或者在非常基本的编码示例中,这两个示例之间真正的工作区别是什么

示例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:
@modeldattribute

// 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
}

我目前的理解:


@modeldattribute
@RequestParam
都会询问请求参数以获取信息,但它们使用这些信息的方式不同:

  • @RequestParam
    只是填充独立变量(当然可能是
    @modeldattribute
    类中的字段)。当控制器完成时,这些变量将被丢弃,除非它们已被输入到模型中


  • @modeldattribute
    填充类的字段,然后填充要传递回视图的模型属性

这是正确的吗

@RequestParam
只是填充独立变量(当然可能是
@modeldattribute
类中的字段)。当控制器完成时,这些变量将被丢弃,除非它们已被输入到模型中

不要将“模型”一词与会话混淆。http对话通常是:
http.GET
,服务器响应,然后是
http.POST
。当您使用
@modeldattribute
注释时,您总是在为您注释的内容构造一个实例,这就是为什么您认为“将内容提供给模型”可能会使变量保持不变。这是不正确的,一旦
HttpServletRequest
完成,这些变量就不再是浏览器/服务器对话的一部分,除非它们已保存在会话中


@modeldattribute
填充类的字段,然后填充要传递回视图的模型属性

对!!正确地说,
@modeldattribute
告诉Spring使用其默认的web数据绑定器,用
HttpServletRequest
中的数据填充某个实例。选择将此数据传递回视图取决于程序员。当您有一个用
@modeldattribute
注释的方法时,每次代码命中该servlet时都会调用该方法。当您将
@modeldattribute
作为方法的参数之一时,我们将讨论传入的Http表单数据绑定

调用
@RequestParam
是表示
request.getParameter(“foo”)
的快捷方式;在后台,Java的
HttpServletRequest
允许您通过键->值查找从请求对象获取值。返回的值的类型为Object。如果您在web应用程序中不使用Spring,那么您会经常键入这些内容

然后,当您开始使用
@modeldattribute
时,Spring将此抽象进一步推进。此注释采用了数据绑定的概念。数据绑定的目标是,控制器中的代码不必为每个表单元素调用
request.getParameter(“foo1”)
。假设您有一个包含5个字段的web表单。如果没有数据绑定,程序员必须手动检索并验证每个字段。程序员必须确保请求包含该属性,该属性的值存在,并且该属性的值是每个字段所期望的类型。使用
@modeldattribute
告诉Spring为您完成这项工作

如果您在控制器中使用
@modeldattribute(“fooBar”)fooBar fooBar
注释方法,
fooBar
的实例将始终由Spring构造,并提供给您的方法。数据绑定发挥作用的地方是在方法的参数中使用此注释时;Spring查看
HttpServletRequest
的实例,并查看它是否可以将请求中的数据与
FooBar
实例上的正确属性相匹配。这是基于java pro的
@ModelAttribute
public void addAttributes(Model model) {
    model.addAttribute("msg", "Welcome to the Netherlands!");
}
**@RequestMapping**(value = "/addUser", method = RequestMethod.POST)
public String submit(@ModelAttribute("user") User user) {
    return "userView";
}