我如何从第二种形式获取数据

How can i get the data from a second form

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

在我的控制器中,我有“@ModelAttribute("person") Person p”行,它应该检索其中包含“modelAttribute="person"”的表单。但是检索到的人是一个空实体,我假设这是因为必须提交人员表单才能检索数据。

@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";
    }

我可能可以检索输入而不是表单,并使用它们创建具有这些值的新实体,但如果我这样做,控制器的传递属性将充满输入并且看起来很难看。我有没有办法将这些值作为 Person 实体检索?

编辑

Sanjay 的第一个选择是最合乎逻辑的方法,但由于我想要设计的东西不适合它,所以我不能这样做。但是 Sanjay 关于以一种形式制作它的评论帮助了我所以我选择 Sanjay 的答案作为解决方案但这是我修复它的方法 因为我在 c:url 中保存了表单动作,所以我更改了按钮的 onclick 函数,这样当单击表单时,表单的动作会根据按钮而改变,而且我已经有了相应的动作控制器。对于我个人内部的地址列表,我不得不先在我的页面控制器中的列表中添加一个空地址,然后使用

来解决这个问题
<c:forEach items="${person.addresses}" varStatus="loop">
   <c:if test="${loop.last}">
      <form:input path="addresses[${loop.index}].street" />
      ...

上面的代码我能够填充之前添加​​的空地址。 我仍在修复所有问题,但这是我修复它的一般想法。感谢您的帮助。

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?

更简洁的代码 -
1.Create JSON 包含所有表单输入数据的对象(例如 formFields)。
2.send 表单域到服务器使用 ajax 调用。
3.Read formFields as String in controller

@ModelAttribute("formFields") final String formFields

4.You 应该有 DTO 匹配 formFields 名称说 FormDTO。
5.convert 使用 ObjectMapper API.

将字符串类型的 formFields 转换为 FormDTO
    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 是 jackson-databind-2.4 的一部分。4.jar

我认为您可能需要重新审视您的 UI,添加一些隐藏字段等。我可以想到一些解决方案:

  1. 有一个 "Add Address" 按钮,它使用 JavaScript 将空白地址行附加到表单中,但它不会提交到服务器。在底部有真正的 "Submit" 按钮,它将提交包括人员和地址在内的整个表单。
  2. 有一个提交按钮来保存没有地址的人。然后,在第二个屏幕上,显示此人,并有地址提交按钮。
  3. 如果先保存地址符合您的要求,则反向执行上述操作