【问题标题】:How can i get the data from a second form我如何从第二种形式中获取数据
【发布时间】:2015-08-06 09:06:10
【问题描述】:

这是一个添加页面。人员包含地址列表,因此当我尝试向该人员添加尚未在数据库中的地址时,我需要能够在提交地址时检索人员表单并将该地址分配给该人员。

 <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 的第一个选择是最合乎逻辑的方式,但由于我想要设计的内容不适合它,所以我无法做到。但是桑杰关于以一种形式制作的评论帮助了我,所以我选择桑杰的答案作为解决方案,但这是我修复它的方法 由于我在 c:url 中保存了表单操作,因此我更改了按钮的 onclick 功能,这样当单击表单时,操作会根据按钮而改变,并且我已经有相应的操作控制器。对于我个人内部的地址列表,我必须首先在我的页面控制器中的列表中添加一个空地址,然后使用

<c:forEach items="${person.addresses}" varStatus="loop">
   <c:if test="${loop.last}">
      <form:input path="addresses[${loop.index}].street" />
      ...

我上面的代码能够填充之前添加​​的空地址。 我仍在修复所有问题,但这是我如何修复它的总体思路。感谢您的帮助。

【问题讨论】:

  • 我认为提交form2时无法获取form1的数据。你需要改变你的场景,例如把所有东西都放在一个大表格中。
  • 谢谢 Sanjay,但我认为这行不通,因为我不知道它是添加地址还是添加人员,如果它是一种形式。在添加人员之前,我需要能够向该人员添加多个地址
  • 你应该只使用一种形式。

标签: spring forms jsp spring-mvc controller


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    为了更简洁的代码 -
    1.使用所有表单输入数据创建 JSON 对象(比如 formFields)。
    2.使用ajax调用将formFields发送到服务器。
    3.在控制器中将formFields读取为String

    @ModelAttribute("formFields") final String formFields
    

    4.你应该有 DTO 匹配 formFields 名称说 FormDTO。
    5.使用ObjectMapper API将String类型的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();
       }
    

    附: ObjectMapper 是 jackson-databind-2.4.4.jar 的一部分

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-20
      • 1970-01-01
      • 1970-01-01
      • 2020-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多