如何根据href链接动态更改thymeleaf片段

monwx1rj  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(388)

我想用thymeleaf片段构建一个页面,根据下面的链接动态呈现这些片段。
我在运行时通过spring控制器解析片段名称时遇到了一个问题。
这是一个最小的例子来说明我的意思。
我有 list.html 带有两个链接的页面列表1和列表2,图片和代码如下:

<body>
  <button type="button"><a th:href="${'/lists/list1'}">List 1</a></button>
  <button type="button"><a th:href="${'/lists/list2'}">List 2</a></button>

  <!-- This doesn't work, the include is not resolved correctly -->
  <th:block th:include="'fragments/lists/' + ${fragmentName}
                        + ' :: ' + ${fragmentName}"></th:block>

  <!-- However static include works well -->
  <th:block th:include="fragments/lists/list1 :: list1"></th:block>
</body>

相关的Spring控制器如下所示:

@GetMapping("lists")
public String getListsPage(Model model) {
    model.addAttribute("fragmentName", "listAll");
    return "lists";
}

@GetMapping("lists/list1")
public String getAllItems(Model model) {
    model.addAttribute("list1", itemService.getList1());
    model.addAttribute("fragmentName", "list1");
    return "lists";
}

@GetMapping("lists/list2")
public String getAllItems(Model model) {
    model.addAttribute("list2", itemService.getList2());
    model.addAttribute("fragmentName", "list2");
    return "lists";
}

问题是 fragmentName 未在运行时解析,它引发 TemplateInputException 例外情况:

Caused by: org.thymeleaf.exceptions.TemplateInputException: Error resolving
  template ['fragments/lists/' + ${fragmentName} + '], template might not exist
  or might not be accessible by any of the configured Template Resolvers
  (template: "lists" - line 38, col 11)

同时,静态块工作正常,如所示 list.html 页面代码。
请不要建议我使用springmvc3.2thymeleafajax片段,我不想使用ajax,我发现当前使用controller返回片段名称的解决方案对于我的情况非常清楚和简单。
也许我可以使用片段表达式,但我不确定具体如何使用。
如有任何建议,我们将不胜感激。

lx0bsm1f

lx0bsm1f1#

我可以这样表达语法:

<th:block th:include="~{${'fragments/lists/' + fragmentName} :: ${fragmentName}}"></th:block>

相关问题