【发布时间】:2011-04-09 14:22:12
【问题描述】:
让我通过提供一些有问题的代码来介绍我的问题。
首先是我的表单对象:
public class OrgChartForm {
List<OrgChartFormElement> orgChartFormElements;
public OrgChartForm() {
orgChartFormElements = new ArrayList<OrgChartFormElement>();
}
private OrgChartFormElement createOrgChartFormElementFromMprsStructureYear(MprsStructureYear structureYear){
OrgChartFormElement element = new OrgChartFormElement();
element.set.... // populate element based on attribute values from structureYear param
return element;
}
public void createOrgChartFormElements(List<MprsStructureYear> structureYears) {
orgChartFormElements = new ArrayList<OrgChartFormElement>();
for(MprsStructureYear structureYear:structureYears){
orgChartFormElements.add(createOrgChartFormElementFromMprsStructureYear(structureYear));
}
}
// expected getters and setters
}
表单包含OrgChartFormElements 的简单列表
public class OrgChartFormElement {
private boolean selected;
private String elementLabel;
private Long id;
//default constructor, getters and setters
}
我正在使用context:component-scan 和mvc:annotation-driven,所以我的控制器看起来像:
@Controller
public class OrganisationStatusController{
@Autowired(required=true)
// dependencies here
@RequestMapping(value="/finyear/{finyearId}/organisationstatus", method=RequestMethod.GET)
public String createRootOrg(@PathVariable(value="finyearId") Long finyearId, Model model) throws Exception {
List<MprsStructureYear> orgStructuure = getOrganisationService().getOrganisationStructureForFinyear(finyearId);
OrgChartForm orgChartForm = new OrgChartForm();
orgChartForm.createOrgChartFormElements(orgStructuure);
model.addAttribute("orgChartForm", orgChartForm);
return "finyear/organisationchart/view";
}
@RequestMapping(value="/finyear/{finyearId}/organisationstatus", method=RequestMethod.POST)
public String createRootOrg(@PathVariable(value="finyearId") Long finyearId,@ModelAttribute("orgChartForm") OrgChartForm orgChartForm, BindingResult result, Model model) throws Exception {
System.out.println("Found model attribute: " + model.containsAttribute("orgChartForm"));
List<OrgChartFormElement> elements = orgChartForm.getOrgChartFormElements();
System.out.println(elements);
return "redirect:/spring/finyear/" + finyearId + "/organisationstatus";
}
// expected getters and setters
}
问题在于 POST 处理程序。我意识到它现在做的并不多,但是一旦我让它工作,我将保留提交的值。
目前,我从两个 sysout 语句中看到的输出是:
Found model attribute: true
[]
这是我的 JSP sn-p:
<sf:form modelAttribute="orgChartForm" method="post">
<c:forEach items="${orgChartForm.orgChartFormElements}" var="org" varStatus="status">
<sf:hidden id="${org.id}field" path="orgChartFormElements[${status.index}].id"/>
<sf:input id="${org.id}hidden" path="orgChartFormElements[${status.index}].selected"/>
<c:out value="${org.elementLabel}"/>(<c:out value="${org.id}"/>) - <c:out value="${status.index}"/>
</c:forEach>
<input type="submit" value="Submit" />
</sf:form>
当我发出 GET 请求时,JSP 呈现,我看到我的文本输入字段列表以及预期值,这告诉我我正确使用了 spring-form 标签。但是,当我提交时,在 POST 处理程序方法中声明为参数 (orgChartForm) 的表单支持对象被初始化,但一切都是 null/默认初始化。不知道提交的数据去哪了!似乎springMVC松了它,只是构造了一个新对象。
我在这个应用程序中广泛使用了这种模式,没有出现任何故障。它在这里行不通。我意识到这是我的应用程序中的一个特殊情况,其中表单字段不是原子而是一个列表,但是数据绑定在 GET 请求中,而不是在 POST 上,这让我很困惑。
提前感谢您的任何指点!
【问题讨论】:
标签: spring-mvc