利用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;
    }
}
發佈了142 篇原創文章 · 獲贊 10 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章