在 spring-boot 中使用一个模板引擎渲染多个后缀

Posted

技术标签:

【中文标题】在 spring-boot 中使用一个模板引擎渲染多个后缀【英文标题】:render multiple suffixes with one template engine in spring-boot 【发布时间】:2017-09-30 17:53:28 【问题描述】:

我创建了两个 thymleaf 解析器并将它们添加到模板引擎中,因此我可以在 spring-boot 中处理 txt/svg 模板。

@Configuration
public class TemplateEngineConfig 

    @Bean
    public SpringTemplateEngine textTemplateEngine() 
        SpringTemplateEngine templateEngine = new SpringTemplateEngine();
        templateEngine.addTemplateResolver(textTemplateResolver());
        templateEngine.addTemplateResolver(svgTemplateResolver());
        return templateEngine;
    

    private ITemplateResolver textTemplateResolver() 
        ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
        templateResolver.setOrder(1);
        templateResolver.setPrefix("templates/");
        templateResolver.setSuffix(".txt");
        templateResolver.setTemplateMode(TemplateMode.TEXT);
        templateResolver.setCacheable(false);
        return templateResolver;
    

    private ITemplateResolver svgTemplateResolver() 
        ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
        templateResolver.setOrder(2);
        templateResolver.setPrefix("templates/");
        templateResolver.setSuffix(".svg");
        templateResolver.setTemplateMode(TemplateMode.TEXT);
        templateResolver.setCacheable(false);
        return templateResolver;
    

我就是这样用的。

@Component
public class TemplateRenderer 

    @Autowired
    @Qualifier("textTemplateEngine")
    private TemplateEngine textTemplateEngine;

    public String renderPlainText(String filename, Map<String, Object> params) 
        Context context = new Context(LocaleContextHolder.getLocale(), params);
        return textTemplateEngine.process(filename, context);
    


没有用。我尝试渲染templates/img.svg,但Thymleaf 抱怨找不到templates/img.txt 文件,我该如何让它工作?

【问题讨论】:

【参考方案1】:

我认为你应该用 @bean 和 Qualifier 标记 ITemplateResolver 所以当 您将 @autowire textTemplateEngine 或 svgTemplateEngine 所以 spring 将使用限定符名称自动装配它们。

@Bean
@Qualifier("textTemplateEngine")
private ITemplateResolver textTemplateResolver() 
    ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
    templateResolver.setOrder(1);
    templateResolver.setPrefix("templates/");
    templateResolver.setSuffix(".txt");
    templateResolver.setTemplateMode(TemplateMode.TEXT);
    templateResolver.setCacheable(false);
    return templateResolver;


@Bean
@Qualifier("svgTemplateEngine")
private ITemplateResolver svgTemplateResolver() 
    ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
    templateResolver.setOrder(2);
    templateResolver.setPrefix("templates/");
    templateResolver.setSuffix(".svg");
    templateResolver.setTemplateMode(TemplateMode.TEXT);
    templateResolver.setCacheable(false);
    return templateResolver;

您还可以通过 xml 配置配置 Thymeleaf 多个解析器,例如:

<bean class="org.thymeleaf.spring4.view.ThymeleafViewResolver">
  <property name="characterEncoding" value="UTF-8" />
  <property name="templateEngine">
    <bean class="org.thymeleaf.spring4.SpringTemplateEngine">
      <property name="dialects">
        <set>
          <bean class="org.thymeleaf.spring4.dialect.SpringStandardDialect" />
        </set>
      </property>
      <property name="templateResolvers">
        <set>
          <bean class="org.thymeleaf.templateresolver.ServletContextTemplateResolver">
            <property name="cacheable" value="false" />
            <property name="prefix" value="/fragments/" />
            <property name="suffix" value=".html" />
            <property name="templateMode" value="HTML5" />
          </bean>
          <bean class="org.thymeleaf.templateresolver.ServletContextTemplateResolver">
            <property name="cacheable" value="false" />
            <property name="prefix" value="/views/" />
            <property name="suffix" value=".html" />
            <property name="templateMode" value="HTML5" />
          </bean>
        </set>
      </property>
    </bean>
  </property>
</bean>

【讨论】:

【参考方案2】:

只需强制您的 SpringTemplateEngine 检查模板是否存在,而不仅仅是使用定义的模式。请强制添加

templateResolver.setCheckExistence(true);

到您的每个模板解析器。

【讨论】:

以上是关于在 spring-boot 中使用一个模板引擎渲染多个后缀的主要内容,如果未能解决你的问题,请参考以下文章

ajax里使用模板引擎

Django:在部署时通过模板引擎渲染静态文件

模板渲染

SpringBoot:2.SpringBoot整合Thymeleaf模板引擎渲染web视图

使用 jinja2 模板引擎渲染 django 表单

SpringBoot入门篇--使用Thymeleaf模板引擎进行页面的渲染