我有一个实体作为供应商而另一个实体作为地址,它们之间的关系是一对多形式供应商要解决。
注意:我正在使用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对象进行对象绑定?
答案 0 :(得分: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>
答案 1 :(得分:0)
嗯,这很棘手,因为绑定到表单不能以动态的方式工作。这意味着你不能做像@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>