我正在尝试使用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"})
答案 0 :(得分:2)
使用@ModelAttribute注释的第一种方法是两个:
您的第二种方法仅使用ModelMap,因此它只获取模型属性(来自请求,或者在您的情况下,会话,取决于@SessionAttributes注释)。这种方法不使用提交表单中的数据。