@ModelAttribute和org.springframework.ui.ModelMap.get()之间的区别?

时间:2011-06-10 06:37:52

标签: spring spring-mvc annotations

我正在尝试使用Object作为<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>元素的命令对象。

在控制器的GET方法中,我像这样添加Object:

@RequestMapping(method = RequestMethod.GET)
public String renderForm(ModelMap model, HttpServletRequest request) {
    [...]
    model.addAttribute("voting", voting);
    [...]
}

如下所示,渲染的表单会正确显示命令对象:

<form:form action="vote" method="PUT" commandName="voting" name="oform">

现在,当尝试在控制器中访问表单的命令对象时,在POST方法上,我有两种方法。首先,我在签名中声明@ModelAttribute:

@RequestMapping(method = RequestMethod.PUT)
public String newVoting(@ModelAttribute("voting") Voting voting, HttpServletRequest request) { [...]}

或者我访问ModelMap并从底层地图中获取值:

@RequestMapping(method = RequestMethod.PUT)
public String newVoting(ModelMap model, HttpServletRequest request) {
    Voting voting = (Voting) model.get("voting");
    [...]
}

第一次做的时候,我得到了表单提交的对象。做后者,我得到了对象,因为它是在表单处理之前。

为什么表单的提交不会改变ModelMap中的对象,为什么@ModelAttribute与实际模型中的whats不同?我觉得名称'ModelAttribute'应该产生相同的对象,比如直接从模型中获取对象。

也许@ModelAttribute有点误导?

修改 的 忘了提到对象是@SessionAttributes

 @SessionAttributes({"voting", "state"})

1 个答案:

答案 0 :(得分:2)

使用@ModelAttribute注释的第一种方法是两个

  1. 使用提交的表单数据创建投票对象;
  2. 将投票对象公开,方法是将其添加到模型中(请求,或者,在您的情况下,因为@SessionAttributes({“voting”})会话。)
  3. 您的第二种方法仅使用ModelMap,因此它只获取模型属性(来自请求,或者在您的情况下,会话,取决于@SessionAttributes注释)。这种方法使用提交表单中的数据。