这是一个添加页面。 Person包含一个地址列表,所以当我尝试向那个尚未在数据库中的人添加地址时,我需要能够在提交地址时检索人员表格并将该地址分配给该人。
<form:form action="${addAction}" modelAttribute="person">
<form:label path="name">
<spring:message text="Name"/>
</form:label>
<form:input path="name" />
... More labels and inputs
</form:form>
<form:form action="${addAddress}" modelAttribute="address">
... Labels
<input type="submit" value="<spring:message text="Add Address"/>" />
</form:form>
在我的控制器中,我有&#34; @ModelAttribute(&#34; person&#34;)Person p&#34;应该检索具有&#34; modelAttribute =&#34; person&#34;&#34;在里面。但检索到的人是一个空实体,我假设是因为必须提交人员表格才能检索数据。
@RequestMapping(value = "/person/addAddress", method = RequestMethod.POST)
public String addAddress(@ModelAttribute("person") Person p, @ModelAttribute("address") Address a, RedirectAttributes redirectAttrs) {
p.getAddresses().add(a);
redirectAttrs.addFlashAttribute("person", p);
return "redirect:/person";
}
我可能可以检索输入而不是表单,并使用它们来创建具有这些值的新实体,但如果我要做那些控制器&#39;传递属性将充满输入,看起来很难看。我有办法将这些值检索为Person实体吗?
修改
Sanjay的第一个选择是最合乎逻辑的方式,但由于我想设计的不适合它,我无法做到。但是Sanjay关于以一种形式制作它的评论帮助了我,所以我选择Sanjay的答案作为解决方案,但这里是我如何修复它 由于我在c:url中保存了表单操作,因此我更改了按钮&#39; onclick功能,当点击表格时,动作会根据按钮而改变,我已经有了相应的操作控制器。对于我的人员内部的地址列表,我必须首先在页面控制器的列表中添加一个空地址,然后使用
进行解决方法<c:forEach items="${person.addresses}" varStatus="loop">
<c:if test="${loop.last}">
<form:input path="addresses[${loop.index}].street" />
...
上面的代码我能够填充以前添加的空地址。 我仍然在修理一切,但这是我如何修复它的一般想法。谢谢你的帮助。
答案 0 :(得分:0)
我认为您可能需要重新访问您的用户界面,添加一些隐藏的字段等。我可以想到一些解决方案:
答案 1 :(得分:-1)
I probably can retreieve the inputs instead of the form and use them to create a new entity with those values but if i were to do that controllers' passing attributes will be full of inputs and would look ugly. Is there a way for me to retrieve those values as a Person entity?
For cleaner code -
1.Create JSON object (say formFields) with all your form input data.
2.send formFields to server using ajax call.
3.Read formFields as String in controller
@ModelAttribute("formFields") final String formFields
4.You should have DTO matching formFields name say FormDTO.
5.convert formFields of String type to FormDTO using ObjectMapper API.
FormDTO formDto = null;
try {
ObjectMapper mapper = new ObjectMapper();
formDto = mapper.readValue(formDto, FormDTO.class);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
P.S. ObjectMapper is part of jackson-databind-2.4.4.jar