利用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;
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.