@ModelAttribute注释参数的数据绑定

时间:2009-05-26 07:34:10

标签: java spring spring-mvc annotations

我有一个Spring 2.5带注释的控制器,其中我有一个用@RequestMapping(method = RequestMethod.GET)注释的方法,它执行一些逻辑来填充模型。

我还有一个使用@RequestMapping(method = RequestMethod.POST)注释的方法来执行请求。这个方法有一个@ModelAttribute注释参数,它包含我自己的表单pojo,我们称之为MyForm。我还有一个MyForm的初始化方法,也用@ModelAttrribute注释。到目前为止,所有工作都按预期工作:在POST请求中,表单数据绑定到MyForm,我可以处理它。

问题是我希望能够通过传入(GET)请求参数来预填充表单。由于我有MyForm的@ModelAttribute方法,我在我的模型中得到一个MyForm实例,但除非我特意将它用作我的GET方法的参数,否则它不会被填充。

为什么我必须这样做,是否可以以不同的方式强制我的表单上的数据绑定GET请求?我现在只传入参数,但由于它已经在模型中,我不需要对它做任何事情,导致一个丑陋的未使用的方法参数。

[编辑:一些代码示例来说明]

未在get请求中填充表单的控制器:

@Controller
public class MyController {

  @ModelAttribute("myForm")
  public MyForm createForm() {
    return new MyForm();
  }

  @RequestMapping(method=RequestMethod.GET)
  public void handlePage(Model model) {
    //Do some stuff to populate the model....
  }

  @RequestMapping(method=RequestMethod.POST)
  public void processForm(@ModelAttribute("myForm") MyForm myForm) {
    //Process the form
  }
}

当我更改handlePage方法的方法签名时,它会在get请求中填充...

@RequestMapping(method=RequestMethod.GET)
public void handlePage(Model model, @ModelAttribute("myForm") MyForm myForm) {
  //Do some stuff to populate the model....
}

1 个答案:

答案 0 :(得分:3)

允许@ModelAttribute的方法具有@RequestMapping支持的任何参数,例如,您可以根据需要添加多少@RequestParam个参数来填充命令对象,或者甚至http请求本身。我不确定您是否可以以相同的方式获取数据绑定器的实例。

再次阅读文档我认为这个想法是@ModelAttribute方法中的预填充将是数据库驱动的,这可能是为什么没有添加@ModelAttribute没有任何数据绑定发生的原因作为@RequestMapping方法的参数。