【问题标题】:Programmatically resolve Thymeleaf templates以编程方式解析 Thymeleaf 模板
【发布时间】:2016-04-16 09:35:11
【问题描述】:

我正在尝试使用 Thymeleaf 模板呈现 XML/JSON。我不想使用模板名称渲染视图,只想解析模板,如下所示。麻烦的是我得到的只是模板名称,而不是它的内容。

设置:

@Bean
SpringResourceTemplateResolver xmlTemplateResolver(ApplicationContext appCtx) {
    SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();

    templateResolver.setApplicationContext(appCtx);
    templateResolver.setPrefix("classpath:/templates/");
    templateResolver.setSuffix(".xml");
    templateResolver.setTemplateMode(XML);
    templateResolver.setCharacterEncoding(UTF_8.name());
    templateResolver.setCacheable(false);

    return templateResolver;
}

@Bean
SpringTemplateEngine templateEngine(ApplicationContext appCtx) {
    SpringTemplateEngine templateEngine = new SpringTemplateEngine();
    templateEngine.addTemplateResolver(xmlTemplateResolver(appCtx));

    return templateEngine;
}

模板(src/main/resources/templates/breakfast-menu.xml):

<?xml version="1.0" encoding="UTF-8"?>
<breakfast_menu>
    <food>
        <name>${item['name']}</name>
        <price>${item['price']}</price>
        <description>${item['description']}</description>
        <calories>${item['calories']}</calories>
    </food>
</breakfast_menu>

用法:

@Autowired
SpringTemplateEngine templateEngine;

someMethod() {
    Context context = new Context();
    context.setVariable("item", item);
    item.put("name", "Waffle");
    String content = templateEngine.process("breakfast-menu", context);

    // content == "breakfast-menu". WTH?
}

使用 Thymeleaf 3.0.0.BETA01。

【问题讨论】:

    标签: spring templates spring-boot thymeleaf


    【解决方案1】:

    我在 Thymeleaf user forum 的帮助下解决了这个问题。由于我不知道的原因,templateEngine.addTemplateResolver 不起作用,但 templateEngine.setTemplateResolver 起作用。 XML 和 JSON 输出的模板如下所示:

    XML:

    <?xml version="1.0" encoding="UTF-8"?>
    <breakfast_menu>
        <food>
            <name th:text="${item['name']}"></name>
            <price th:text="${item['price']}"></price>
            <description th:text="${item['description']}"></description>
            <calories th:text="${item['calories']}"></calories>
        </food>
    </breakfast_menu>
    

    JSON:

    {
      "food": {
        "name": "[[${item['name']}]]",
        "price": "[[${item['price']}]]",
        "description": "[[${item['description']}]]",
        "calories": "[[${item['calories']}]]"
      } 
    }
    

    【讨论】:

      【解决方案2】:

      为了完整起见,这里有一些代码来解析一个没有 Spring 的普通 Thymeleaf 模板。 这适用于 HTML,但您可以通过为 setTemplateMode 调用设置另一个参数来使其适应其他模板模式:

      Maven 依赖:

      <dependency>
          <groupId>org.thymeleaf</groupId>
          <artifactId>thymeleaf</artifactId>
          <version>3.0.12.RELEASE</version>
      </dependency>
      

      Java 类:

      import java.util.Map;
      import org.thymeleaf.TemplateEngine;
      import org.thymeleaf.context.Context;
      import org.thymeleaf.templatemode.TemplateMode;
      import org.thymeleaf.templateresolver.StringTemplateResolver;
      public class ThymeleafResolver {
          public static String resolveHTMLWithThymeleaf(String html, Map<String, Object> variables) {
              TemplateEngine templateEngine = new TemplateEngine();
              StringTemplateResolver templateResolver = new StringTemplateResolver();
              templateResolver.setTemplateMode(TemplateMode.HTML);
              templateEngine.setTemplateResolver(templateResolver);
              Context context = new Context();
              context.setVariables(variables);
              return templateEngine.process(html, context);
          }
      }
      

      测试用例 Java 代码:

      Map<String, Object> variables = new HashMap<>();
      variables.put("mytext", "Hello World");
      String result = ThymeleafInterpreter.interpretHTMLWithThymeleaf("<html><body><span th:text=\"${mytext}\"></span></body></html>", variables);
      Assert.assertEquals("<html><body><span>Hello World</span></body></html>", result);
      

      【讨论】:

      • Spring 依赖注入有几个好处,比如关注点分离、抽象和易于测试。我不认为将所有代码放在一个地方是一个好主意。如果您自己插入依赖项,我展示的代码可以在没有 Spring 上下文的情况下轻松使用。但是将它们分开可以使 IMO 代码更清晰。
      猜你喜欢
      • 1970-01-01
      • 2021-10-10
      • 2019-02-20
      • 2016-12-21
      • 2020-03-14
      • 2021-11-05
      • 1970-01-01
      • 2016-01-27
      • 2014-08-26
      相关资源
      最近更新 更多