分布式技术 Thymeleaf 页面静态化

Thymeleaf

什么是 Thymeleaf

Thymeleaf 是一个适用于 Web 和独立环境的现代服务器端 Java 模板引擎。

Thymeleaf 的主要目标是将优雅的自然模板带到开发工作流程中,并将 HTML 在浏览器中正确显示,并且可以作为静态原型,让开发团队能更容易地协作。

Thymeleaf 也是 Spring 官方推荐的模板引擎。

本篇内容主要讲解页面静态化,关于 Thymeleaf 语法,大家可以去官方文档去学习。Thymeleaf 官方文档

什么是静态化

静态化是指把动态生成的 HTML 页面变为静态内容保存,以后用户的请求到来,直接访问静态页面,不再经过服务的渲染。而静态的 HTML 页面可以部署在 Nginx 中,从而大大提高并发能力,减小 Tomcat 压力。

为什么要静态化

我们的页面是通过 Thymeleaf 模板引擎渲染后返回到客户端。在后台需要大量的数据查询,而后渲染得到 HTML 页面。会对数据库造成压力,并且请求的响应时间过长,并发能力不高

如何实现静态化

静态化页面都是通过模板引擎来生成,而后保存到 Nginx 服务器来部署。

常用的模板引擎:

  • Thymeleaf
  • Freemarker
  • Velocity

Thymeleaf 实现静态化

Thymeleaf 中的几个概念:

  • Context:运行上下文
  • TemplateResolver:模板解析器
  • TemplateEngine:模板引擎

Context

上下文: 用来保存模型数据,当模板引擎渲染时,可以从 Context 上下文中获取数据用于渲染。

当与 SpringBoot 结合使用时,我们放入 Model 的数据就会被处理到 Context,作为模板渲染的数据使用。

TemplateResolver

模板解析器:用来读取模板相关的配置,例如:模板存放的位置信息,模板文件名称,模板文件的类型等等。

当与 SpringBoot 结合时,TemplateResolver 已经由其创建完成,并且各种配置也都有默认值,比如模板存放位置,其默认值就是:templates。比如模板文件类型,其默认值就是html。

TemplateEngine

模板引擎:用来解析模板的引擎,需要使用到上下文、模板解析器。分别从两者中获取模板中需要的数据,模板文件。然后利用内置的语法规则解析,从而输出解析后的文件。来看下模板引擎进行处理的函数:

1
templateEngine.process("模板名", context, writer);

三个参数:

  • 模板名称
  • 上下文:里面包含模型数据
  • writer:输出目的地的流

在输出时,我们可以指定输出的目的地,如果目的地是 Response 的流,那就是网络响应。如果目的地是本地文件,那就实现静态化了。

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package com.javakz.backyardv2.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class TemplateUtil {
private final static Logger LOG = LoggerFactory.getLogger(TemplateUtil.class);


@Autowired
public static TemplateEngine templateEngine;

@Autowired
public static final TemplateEngine engine = SpringUtil.getBean(TemplateEngine.class);

/**
* 生成静态文件
* @param freeTempName 模板名称
* @param context 数据内容
* @param outFilePath 输出路径
* @return
*/
public static boolean process(String freeTempName, Context context, String outFilePath) {
File file = new File(outFilePath);
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
try (FileWriter fileWriter = new FileWriter(file)) {
engine.process(freeTempName, context,fileWriter);
} catch (IOException e) {
LOG.error("{},静态化IO异常:{}", freeTempName, e);
return false;
}
return true;
}

public static void main(String[] args) {
String url = "D:/app/";
Context context = new Context();
context.setVariable("title", "world");
TemplateUtil.process("404.html", context, url+"test.html");
}
}

🐼 您的支持将鼓励我继续创作 🐼
0%