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

     2023-02-26     213

关键词:

【中文标题】在 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);

到您的每个模板解析器。

【讨论】:

在express中使用模板引擎

参考技术A需要在应用中进行如下设置才能让Express渲染模板文件:views,放模板文件的目录,比如:app.set('views','./views')viewengine,模板引擎,比如:app.set('viewengine','jade')然后安装相应的模板引擎npm软件包。$np... 查看详情

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

...ploy-time【发布时间】:2014-03-0622:36:57【问题描述】:我想使用Django模板变量渲染一些静态文件(尤其是*.js)。我相信这是一个常见的用例,尤其是在做任何AJAX-y时;我不想在我的.js文件中硬编码AJAXurl,就像我想在我的.html文件... 查看详情

模板渲染

...示的动态部分,其具体值只在请求的上下文中才能知道。使用真实值替换变量,再返回最终得到的响应字符串,这一过程称为渲染。为了渲染模板,Flask 使用了一个名为Jinja2 的强大模板引擎。接下来讲解Jinja2模板渲染的... 查看详情

flask模板的基本用法模板语法渲染模板模板辅助工具(代码片段)

...态生成。当HTML代码保存到单独的文件中时,我们没法再使用字符串格式化或拼接字符串的当时在HTML代码中插入变量,这时我们需要使用模板引擎(templateengine)。借助模板引擎,我们可以再HTML文件中使用特殊的语法来标记变量... 查看详情

在express中配置使用art-template模板引擎(代码片段)

先安装需要使用的包cnpminstall--saveart-templatecnpminstall--saveexpress-art-template配置(官网案例) varexpress=require(‘express‘)varexpress=require(‘express‘);varapp=express();//配置使用art-template模板引擎//第一个参数表示,当渲染以.art 查看详情

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

】使用jinja2模板引擎渲染django表单【英文标题】:Renderingdjangoformswithjinja2templateengine【发布时间】:2016-08-2314:12:13【问题描述】:我在django项目中使用jinja2模板引擎。我对设置做了相应的更改:TEMPLATES=[\'BACKEND\':\'django.template.backe... 查看详情

flask02模板相关(代码片段)

...模板什么是模板引擎?为什么要有模板引擎?Flask中如何使用模板引擎?模板引擎传参模板加载静态文件模板的继承模板什么是模板引擎?实现视图的业务逻辑和返回给前端的页面逻辑分离的工具,我们称之为模板引擎。为什么... 查看详情

thymeleaf模板引擎学习(代码片段)

开发传统JavaWEB项目时,我们可以使用JSP页面模板语言,但是在SpringBoot中已经不推荐使用JSP页面进行页面渲染了。从而Thymeleaf提供了一个用于整合SpringMVC的可选模块,在应用开发中,你可以使用Thymeleaf来完全代替JSP,或其他模板... 查看详情

springboot?使用thymeleaf模板引擎渲染web视图

 静态资源访问 在我们开发Web应用的时候,需要引用大量的js、css、图片等静态资源。 默认配置 SpringBoot默认提供静态资源目录位置需置于classpath下,目录名需符合如下规则: /static/public/resources/META-INF/resources&n... 查看详情

vaadin10没有在spring-boot中使用模板

我试图在Spring-Boot应用程序中使用Vaadin10的模板。问题是,显示页面时不使用模板。页面上没有出现模板的任何组件。我的模板PersonForm.html存储在src/main/resources/META-INF/resources/frontend/src中。试图绑定它们的类是:@Route@Tag("person-form"... 查看详情

02-模板(过滤器,控制代码块)(代码片段)

...典,列表的取值方式能够写出数组反转的自定义过滤器(使用1种方式即可)能够说出Flask中模板代码复用的三种方式能够使用代码实现模板继承的功能能够说出可以在模板中直接使用的Flask变量和函数能够使用Flask-WTF扩展实现注... 查看详情

flask系列-模板(代码片段)

...2模板引擎默认情况下,Flask在templates文件夹中寻找模板,使用render_template将该引擎集中到程序中一个超简陋的Jinjia2模板:<h1>Hello,name!<h1>变量:表示一个变量,值从渲染模板时使用的数据中获取可使用过滤器修改变量:n... 查看详情

如何使用 ember 2.3 在一个模板文件中渲染多个插座

】如何使用ember2.3在一个模板文件中渲染多个插座【英文标题】:HowdoIrendermultipleoutletsinonetemplatefileusingember2.3【发布时间】:2016-01-2607:11:59【问题描述】:我正在尝试将多个.hbssn-ps渲染到它们各自的插座中。但是,下面的renderTemp... 查看详情

jqueryjtemplates.js模板渲染引擎的详细用法第二篇

...,不同之处是绑定模板的方式,这里讲模板的数据专门写一个template.html的文件来展示<spanstyle="font-family:MicrosoftYaHei;font-size:14px;"><!doctypehtml>&l 查看详情

在 Flask 中使用 socketio.on() 渲染一个新模板

】在Flask中使用socketio.on()渲染一个新模板【英文标题】:Renderanewtemplatewithsocketio.on()inFlask【发布时间】:2014-07-1304:18:31【问题描述】:我正在尝试按照以下方式做一些事情:fromflaskimportFlask,render_template,redirect,url_forfromflask.ext.socke... 查看详情

使用 Django 在模板中渲染 ForeignKey 对象

】使用Django在模板中渲染ForeignKey对象【英文标题】:RenderingForeignKeyobjectsintemplatewithDjango【发布时间】:2020-12-1810:18:31【问题描述】:我无法在模板中呈现相关对象。我有一个Page模型,它与自身有一个ForeignKey关系来定义父子关... 查看详情

服务端渲染和客户端渲染

目录服务端渲染说白了就是在服务端使用模板引擎模板引擎最早诞生于服务端,后来才发展到了前端客户端渲染过程1.浏览器发出请求,收到服务器响应的html页面字符串(含模板引擎)2.浏览器从上到下依次解析该页面3.在... 查看详情

goweb编程实战(10)----模板引擎库text/template包的使用(代码片段)

...录前言模板引擎定义模板文件解析模板文件渲染模板实战使用模板创建.tmpl文件创建文件用于解析与渲染模板前言在Go语言中,模板引擎库text/template包主要用于处理任意格式的文本内容,同时还提供了html/template包,用... 查看详情