首页 文章

使用spring mvc处理百里香的一对多关系

提问于
浏览
0

我有一个实体作为供应商,另一个实体作为地址,它们之间的关系是一对多形式供应商要解决 .

注意:我正在使用JPA

我的供应商实体

public class Vendor {

 private Integer id;

  private String name;

  private List<Address> address;

 // getter and setters

}

地址类:

public class Address {

private Integer id;

private String addressline1;
private String addressline2;

//getter and setters 
}

现在我正在使用Thymeleaf,我有一个场景,我需要动态地将地址添加到特定供应商的表单中 .

如何在spring mvc中使用Thymeleaf为供应商中的Address对象进行对象绑定?

2 回答

  • 0

    评论如果我不理解你的问题是正确的,那对我来说有点不清楚......

    为了访问供应商的地址,您在控制器中提供供应商(类似于 model.addAttribute("vendor", currentVendor); )并在您的html文件中调用vendor.address . 请注意,这将为您提供一个列表,因此您需要迭代以显示所有地址:

    <tr th:each="address : ${vendor.address}">
        <td th:text="${address.id}">1</td>
        <td th:text="${address.addressline1}"></td>
        <td th:text="${address.addressline2}"></td>
    </tr>
    
  • 0

    嗯,'s tricky because binding to form doesn'以动态的方式工作 . 这意味着你不能做像@Viergelenker建议 AND 将每个地址对象绑定到他自己的形式 .

    您可以向模型添加单个地址对象,例如

    model.addAttribute("address", addressObject); // Snippet for Model-object
    modelAndView.addObject("address", addressObject); // Snippet for ModelAndView object
    

    然后在yout模板中定义一个表单,如:

    <form .... method=".." th:object="${address}">
      <input type="hidden" th:field="*{id}" >
      <input type="text" th:field="*{addressline1}" >
      <input type="text" th:field="*{addressline2}" >
    </form>
    

    遗憾的是,无法向模型添加数组或列表,并将该集合中的每个对象绑定到自己的表单:

    /* The following code doesn't work */
    <th:block th:each="address : ${addresses}">
        <form .... method=".." th:object="${address}">
          <input type="text" th:field="*{addressline1}" >
          ...
        </form>
    </th:block>
    

    要么

    /* The following code doesn't work */
    <th:block th:each="address, stat : ${addresses}">
        <form .... method=".." th:object="${addresses[__stat.index__]}">
          <input type="text" th:field="*{addressline1}" >
          ...
        </form>
    </th:block>
    

    你可以做的是不使用表单绑定,只是从没有绑定的表单中发送一些名称 - 值对(只使用名称和th:value属性,而不是表单中的th:field属性)到控制器,得到它们来自HttpServletRequest对象并创建/更新/删除地址对象...或将整个Vendor对象绑定到表单(注意使用stat.index):

    <form th:object="${vendor}">
        <input type="hidden" th:field="*{id}">
        <input type="hidden" th:field="*{name}"> // feel free to make that field editable
        <th:block th:each="addr, stat : *{address}">
          <input type="hidden" th:field="*{address[__${stat.index}__].id}">         
          <input type="text" th:field="*{address[__${stat.index}__].addressline1}">
          <input type="text" th:field="*{address[__${stat.index}__].addressline2}">
        </th:block>
     </form>
    

相关问题