обрабатывать отношения один-ко-многим в тимелист с помощью Spring MVC - PullRequest
0 голосов
/ 31 мая 2018

У меня одна сущность в качестве Продавца, а другая в качестве Адреса, и отношения между ними - «Один ко многим» от Продавца до Адреса.

Примечание. Я использую JPA

MyVendor Entity

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, у меня есть сценарий, в котором мне нужно динамически добавить адрес в форму для конкретного поставщика.

Как сделать привязку объектов для объекта Address в Vendor, используя Thymeleaf весной mvc?

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Уххх, это сложно, потому что привязка к форме не работает динамически.Это означает, что вы не можете сделать что-то, как @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>
0 голосов
/ 01 июня 2018

Прокомментируйте, если я не правильно понял ваш вопрос, мне немного непонятно ...

Чтобы получить доступ к адресам поставщика, вы предоставляете поставщика в контроллере (что-то вроде model.addAttribute("vendor", currentVendor);) и вызовите vendor.address в вашем html-файле.Обратите внимание, что это даст вам список, поэтому вам нужно выполнить итерацию, чтобы показать все адреса:

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...