为什么不使用@RequestParam而不是@ModelAttribute

时间:2014-11-19 16:16:45

标签: forms spring-mvc servlets

在Spring MVC控制器的POST请求处理方法(带有@RequestMapping注释)中,您可以通过两种方式从表单中访问表格值(正确吗?)。

使用@ModelAttribute

您可以使用将所有表单值捆绑在一起的模型对象(命令)类,并使用带注释@Valid @ModelAttribute的参数来传递表单值。这似乎是处理表格的常用方式。

 @RequestMapping(value = { "thing/{thing}/part/" }, method = RequestMethod.POST)
 public String processForm(
    @PathVariable("thing") final String thing,
    @ModelAttribute(value = "command") @Valid final Command command,
    final BindingResult bindingResult) {
    if (!bindingResult.hasErrors()) {
       final String name = command.getName();
       final long time = command.getTime().getTime();

       // Process the form

       return "redirect:" + location;
    } else {
       return "form";
    }
 }

使用@RequestParam

您可以使用@RequestParam注释单个方法参数。

 @RequestMapping(value = { "thing/{thing}/part/" }, method = RequestMethod.POST)
 public String processForm(
       @PathVariable("thing") final String thing,
       @RequestParam(value = "name", required=true) final String name,
       @RequestParam(value = "time", required=true) final Date time,
      final HttpServletResponse response) {
    // Process the form

    return "redirect:" + location;
 }

为何使用@ModelAttribute

那么为什么还要使用@ModelAttribute,因为它不方便必须创建一个辅助命令类?使用@RequestParam有什么限制。

1 个答案:

答案 0 :(得分:4)

实际上,更像是至少有四种方式(@ RequestParam,@ ModeAttribute,一个未注释的Pojo参数,直接来自Request对象)

使用单个结构化参数的主要原因是您具有包含多个字段的结构化数据。它比使用几个@RequestParam参数更方便,您可以同时验证所有。使用@ModelAttributes,您可以轻松地从会话,数据库或flashAttributes中检索单个对象。

您可以将现有实体或Pojos与@ModelAttribute一起使用,您不需要创建自定义表单备份对象。

但是,如果你只有一两个参数,那么@RequestParam就可以了。