目录
为啥要静态化
对于电商网站来说,商品页面每时每刻都会有大量的用户流量,每个用户在当前浏览的页面就可能会有几十张图片,而且经常会需要动态加载,所以我们就想用静态化提高页面访问速度。
那用什么工具呢?localstorge不合理,存的东西太小了,redis也不合理,即使是30G的redis都可能被撑到满负荷,在springboot和springcloud项目中,使用thymeleaf是一个非常好的选择,我们把页面转换为静态html保存到服务器的硬盘中。
Thymeleaf的重要概念
-
Context:运行上下文
用来保存模型数据,当模板引擎渲染时,可以从Context上下文中获取数据用于渲染。当与SpringBoot结合使用时,我们放入Model的数据就会被处理到Context,作为模板渲染的数据使用
-
TemplateResolver:模板解析器
当与SpringBoot结合时,TemplateResolver已经由其创建完成,并且各种配置也都有默认值,比如模板存放位置,其默认值就是:templates。比如模板文件类型,其默认值就是html
-
TemplateEngine:模板引擎
用来解析模板的引擎,需要使用到上下文、模板解析器。分别从两者中获取模板中需要的数据,模板文件。然后利用内置的语法规则解析,从而输出解析后的文件。来看下模板引擎进行处理的函数
实现页面静态化
1.新建一个Service
在service里我们配置静态化的方法,以及声明静态化文件保存的位置
代码如下
package com.leyou.goods.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
@Service
public class GoodsHtmlService {
@Autowired
private TemplateEngine engine;
@Autowired
private GoodsService goodsService;
public void createHtml(Long spuId){
//初始化运行上下文
Context context = new Context();
//设置数据模型
context.setVariables(this.goodsService.loadData(spuId));
PrintWriter printWriter = null;
try {
//把静态文件生成到服务器本地
File file = new File("G:\\software\\nginx\\nginx-1.14.0\\html\\item\\" + spuId + ".html");
printWriter = new PrintWriter(file);
this.engine.process("item", context, printWriter);
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if(printWriter != null) {
printWriter.close();
}
}
}
}
2.调用静态化HTML页面的方法
正常执行代码时,你在哪一步需要执行刚才写的静态化方法呢?例如我在页面加载完成时,要执行一个静态化本地页面的方法,我把方法写在这里
3.配置nginx
首先我们要在nginx的html文件夹中在新建一个子目录,就叫他item吧,这里面放页面加载时持久化到本地的html页面
然后我们打开nginx.conf,在里面修改配置。这里设置的意思是,只要我们访问item路径下,nginx就先查询本地文件夹中是否有持久化好的html页面,如果有则调用,如果没有再去执行项目中的方法。
4.重启
重启nginx
nginx -s reload
重新启动java项目
5.查看效果
访问指定的页面
可以看到当我们第一次访问成功后,在nginx的html文件夹中已经持久化了这一个html网页