前置知识
什么是Thymeleaf静态模板引擎?
为什么要做页面静态化?
在生产环境中,业务复杂多变,我们需要保证系统要求高可用,高并发。
如果系统的某一个页面需要返回大量的数据,而且该页面经常被大量请求访问,那么该页面的数据渲染问题就会变成系统性能的短板,同时大量的请求会对数据库造成极大的压力。
这个时候,我们通过后端获取数据,然后响应前端渲染数据的方法就很难解决这个问题。
Redis缓存?
Redis是一款基于缓存的数据库,可以快速地响应大量数据,可以使用Redis作为缓存来响应该页面的数据,保证该页面的访问性能吗?
不行!
因为Redis虽然是基于缓存的,但是它只适用于存放少量数据,如果数据量过大,很容易造成Redis缓存崩溃,然后所有请求打在数据库上,造成数据库宕机。
所以缓存不是万能的。
页面静态化技术
后端访问数据,然后渲染前端的方法会使系统性能下降,那么我们就可以使用页面静态化技术,就是将动态生成的HTML文件,变成一个静态的HTML文件保存起来,然后让用户访问这个静态页面。
这样就省去了系统请求后端的和前端渲染数据的时间,大大提高了系统的访问效率。
怎么实现页面静态化?
目前,静态化页面都是通过模板引擎来生成,常用的模板引擎有:
- Freemarker
- Velocity
- Thymeleaf
Thymeleaf静态化技术
准备工作
该项目的环境搭建,Thymeleaf前端页面渲染,都已经在Thymeleaf静态模板引擎中准备好了。
编写Service层代码
我们将页面静态化的代码逻辑放在Service层。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| @Service public class ThymeleafService {
@Autowired private TemplateEngine templateEngine;
public void createHtml() throws FileNotFoundException { User user = new User(1,"张三",20); Context context = new Context(); context.setVariable("user",user); context.setVariable("msg","Hello, Thymeleaf!"); PrintWriter writer = new PrintWriter(new File("G:\\temp\\html\\"+user.getId()+".html")); templateEngine.process("hello",context,writer); } }
|
编写Web层代码
我们修改Web的代码逻辑,增加页面静态化的方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| @Controller @RequestMapping("user") public class UserController {
@Autowired private ThymeleafService thymeleafService;
@GetMapping("hello") public String hello(Model model) throws FileNotFoundException { User user = new User(1,"张三",20); model.addAttribute("user",user); model.addAttribute("msg", "Hello, Thymeleaf!"); thymeleafService.createHtml(); return "hello"; } }
|
功能测试
启动项目,访问/user/hello
接口,我们就发现在G:\temp\html
目录下生成了一个1.html
文件。
hello.html模板文件
1 2 3 4 5 6 7 8 9 10 11
| <!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Hello页面</title> </head> <body> <h1 th:text="${user.name}"></h1> <h1 th:text="${msg}"></h1> </body> </html>
|
1.html静态页面文件
1 2 3 4 5 6 7 8 9 10 11
| <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Hello页面</title> </head> <body> <h1>张三</h1> <h1>Hello, Thymeleaf!</h1> </body> </html>
|