当前位置: 首页 > 知识库问答 >
问题:

包含来自同一百里香模板的片段,使用“this :: content”或“:: content”未按预期工作

夏侯弘量
2023-03-14

我包含了来自同一个模板文件的模板片段。文档的“8.1包括模板片段-定义和引用片段”一节指出:

“::d omselector”或“this::d omselector” 包括来自同一模板的片段。

如果我没有误解,我应该能够如下引用片段:th: include="this:: contentB"th: include=":: contentB",但只做完整的引用th: include="test-fraance:: contentB"对我有用。

这是示例代码:

HomeController.java

@Controller
class HomeController {
  @RequestMapping({ "/", "index", "home" })
  String index(Model model) {
    return "test";
  }
}

test.html

<!DOCTYPE html>
<html>
  <head></head>
  <body>
    <ul th:replace="test-fragment :: contentA" />
  </body>
</html>

test-fragment.html

<!DOCTYPE html>
<html>
  <head></head>
  <body>
    <ul th:fragment="contentA">
      <li th:each="idx : ${#numbers.sequence(1,4)}" th:switch="${idx}">

        <th:block th:case="1" 
            th:include="test-fragment :: contentB" 
            th:with="strVar = 'One'"/>

        <th:block th:case="2" 
            th:include="this :: contentB"
            th:with="strVar = 'Two'"/>

        <th:block th:case="3" 
            th:include=" :: contentB"
            th:with="strVar = 'Three'"/>

        <th:block th:case="*" 
            th:include="/test-fragment :: contentB" 
            th:with="strVar = 'Other'"/>
      </li>
    </ul>

    <span th:fragment="contentB">
      <span th:text="|value: ${strVar}|" />
    </span>
  </body>
</html>

输出是:

<!DOCTYPE html>
<html>
   <head></head>
   <body>
      <ul>
         <li><span>value: One</span></li>
         <li></li>
         <li></li>
         <li><span>value: Other</span></li>
      </ul>
   </body>
</html>

缺少案例 2 和 3。我做错了什么?

我正在使用Spring Boot 1.3.2.RELEASE进行测试

编辑:

我做了一个小的测试项目来重现这个问题,它可以在这里找到:https://github.com/t-cst/thymeleaf-springboot-test

编辑:

经过一些调试,我发现当片段选择器是"this:: contentB"":: contentB"时,模板名称被解析为test而不是test-frament。这是在以下位置完成的:

StandardFragment#extractFragment:189来自thymeleaf-2.1.4.RELEASE:

/* 186 */  String targetTemplateName = getTemplateName();
           if (targetTemplateName == null) {
               if (context != null && context instanceof Arguments) {
                   targetTemplateName = ((Arguments)context).getTemplateName();
/* 190 */      } else {
                   throw new TemplateProcessingException(
                           "In order to extract fragment from current template (templateName == null), processing context " +
                           "must be a non-null instance of the Arguments class (but is: " +
                           (context == null? null : context.getClass().getName()) + ")");
/* 195 */      }
           }

但我仍然不知道为什么在我的测试中会发生这种情况。

编辑:

我也在thymeleaf论坛上问过。也许这是一个错误。我已经打开了一个问题。

共有1个答案

莫振
2023-03-14

如果有人在这里以同样的问题结束,这在thymeleaf 2.1.4.RELEASE版本中是不可能的,但它将在下一个版本3.0

可以在本期评论中找到全面的解释。

 类似资料:
  • 我正在通过解析器运行GraphQl变异。这是与Neo4j数据库的对比。该查询运行良好,但是我无法以在结果中显示的方式组织结果。我已经尝试了几种不同的结果和记录映射组合,但是我无法在输出中显示返回结果集的属性。 具体来说,在下面的示例中,您将看到响应中的name字段(通过GraphiQL)在我希望将其设置为返回值时为空。 解析器: GraphQL查询 输出: 相关架构部分

  • 我不知道我的视图出了什么问题,但它不可能工作,即使设置正确,视图也总是出错。我不知道是否还有其他方法可以做到这一点,但胸腔总是失败。 错误是这样的- 这是我的控制器 我的观点

  • 我有一个应用程序实体,其中包含一些参数,如CustomerName、Address和CardNumber。在用Jackson将其序列化为JSON时,我希望卡号被屏蔽。例如,如果CardNumber为1234567890134,我希望JSON的值为CardNumber:1234*******1234。所以我在Card Number属性上添加了@JsonSerialize注释,并使其使用我的自定义序列

  • 我想在胸腺方言中使用胸腺方言,但不能。我尝试过这个,但效果不佳: of删除里面的所有内容。我想在渲染后得到这样的东西: 那么,我该如何实现我的目标呢?

  • 我尝试使用ThymeLeaf处理模板,但我得到。 这是我的代码: 我试图通过添加这样的前缀来更改路径,但它没有帮助: 此错误可能是由路径问题以外的其他原因引起的吗? 如果需要,我可以给我的项目结构的更多细节。 谢谢 编辑: 这是堆栈跟踪,它可能会有所帮助:

  • 我正在使用spring Roo并希望访问Controller类中的一个bean,该类在ApplicationContext.xml中具有以下配置: 配置类本身是: 在我的Controller中,我认为一个简单的Autowired注释应该可以完成这项工作 在启动过程中,spring在setSkipWeeks方法中打印消息。不幸的是,每当我在控制器中调用config.getSkipWeeks()时,它