利用ThymeLeaf进行页面静态化

1,为什么要页面静态化?
    1,如果页面数据全部经过数据库查询后再渲染,浏览量大的情况下造成数据库压力过大。
    2,每次页面都经过渲染,服务器压力过大,并发能力差。
2,什么是页面静态化
    将动态生成的HTML变为静态内容保存,每次用户访问不在经过页面渲染,直接返回生成好的静态页面,静态资源还可以放到nginx下,减少Tomcat压力。
3,静态化的技
    1,目前页面静态化基本靠模板引擎技术,常见的有  ThymeLeaf ,FreeMaker, VeloCity ,以ThymeLeaf最为常见。。ThymeLeaf除了可以将渲染结果 写入Response,也可以将渲染结果保存到本地。
4,ThymeLeaf的使用
    1,ThymeLeaf有三个重要的概念,,(1)Context,上下文,里面可以保存需要渲染的数据,当模板进行渲染时,模板引擎从上下文中获取数据。 (2)TemplateResolver  模板解析器,,用来读取模板的相关配置,如 模板的位置,模板的类型, 模板的名称等 。 (3) TemplateEngine  模板引擎,负责具体的模板解析。
    2,模板引擎的使用   TemplateEngine.process("模板名",context,writer)    模板名称, 上下文,  输出目的地的流,  在输出时,我们可以指定输出的目的地,如果目的地是Response的流,那就是网络响应。如果目的地是本地文件,那就实现静态化了。  而在SpringBoot中已经自动配置了模板引擎,因此我们不需要关心这个。现在我们做静态化,就是把输出的目的地改成本地文件即可!
 
    代码demo:
Service代码:
@Service
public class GoodsHtmlService {
 
    @Autowired
    private GoodsService goodsService;
 
    @Autowired
    private TemplateEngine templateEngine;
 
    private static final Logger LOGGER = LoggerFactory.getLogger(GoodsHtmlService.class);
 
    /**
     * 创建html页面
     *
     * @param spuId
     * @throws Exception
     */
    public void createHtml(Long spuId) {
 
        PrintWriter writer = null;
        try {
            // 获取页面数据
            Map<String, Object> spuMap = this.goodsService.loadModel(spuId);
 
            // 创建thymeleaf上下文对象
            Context context = new Context();
            // 把数据放入上下文对象
            context.setVariables(spuMap);
 
            // 创建输出流
            File file = new File("C:\\project\\nginx-1.14.0\\html\\item\\" + spuId + ".html");
            writer = new PrintWriter(file);
 
            // 执行页面静态化方法
            templateEngine.process("item", context, writer);
        } catch (Exception e) {
            LOGGER.error("页面静态化出错:{},"+ e, spuId);
        } finally {
            if (writer != null) {
                writer.close();
            }
        }
    }
 
    /**
     * 新建线程处理页面静态化
     * @param spuId
     */
    public void asyncExcute(Long spuId) {
        ThreadUtils.execute(()->createHtml(spuId));
        /*ThreadUtils.execute(new Runnable() {
            @Override
            public void run() {
                createHtml(spuId);
            }
        });*/
    }
}
线程工具类:
public class ThreadUtils {
 
    private static final ExecutorService es = Executors.newFixedThreadPool(10);
 
    public static void execute(Runnable runnable) {
        es.submit(runnable);
    }
}
5,什么时候创建静态文件??
1,进行nginx配置,用户进行页面请求是先在本地查找此静态页面,如果没有静态页面则反向代理到页面请求的Controller中,在Controller方法里查询完数据,将数据放入model后,开启一个线程进行页面静态化。
6,Nginx代理静态文件
Nginx的demo:
server {
    listen       80;
    server_name   www.leyou.com;
 
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 
    location /item {
        # 先找本地
        root html;
        if (!-f $request_filename) { #请求的文件不存在,就反向代理
            proxy_pass http://127.0.0.1:8084;
            break;
        }
    }
 
    location / {
        proxy_pass http://127.0.0.1:9002;
        proxy_connect_timeout 600;
        proxy_read_timeout 600;
    }
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值