Фрагмент тимелист с собственным контроллером

Я хочу создать фрагмент с помощью thymeleaf, который имеет свой собственный контроллер, поэтому каждый раз, когда я включаю этот фрагмент, вызывается контроллер и заполняет необходимые атрибуты модели. Для меня это звучит как основная просьба, но я новичок в чабреце и не могу понять это. Например, у меня есть такой фрагмент:

<div th:fragment="table">
  <tr th:each="prod : ${prods}">
    <td th:text="${prod.name}"/>
  </tr>
</div>

В дополнение к этому фрагменту у меня будет контроллер, который выглядит примерно так:

@RequestMapping(value="/getProducts")
public Model products(Model model){
    List<String> products = getProductList();
    model.addAttribute("prods", products)
    return model;
}

Так как я могу связать эти два? Я использую Spring-Boot, и я не изменил или отредактировал какой-либо решатель Спасибо, пэр

3 ответа

Решение

Идея фон MVC и модели Spring заключается в том, что в представлении отображаются только данные. Поэтому плохая идея вызывать сервис или контроллер из любого места в шаблоне.

Вы можете решить эту проблему с помощью функции addDataForTableFragment(Model model), Это должно быть вызвано из вашего контроллера, который использует шаблон с фрагментом. Если вам нужны данные во многих методах, посмотрите "ModelAttribute".

Вы можете включить другой ответ в текущую страницу с

<th:block th:utext="${#servletContext.getRequestDispatcher('/path/to/fragment').include(#request,#response)}"/>

(метод возвращает void, завернутый в utext просто назвать это)

Если это частый сценарий, вы можете превратить его во фрагмент, принимающий параметр пути

<th:block th:fragment="include(url)">
    <th:block th:utext="${#servletContext.getRequestDispatcher(url).include(#request,#response)}"/>
</th:block>

и позвонить с

<th:block th:include="~{::include(url='/path/to/fragment')}"/>

У меня нет удобной ссылки, но похоже, что вам нужен элемент Thymeleaf, который выполняет вызов REST и позволяет вам модифицировать DOM, используя результаты. Он используется для заполнения меню или списков, управления видимостью и т. Д. Каждая конечная точка REST является отдельным контроллером.

Это может внести более существенные изменения в DOM, но вы потеряете преимущества использования инфраструктуры, поскольку все делается на стороне сервера.

Об этом рассказывалось в одном из онлайн-курсов (Udemy?) Spring MVC и Thymeleaf.

Для любого, кто столкнется с этим вопросом в будущем - вы сделаете это, так как это позволяет Контроллеру сосредоточиться на выполнении только одной вещи. Это означает, что они проще, и вам не нужно беспокоиться об изменении вашего контроллера, если страница изменена и вам нужно добавить дополнительные данные.

Это также быстрее, так как вам не нужно ждать, пока все данные будут доступны (или для тайм-аута), прежде чем подготовить свой ответ. Вы можете ответить намного быстрее - возможно, без каких-либо настроенных данных - и заполнять настраиваемые данные по мере их появления.

Наконец, не требуется, чтобы все данные поступали из одного места. Гораздо проще использовать микросервисы со специализацией, если каждый из них предоставляет контроллер REST, но не делает никаких предположений о том, как будут использоваться данные.

Другие вопросы по тегам