在商城平台门户网站中,商品详情浏览量比较大,并发高,我们会独立开启一个微服务,用来展示商品详情,同时将商品详情页面静态化,减轻服务器运行压力,并且提升响应效率。如jd商品详情就是静态页面:
Thymeleaf简单使用
1、引入依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
2、application.yml:
spring:
thymeleaf:
cache: false
3、准备一个商品详情页面模板到当前项目resource目录下的templates中
4、Thymeleaf语法:
<div class="crumb-wrap">
<ul class="sui-breadcrumb">
<li th:each="category : ${categories}">//th:each:遍历
<a href="#" th:text="${category.name}">手机</a>
</li>
<li>
<a href="#" th:text="${brand.name}">Apple</a>
</li>
<li class="active" th:text="${spu.title}">Apple iPhone 6s</li>
</ul>
</div>
<script th:inline="javascript">
const a = /*[[${a}]]*/ [];//意思是有模型数据a则赋值a,否则为空数组
</script>
idea开发时防止idea不识别thymeleaf指令:
<html xmlns:th="http://www.thymeleaf.org">
建议只用Thymeleaf语法赋值,渲染仍然使用vue语法,降低学习成本
5、Thymeleaf将页面静态化(建议交给线程池异步进行)
service:
@Async
//此注解表示该方法异步执行,如果配置了线程池会自动将任务交给线程池
//参数map为模型数据,id用于生成静态页面时作为文件名
public void buildStaticHtml(Map<String, Object> map, Long id) {
//通过thymeleaf创建静态页面
Context context = new Context();
context.setVariables(map);
String folder = "D:\\ide\\nginx-1.17.6\\html\\item\\";
File file = new File(folder);
if (!file.exists()) {
file.mkdirs();
}
//jdk1.8新语法,会自动finally关闭流
try(FileWriter writer = new FileWriter(folder + id + ".html")) {
//模板+模型数据=输出
templateEngine.process("模板名", context, writer);
} catch (IOException e) {
e.printStackTrace();
}
}
注意:controller如果要返回加载了模型数据的模板页面,则不能是RestFul风格,否则只会返回字符串
接下来,我们修改nginx,让它对商品请求进行监听,指向本地静态页面,如果本地没找到,才进行反向代理:
location /item {
# 先找本地
root html;
if (!-f $request_filename) { #请求的文件不存在,就反向代理
proxy_pass http://127.0.0.1:8084;
break;
}
}