带有自己控制器的 Thymeleaf 片段

Thymeleaf fragment with own controller

我想用 thymeleaf 创建一个片段,它有自己的控制器,所以只要我包含片段,就会调用控制器并填充必要的模型属性。对我来说,这听起来像是一个基本要求,但我是 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 并且我没有更改或编辑任何解析器。 谢谢同行

Spring MVC 和模型的想法是,在视图中仅呈现数据。所以从模板中的任何地方调用服务或控制器是个坏主意。

你可以用一个函数解决这个问题addDataForTableFragment(Model model)。这必须从使用带有片段的模板的控制器调用。如果您需要许多方法的数据,请查看 "ModelAttribute".

我手边没有参考资料,但听起来您想要 Thymeleaf 元素进行 REST 调用并允许您使用结果修改 DOM。它用于填充菜单或列表、控制可见性等。每个 REST 端点都是一个单独的控制器。

它可以对 DOM 进行更实质性的更改,但您将失去使用框架的好处,因为一切都在服务器端完成。

Spring MVC 和 Thymeleaf 的在线(Udemy?)课程之一对此进行了介绍。

对于以后遇到这个问题的任何人 - 你会这样做,因为它允许 Controller 专注于做一件事。这意味着它们更简单,如果页面被修改并且需要引入额外的数据,您不必担心更改控制器。

它也更快,因为您不必在准备响应之前等待所有数据可用(或超时)。您可以更快地响应 - 也许根本没有自定义数据 - 并在自定义数据可用时填充它。

最后,不需要所有数据都来自同一个地方。如果每个微服务都提供一个 REST 控制器但不对数据的使用方式做出任何假设,那么使用专门化的微服务会容易得多。

您可以使用

将另一个回复包含到当前页面中
<th:block th:utext="${#servletContext.getRequestDispatcher('/path/to/fragment').include(#request,#response)}"/>

(方法 returns 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')}"/>