如何从第二种格式获取数据

时间:2015-08-06 09:06:11

标签: spring forms jsp spring-mvc controller

这是一个添加页面。 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" />
      ...

上面的代码我能够填充以前添加的空地址。 我仍然在修理一切,但这是我如何修复它的一般想法。谢谢你的帮助。

2 个答案:

答案 0 :(得分:0)

我认为您可能需要重新访问您的用户界面,添加一些隐藏的字段等。我可以想到一些解决方案:

  1. 有一个&#34;添加地址&#34;按钮使用JavaScript将空白行地址附加到表单中,但它不会提交给服务器。有真实的&#34;提交&#34;底部的按钮,提交整个表单,包括人员和地址。
  2. 有一个提交按钮来保存没有地址的人。然后,在第二个屏幕上显示此人,并具有地址提交按钮。
  3. 如果保存地址首先符合您的要求,请执行上述操作

答案 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