找回密码
 立即注册
首页 业界区 业界 [Java/模板渲染引擎/技术选型] 模板引擎-技术调研 ...

[Java/模板渲染引擎/技术选型] 模板引擎-技术调研

韦逸思 前天 10:46
概述: 模板渲染引擎 := 模板引擎

为什么要使用【模板(渲染)引擎】?模板(渲染)引擎的作用?


  • 模板引擎可以让(网站)程序实现界面与数据分离,业务代码与逻辑代码的分离,大大提升了开发效率,良好的设计也使得代码重用变得更加容易。


  • 我们司空见惯的模板安装卸载等概念,基本上都和模板引擎有着千丝万缕的联系。
1.png


  • 模板引擎不只是可以让你实现代码分离(业务逻辑代码和用户界面代码),也可以实现数据分离(动态数据与静态数据),还可以实现代码单元共享(代码重用),甚至是多语言、动态页面与静态页面自动均衡(SDE)等等与用户界面可能没有关系的功能。
Thymeleaf (Apache 2.0)  : 推荐指数=9.0/10

简介


  • 项目URL


  • http://www.thymeleaf.org
  • https://github.com/thymeleaf/thymeleaf
github star / fork
  1. 20250528 : 2.9k star / 510 fork
复制代码

  • 开源许可协议: Apache 2.0
特点


  • Thymeleaf 支持在有网络无网络的环境下皆可运行。
即 它可以让美工在浏览器查看页面的静态效果,也可以让程序员在服务器查看带数据的动态页面效果。
这是由于它支持 html 原型,然后在 html 标签里增加额外的属性来达到模板+数据的展示方式。
浏览器解释 html 时会忽略未定义的标签属性,所以 thymeleaf 的模板可以静态地运行;
当有数据返回到页面时,Thymeleaf 标签会动态地替换掉静态内容,使页面动态显示。


  • Thymeleaf 开箱即用的特性。
它提供标准和spring标准两种方言,可以直接套用模板实现JSTL、 OGNL表达式效果,避免每天套模板、该jstl、改标签的困扰。
同时开发人员也可以扩展和创建自定义的方言。


  • Thymeleaf 提供spring标准方言和一个与 Spring MVC 集成的可选模块————可以快速的实现表单绑定、属性编辑器、国际化等功能。
目前主流的模板引擎之一,Spring Boot推荐
优点:语法简洁,功能强大。
缺点:性能差。
语法


  • 获取变量的值 ${...}
  • 链接 @{...}
  • 文本替换 th:text=${...}
这里可以替换id值,class值以及内容等


  • 判断语句
  1. th:if
  2. th:unless
  3. th:switch
复制代码

  • 遍历 th:each
...
可参考下图,如果需要了解更多可以查看对应的API文档
2.png

依赖安装
  1. <dependency>
  2.         <groupId>org.thymeleaf</groupId>
  3.         thymeleaf</artifactId>
  4.         <version>${thymeleaf.version}</version>
  5. </dependency>
复制代码


  • spring-boot.version : 3.3.5
  • thymeleaf.version : 3.1.2.RELEASE
普通Java程序中的基本使用
  1. import lombok.extern.slf4j.Slf4j;
  2. import org.junit.jupiter.api.Test;
  3. import org.thymeleaf.ITemplateEngine;
  4. import org.thymeleaf.TemplateEngine;
  5. import org.thymeleaf.context.Context;
  6. import org.thymeleaf.context.WebContext;
  7. import org.thymeleaf.templatemode.TemplateMode;
  8. import org.thymeleaf.templateresolver.ITemplateResolver;
  9. import org.thymeleaf.templateresolver.StringTemplateResolver;
  10. import org.thymeleaf.web.IWebExchange;
  11. import java.util.Calendar;
  12. @Slf4j
  13. public class ThymeleafTemplateEngineUtils {
  14.     //ITemplateEngine templateEngine
  15.     private static TemplateEngine templateEngine = null;
  16.     //ITemplateResolver templateResolver
  17.     private static StringTemplateResolver templateResolver = null;
  18.     //IContext
  19.     //IWebExchange webExchange;
  20.     //WebContext context = new WebContext(webExchange, webExchange.getLocale());
  21.     private static Context context = new Context();//实际场景中,不建议此属性为静态属性
  22.     static {
  23.         init();
  24.     }
  25.     private static void init(){
  26.         templateResolver = new StringTemplateResolver();
  27.         templateEngine = new TemplateEngine();
  28.         templateEngine.setTemplateResolver(templateResolver);
  29.         context = new Context();
  30.     }
  31.     /**
  32.      * TEXT 渲染模式
  33.      */
  34.     @Test
  35.     public void textRenderTest() {
  36.         templateResolver.setTemplateMode(TemplateMode.TEXT);
  37.         context.setVariable("today", "2011-11-11");
  38.         String text = templateEngine.process("Today is: [(${today})]", context);
  39.         log.info("{}", text);//Today is: 2011-11-11
  40.     }
  41.     /**
  42.      * HTML 渲染模式
  43.      */
  44.     @Test
  45.     public void htmlRenderTest() {
  46.         templateResolver.setTemplateMode(TemplateMode.HTML);
  47.         context.setVariable("today", "2011-11-11");
  48.         String text = templateEngine.process("<p>Today is: 13 february 2011.</p>", context);
  49.         log.info("{}", text);//<p>Today is: 2011-11-11.</p>
  50.     }
  51. }
复制代码
Spring MVC 应用程序中的基本使用


  • 配置 TemplateResolver
  1. import org.thymeleaf.templateresolver.ITemplateResolver;
  2. import org.thymeleaf.templateresolver.StringTemplateResolver;
  3. @Configuration
  4. public class TemplateResolverConfiguration {
  5.         @Bean
  6.         public StringTemplateResolver defaultTemplateResolver() {
  7.                 StringTemplateResolver resolver = new StringTemplateResolver();
  8.         templateResolver.setTemplateMode(TemplateMode.HTML);
  9.                 return resolver;
  10.         }
  11. }
复制代码

  • 对 HTTP 接口请求内容的动态渲染
  1. import org.thymeleaf.ITemplateEngine;
  2. import org.thymeleaf.TemplateEngine;
  3. import org.thymeleaf.context.Context;
  4. import org.thymeleaf.context.WebContext;
  5. @Autowired
  6. private SpringTemplateEngine templateEngine;
  7. @RequestMapping("test")
  8. public String test(){
  9.         Context ctx = new Context();
  10.         ctx.setVariable("today", "2011-11-11");
  11.         String str = templateEngine.process("<p>Today is: 13 february 2011.</p>", ctx);
  12.         return str;
  13. }
复制代码
SpringBoot 应用程序中的基本使用


  • SpringBoot 应用中 : 直接在pom文件中引入依赖
  1. <dependency>
  2.   <groupId>org.springframework.boot</groupId>
  3.   spring-boot-starter-thymeleaf</artifactId>
  4. </dependency>
复制代码
3.png


  • 然后,只要将html文件放入classpath:templates文件下,thymeleaf就能自动完成渲染
例如, Controller 中返回的字符串会直接到该文件夹中找到对应的页面。
4.png


  • 导入Thymeleaf命名空间:在html文件中添加代码:
  1. [/code][size=6]FreeMarker(LGPL => Apache2.0 => MIT) 【不推荐】[/size]
  2. [size=5]简介[/size]
  3. [list]
  4. [*]FreeMarker 是一款 [b]模板引擎[/b]: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个[b]Java类库[/b],是一款程序员可以嵌入他们所开发产品的组件。
  5. [/list][indent]模板编写为 FreeMarker Template Language (FTL)。它是简单的,专用的语言, 不是 像PHP那样成熟的编程语言。
  6. 那就意味着要准备数据在真实编程语言中来显示,比如数据库查询和业务运算, 之后模板显示已经准备好的数据。
  7. 在模板中,你可以专注于如何展现数据, 而在模板之外可以专注于要展示什么数据。
  8. [/indent][align=center] 5.png [/align]
  9. [indent]http://freemarker.foofun.cn/
  10. 这种方式通常被称为 MVC ([b]模型-视图-控制器[/b]) 模式,对于[b]动态网页[/b]来说,是一种[b]特别流行的模式[/b]。
  11. 它帮助从开发人员(Java 程序员)中分离出网页设计师(HTML设计师)。
  12. 设计师无需面对模板中的复杂逻辑, 在没有程序员来修改或重新编译代码时,也可以修改页面的样式。
  13. [/indent]
  14. [list]
  15. [*]而FreeMarker最初的设计,是被用来在MVC模式的Web开发框架中生成HTML页面的,它没有被绑定到 Servlet或HTML或任意Web相关的东西上。它也可以用于非Web应用环境中。
  16. [*]URL
  17. [/list][indent]
  18. [list]
  19. [*]http://freemarker.foofun.cn
  20. [*]https://github.com/freemarker
  21. [/list][indent]https://github.com/freemarker/freemarker-old
  22. https://github.com/freemarker/freemarker3
  23. github star / fork
  24. [/indent][/indent][code][freemarker-old]
  25. 20250528 : 360 star / 126 fork
  26. [freemarker3]
  27. 20250528 : 11 star / 3 fork
复制代码
PS : 从 star 数可大致猜测,这个项目因为盲目废弃了老项目、并新创建了一个不能向下兼容的新项目,导致了这个项目逐渐走向灭亡。
6.png


  • 开源许可协议:


  • https://github.com/freemarker/freemarker3?tab=License-1-ov-file#readme : 基于 MIT 协议

7.png

图: freemarker3


  • https://github.com/freemarker/freemarker-old?tab=License-1-ov-file#readme
FreeMarker 1.x : LGPL
FreeMarker 2.x(2.3.21 +) : Apache 2.0
8.png

9.png

图: freemarker-old
特点


  • 在所有采用网页静态化手段的网站中,FreeMarker使用的比例大大的超过了其他的一些技术。
  • HTML静态化也是某些缓存策略使用的手段,对于系统中频繁使用数据库查询但是内容更新很小的应用,可以使用FreeMarker将HTML静态化。
比如,一些网站的公用设置信息,这些信息基本都是可以通过后台来管理并存储在数据库中,这些信息其实会大量的被前台程序调用,每一次调用都会去查询一次数据库,但是这些信息的更新频率又会很小。
因此,也可以考虑将这部分内容进行后台更新的时候进行静态化,这样就避免了大量的数据库访问请求,提高了网站的性能。


  • 优点


  • 不能轻易突破模板语言开始编写Java代码,因此降低了领域逻辑漏进视图层的危险几率,也提高了网站的性能。


  • 缺点


  • 需要一点附加配置来将其平稳地集成到应用程序中,一些IDE可能并不完全支持它,当然还有开发者或设计者也许需要学习一门陌生的模板语言。
SpringBoot应用程序中的基本使用


  • 引入依赖
  1. <dependency>
  2.     <groupId>org.springframework.boot</groupId>
  3.     spring-boot-starter-freemarker</artifactId>
  4. </dependency>
复制代码

  • 在配置文件中添加FreeMaker的配置如下后就可以使用了
  1. #       设定ftl文件路径
  2. spring.freemarker.tempalte-loader-path=classpath:/templates
  3. #        关闭缓存,及时刷新
  4. spring.freemarker.cache=false
  5. spring.freemarker.charset=UTF-8
  6. spring.freemarker.check-template-location=true
  7. spring.freemarker.content-type=text/html
  8. spring.freemarker.expose-request-attributes=true
  9. spring.freemarker.expose-session-attributes=true
  10. spring.freemarker.request-context-attribute=request#设置FreeMaker文件的后缀
  11. spring.freemarker.suffix=.ftl
复制代码
语法

语法:可以参考API文档
Apache Velocity(Apache 2.0) : 推荐指=8.0/10

简介


  • 项目URL


  • https://velocity.apache.org
  • https://velocity.apache.org/engine/2.4.1/
  • https://github.com/apache/velocity-engine
github star / fork
  1. 20240528 : 386 star / 134 fork
复制代码

  • 开源许可协议 : Apache 2.0
  • Velocity 是一个基于 Java 的模板引擎。它允许任何人使用简单而强大的模板语言来引用 Java 代码中定义的对象。
  • 当 Velocity 用于 Web 开发时,Web 设计人员可以与 Java 程序员并行工作,根据模型-视图-控制器 (MVC) 模型开发网站,这意味着网页设计人员可以只专注于创建看起来不错的网站,而程序员可以只专注于编写一流的代码。Velocity 将 Java 代码与 Web 页面分开,使 Web 站点在其生命周期内更易于维护,并为 Java Server Pages (JSP) 或 PHP 提供了可行的替代方案。
  • Velocity 的功能远远超出了 Web 的领域;例如,它可用于从模板生成 SQL、PostScript 和 XML。它既可以用作生成源代码和报告的独立实用程序,也可以用作其他系统的集成组件。例如,Velocity 为各种 Web 框架提供模板服务,使它们能够使用视图引擎,从而根据真正的 MVC 模型促进 Web 应用程序的开发。
  • Velocity 是 Apache Software Foundation 的一个项目,负责创建和维护与 Apache Velocity 引擎相关的开源软件。
    在 Velocity 项目中创建的所有软件都可以在 Apache 软件许可下免费向公众开放。
特点


  • Velocity是一个基于Java的模板引擎。它允许任何人使用简单但功能强大的模板语言来引用Java代码中定义的对象。
  • 优点:


  • 使用了模板缓冲
模板缓冲机制的作用下,模板不再是每次出现请求的时候从磁盘读取,而是以最理想的方式在内存中保存和解析。
在开发期间,模板缓冲通常处于禁用状态,因为这时请求数量较少,而且要求对页面的修改立即产生效果。
开发完毕之后,模板一般不再改变,此时就可以启用模板缓冲功能。因此,Velocity执行速度明显优于JSP。


  • 缺点:


  • 不是官方标准
  • 用户群体第三方标签库较少,且对JSP标签支持不够好。
JSP 【不推荐】

不推荐的理由:太老了、页面与业务代码的耦合度太高、性能差。
简介


  • 虽然是一款功能比较强大的模板引擎,并被广大开发者熟悉,但它前后端耦合比较高。
比如,前端的html页面还要手动修改成jsp页面,大大加重了工作量,而且动态和静态资源也是耦合性太高。


  • 其次,JSP页面的效率没有HTML高,因为JSP是同步加载,而且JSP需要Tomcat,但又不支持nginx等,已经跟不上时代的潮流
  • 综上:目前开发中已经很少用JSP了,只是我们很多时候会在碰到一些以前的框架里有用到JSP技术,实在感兴趣的朋友可以试一试、体验下。
Jinja2(Apache 2.0) : 推荐指数=7.0/10

简介


  • 项目URL


  • https://github.com/HubSpot/jinjava/
git star / fork
  1. 20250528 : 731 star / 170 fork
复制代码


  • https://www.javadoc.io/doc/com.hubspot.jinjava/jinjava
  • https://jinja.palletsprojects.com/en/3.1.x/ [推荐]
  • http://docs.jinkan.org/docs/jinja2/templates.html [推荐]
  • http://docs.jinkan.org/docs/jinja2/templates.html#for [推荐]
  • https://product.hubspot.com/blog/jinjava-a-jinja-for-your-java


  • 开源许可协议: Apache 2.0
  • 基于 Java 的模板引擎,基于 Python django 模板语法,适用于渲染 jinja 模板(至少是 HubSpot 内容中使用的 jinja 子集)。目前用于生产,在 HubSpot CMS 上呈现数千个网站,每月页面浏览量达数亿次。
注意:需要 Java >= 8。最初从 jangod 分叉而来。
依赖安装
  1. <dependency>
  2.         <groupId>com.hubspot.jinjava</groupId>
  3.         jinjava</artifactId>
  4.         <version>{ LATEST_VERSION }</version>
  5. </dependency>
复制代码
适用场景


  • 适合原来以 Python 语言为主开发语言的工程师/团队


  • Jinja2 是在 Python 领域是最火的模板引擎之一。


  • 不适合需要与 Spring 框架集成,以实现动态网页渲染功能的情况。
Y 推荐文献


  • Java后端模板引擎对比 - Zhihu
  • Java中使用FreeMaker实现模板渲染 - jianshu
  • Java中使用velocity实现模板渲染 - jianshu
  • 使用 Velocity 模板引擎的 Spring Boot 应用 - CSDN
  • Velocity入门到精通(上篇) - CSDN
  • Thymeleaf 3.0教程:13 文本模板模式(一) - 开发学院
X 参考文献


  • 模板引擎总结(Thymeleaf,FreeMarker,Enjoy,Velocity,JSP等)  - 博客园
    本文作者:        千千寰宇   
    本文链接:         https://www.cnblogs.com/johnnyzen   
    关于博文:评论和私信会在第一时间回复,或直接私信我。   
    版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA     许可协议。转载请注明出处!
    日常交流:大数据与软件开发-QQ交流群: 774386015        【入群二维码】参见左下角。您的支持、鼓励是博主技术写作的重要动力!   

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册