[Java/模板渲染引擎/技术选型] 模板引擎-技术调研
概述: 模板渲染引擎 := 模板引擎
为什么要使用【模板(渲染)引擎】?模板(渲染)引擎的作用?
- 模板引擎可以让(网站)程序实现界面与数据分离,业务代码与逻辑代码的分离,大大提升了开发效率,良好的设计也使得代码重用变得更加容易。
- 我们司空见惯的模板安装卸载等概念,基本上都和模板引擎有着千丝万缕的联系。
- 模板引擎不只是可以让你实现代码分离(业务逻辑代码和用户界面代码),也可以实现数据分离(动态数据与静态数据),还可以实现代码单元共享(代码重用),甚至是多语言、动态页面与静态页面自动均衡(SDE)等等与用户界面可能没有关系的功能。
Thymeleaf (Apache 2.0) : 推荐指数=9.0/10
简介
- 项目URL
github star / fork
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值以及内容等
- 判断语句
th:if
th:unless
th:switch
等
- 遍历
th:each
...
可参考下图,如果需要了解更多可以查看对应的API文档
依赖安装
<!-- 方式1 https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-thymeleaf -->
<!--
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
<version>${spring-boot.version}</version>
</dependency>
-->
<!-- 方式2 https://mvnrepository.com/artifact/org.thymeleaf/thymeleaf -->
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf</artifactId>
<version>${thymeleaf.version}</version>
</dependency>
spring-boot.version
: 3.3.5thymeleaf.version
: 3.1.2.RELEASE
Spring MVC 应用程序中的基本使用
- 配置 TemplateResolver
import org.thymeleaf.templateresolver.ITemplateResolver;
import org.thymeleaf.templateresolver.StringTemplateResolver;
@Configuration
public class TemplateResolverConfiguration {
@Bean
public StringTemplateResolver defaultTemplateResolver() {
StringTemplateResolver resolver = new StringTemplateResolver();
templateResolver.setTemplateMode(TemplateMode.HTML);
return resolver;
}
}
- 对 HTTP 接口请求内容的动态渲染
import org.thymeleaf.ITemplateEngine;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import org.thymeleaf.context.WebContext;
@Autowired
private SpringTemplateEngine templateEngine;
@RequestMapping("test")
public String test(){
Context ctx = new Context();
ctx.setVariable("today", "2011-11-11");
String str = templateEngine.process("<p>Today is: <span th:text=\"${today}\">13 february 2011</span>.</p>", ctx);
return str;
}
SpringBoot 应用程序中的基本使用
- SpringBoot 应用中 : 直接在pom文件中引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
- 然后,只要将
html
文件放入classpath:templates
文件下,thymeleaf
就能自动完成渲染
例如, Controller 中返回的字符串会直接到该文件夹中找到对应的页面。
- 导入
Thymeleaf
命名空间:在html
文件中添加代码:
<html lang="en" xmlns:th="http://www.thymeleaf.org">
FreeMarker(LGPL => Apache2.0 => MIT) 【不推荐】
简介
FreeMarker
是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。
模板编写为
FreeMarker Template Language
(FTL
)。它是简单的,专用的语言, 不是 像PHP那样成熟的编程语言。
那就意味着要准备数据在真实编程语言中来显示,比如数据库查询和业务运算, 之后模板显示已经准备好的数据。
在模板中,你可以专注于如何展现数据, 而在模板之外可以专注于要展示什么数据。
http://freemarker.foofun.cn/
这种方式通常被称为MVC
(模型-视图-控制器) 模式,对于动态网页来说,是一种特别流行的模式。
它帮助从开发人员(Java 程序员)中分离出网页设计师(HTML设计师)。
设计师无需面对模板中的复杂逻辑, 在没有程序员来修改或重新编译代码时,也可以修改页面的样式。
而
FreeMarker
最初的设计,是被用来在MVC模式的Web开发框架中生成HTML页面的,它没有被绑定到 Servlet或HTML或任意Web相关的东西上。它也可以用于非Web应用环境中。URL
https://github.com/freemarker/freemarker-old
https://github.com/freemarker/freemarker3
github star / fork
[freemarker-old]
20250528 : 360 star / 126 fork
[freemarker3]
20250528 : 11 star / 3 fork
PS : 从 star 数可大致猜测,这个项目因为盲目废弃了老项目、并新创建了一个不能向下兼容的新项目,导致了这个项目逐渐走向灭亡。
- 开源许可协议:
图: freemarker3
FreeMarker 1.x : LGPL
FreeMarker 2.x(2.3.21 +) : Apache 2.0
图: freemarker-old
特点
- 在所有采用网页静态化手段的网站中,
FreeMarker
使用的比例大大的超过了其他的一些技术。 - HTML静态化也是某些缓存策略使用的手段,对于系统中频繁使用数据库查询但是内容更新很小的应用,可以使用FreeMarker将HTML静态化。
比如,一些网站的公用设置信息,这些信息基本都是可以通过后台来管理并存储在数据库中,这些信息其实会大量的被前台程序调用,每一次调用都会去查询一次数据库,但是这些信息的更新频率又会很小。
因此,也可以考虑将这部分内容进行后台更新的时候进行静态化,这样就避免了大量的数据库访问请求,提高了网站的性能。
- 优点
- 不能轻易突破模板语言开始编写Java代码,因此降低了领域逻辑漏进视图层的危险几率,也提高了网站的性能。
- 缺点
- 需要一点附加配置来将其平稳地集成到应用程序中,一些IDE可能并不完全支持它,当然还有开发者或设计者也许需要学习一门陌生的模板语言。
SpringBoot应用程序中的基本使用
- 引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
- 在配置文件中添加FreeMaker的配置如下后就可以使用了
# 设定ftl文件路径
spring.freemarker.tempalte-loader-path=classpath:/templates
# 关闭缓存,及时刷新
spring.freemarker.cache=false
spring.freemarker.charset=UTF-8
spring.freemarker.check-template-location=true
spring.freemarker.content-type=text/html
spring.freemarker.expose-request-attributes=true
spring.freemarker.expose-session-attributes=true
spring.freemarker.request-context-attribute=request#设置FreeMaker文件的后缀
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
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
git star / fork
20250528 : 731 star / 170 fork
开源许可协议: Apache 2.0
基于 Java 的模板引擎,基于 django 模板语法,适用于渲染 jinja 模板(至少是 HubSpot 内容中使用的 jinja 子集)。目前用于生产,在 HubSpot CMS 上呈现数千个网站,每月页面浏览量达数亿次。
注意:需要 Java >= 8。最初从 jangod 分叉而来。
依赖安装
<dependency>
<groupId>com.hubspot.jinjava</groupId>
<artifactId>jinjava</artifactId>
<version>{ LATEST_VERSION }</version>
</dependency>
适用场景
- 适合原来以 Python 语言为主开发语言的工程师/团队
- Jinja2 在 Python 领域是最火的模板引擎之一。
- 不适合需要与 Spring 框架集成,以实现动态网页渲染功能的情况。
Y 推荐文献
- Java后端模板引擎对比 - Zhihu
- Java中使用FreeMaker实现模板渲染 - jianshu
- Java中使用velocity实现模板渲染 - jianshu
- 使用 Velocity 模板引擎的 Spring Boot 应用 - CSDN
- Velocity入门到精通(上篇) - CSDN
X 参考文献
[Java/模板渲染引擎/技术选型] 模板引擎-技术调研的更多相关文章
- Unity外包团队:关于手机unity游戏开发的技术选型
技术选型 Unity引擎内置了多人联机的解决方案,涵盖了从最底层的网络数据传输,到不同玩家之间的消息发送,再到游戏大厅这样的高级功能.考虑到Unity官方提供的云服务(Internet Service ...
- MQTT 1——物联网集成项目技术选型与说明
最近做的JAVA项目与物联网设备有集成,记录一下从技术选型到实现,整合: 1.通信协议技术选型,MQTT技术介绍2.MQTT服务端安装,客户端测试3.MQTT客户端与Spring MVC整合 1.项目 ...
- jquery jtemplates.js模板渲染引擎的详细用法第三篇
jquery jtemplates.js模板渲染引擎的详细用法第三篇 <span style="font-family:Microsoft YaHei;font-size:14px;& ...
- jquery jtemplates.js模板渲染引擎的详细用法第二篇
jquery jtemplates.js模板渲染引擎的详细用法第二篇 关于jtemplates.js的用法在第一篇中已经讲过了,这里就直接上代码,不同之处是绑定模板的方式,这里讲模板的数据专门写一个t ...
- jquery jtemplates.js模板渲染引擎的详细用法第一篇
jquery jtemplates.js模板渲染引擎的详细用法第一篇 Author:ching Date:2016-06-29 jTemplates是一个基于JQuery的模板引擎插件,功能强大,有了 ...
- 【转帖】技术选型之Docker容器引擎
技术选型之Docker容器引擎 https://segmentfault.com/a/1190000019462392 图过不来的 原作者写的挺好的 题外话 最近对Docker和Kubernetes进 ...
- flask框架下的jinja2模板引擎(3)(模板继承与可以在模板使用的变量、方法)
flask 框架下的jinja2模块引擎(1):https://www.cnblogs.com/chichung/p/9774556.html flask 框架下的jinja2模块引擎(2):http ...
- swig模板引擎和ejs模板引擎
swig模板引擎的基本用法: 1. 变量 {{ name }} //name名前后必须要加空格,不加就会报错 2. 属性 {{ student.name }} 3. 模板继承 swig使用exten ...
- 细说后端模板渲染、客户端渲染、node 中间层、服务器端渲染(ssr)
细说后端模板渲染.客户端渲染.node 中间层.服务器端渲染(ssr) 前端与后端渲染方式的发展大致经历了这样几个阶段:后端模板渲染.客户端渲染.node 中间层.服务器端渲染(ssr). 1. 后端 ...
- Python Web Flask源码解读(三)——模板渲染过程
关于我 一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android.Python.Java和Go,这个也是我们团队的主要技术栈. Github:https:/ ...
随机推荐
- OpenOffice已停更六年 文档基金会呼吁用户迁移LibreOffice
OpenOffice 源代码发布至今已经有 20 年了.文档基金会近日发布公开信,表示说:"LibreOffice 是 OpenOffice 的未来.我们将会全力以赴".以此呼吁那 ...
- 百万架构师第四十五课:并发编程的基础|JavaGuide
课程目标 1. 多线程的发展历史 2. 线程的应用 3. 并发编程的基础 4. 线程安全的问题 特定的指令,计算机不会存储指令,把指令写下来,一次性读取指令,批处理. 然后我们需要把批处理进行隔离.保 ...
- C# .net 压缩文件解压上传及文件压缩下载
using ICSharpCode.SharpZipLib.Zip; using System; using System.Collections.Generic; using System.IO; ...
- MySQL2022.3.2
创建库 CREATE DATABASE STUDENT; 创建表 CREATE TABLE STU(SNO INT PRIMARY KEY,//主键SNM CHAR(2) NOT NULL,//不能为 ...
- 非容器环境中使用Selenium,提升Chrome与ChromeDiver兼容性
背景 在 Windows 环境下使用 Selenium 时,Chrome 浏览器版本与 ChromeDriver 版本的兼容性问题是一个常见的困扰. 由于 Chrome 频繁更新,而 ChromeDr ...
- Gits-命令
Git基础命令 Git是一个分布式版本控制系统,由Linus Torvalds创建,用于有效.高速地处理从小到大的项目版本管理.以下是一些基本的Git命令和概念,它们对于使用Git进行版本控制至关重要 ...
- python 二级 函数与代码复用
- gitee如何删除仓库
进入仓库的管理页面点击删除
- NumPy学习5
今天学习了11, NumPy数组元素增删改查NumPy 数组元素的增删改查操作,主要有以下方法:数组元素操作方法函数名称 描述说明resize 返回指定形状的新数组.append 将元素值添加到数组的 ...
- 冒泡排序(LOW)
博客地址:https://www.cnblogs.com/zylyehuo/ # _*_coding:utf-8_*_ import random def bubble_sort(li): for i ...