thymeleaf手動渲染@{}的問題與解決
一、簡介
最近寫了一個專案,然後想利用TemplateEngine實現thymeleaf的手動渲染,將生成的html頁面加入Redis快取,提高專案訪問速度。
二、SpringBoot 1.x實現
以前使用的maven版本如下所示:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
</parent>
<!-- SpringMVC -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- thymeleaf -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
可以看出是springboot1.x版本。
附上該版本thymeleaf手動渲染的實現。
@RequestMapping(value = "/to_list", produces = "text/html")
@ResponseBody
public String toGoods(Model model, MiaoshaUser user,
final HttpServletRequest request,
final HttpServletResponse response) {
//取快取
String html;
html = redisService.get(GoodsKey.getGoodsList(), "", String.class);
if (html != null) {//如果快取有這個頁面
return html;
} else {//如果沒有這個頁面
//訪問資料庫獲取商品資料
List<GoodsVo> goodsList = goodsService.listGoodsVo();
if (user != null) {
//如果有使用者資訊,則儲存在Model中
model.addAttribute("user", user);
}
//將商品資料儲存在Model中
model.addAttribute("goodsList", goodsList);
//手動渲染
SpringWebContext springWebContext = new SpringWebContext(request, response, request.getServletContext(), request.getLocale(), model.asMap(), context);
html = viewResolver.getTemplateEngine().process("goods_list", springWebContext);
if (!StringUtils.isEmpty(html)) {
//儲存到快取
redisService.set(GoodsKey.getGoodsList(), "", html);
}
//返回到瀏覽器
return html;
}
}
需要依賴兩個類:ThymeleafViewResolver以及ApplicationContext
這兩個類都可以通過Spring容器注入進去,如下所示:
@Autowired
private ThymeleafViewResolver viewResolver;
@Autowired
private ApplicationContext context;
將上面手動渲染流程程式碼抽離出來,使用模版如下:
//首先建立一個上下文容器,context是Spring的ApplicationContext
SpringWebContext springWebContext = new SpringWebContext(request, response, request.getServletContext(), request.getLocale(), model.asMap(), context);
//獲取模版引擎,進行使用process方法解析
//第一個引數"goods_list"指需要解析的thymeleaf模版,一般在template目錄下
//第二個引數就是上下文容器
html = viewResolver.getTemplateEngine().process("goods_list", springWebContext);
if (!StringUtils.isEmpty(html)) {
//儲存到快取
redisService.set(GoodsKey.getGoodsList(), "", html);
}
//返回到瀏覽器
return html;
三、Springboot 2.x實現
pom.xml如下所示:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.17.RELEASE</version>
</parent>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
首先如果直接使用上面的方式,會發現找不到SpringWebContext這個類,這個類是Spring4下的,在Spring5如移除掉了。
那麼我們可以使用其他的類進行代替。
1. 第一個是Context
這個是很多博主使用的方式,我最初也採用了這種,這種文章比較多,博主就不再演示了。
當頁面在渲染@{}標籤時,就會報錯,如下所示:
Caused by: org.attoparser.ParseException: Link base “/css/global.css” cannot be context relative (/…) unless the context used for executing the engine implements the org.thymeleaf.context.IWebContext interface (template: “/mail/activation” - line 6, col 25)
Caused by: org.thymeleaf.exceptions.TemplateProcessingException: Link base “/css/global.css” cannot be context relative (/…) unless the context used for executing the engine implements the org.thymeleaf.context.IWebContext interface (template: “/mail/activation” - line 6, col 25)
這個是因為沒有使用IWebContext 的介面容器所導致
2. 第二個是WebContext類
使用方式如下:
IWebContext webContext = new WebContext(request,response,request.getServletContext(),response.getLocale(),model.asMap());
String cacheHtml = templateEngine.process("/index", webContext);
此時就不會報錯,相比Spring4或者Springboot1.x而言,剔除了ApplicationContext 過多的依賴,現在thymeleaf渲染不再過多依賴spring容器
相關文章
- 資料變動與渲染問題
- 解決vue的component標籤渲染問題的方法Vue
- vue渲染時閃爍{{}}的問題及解決方法Vue
- @AllArgsConstructor與@Value共用的問題解決Struct
- 解決訪問Github與clone很慢的問題Github
- 解決訪問 GitHub 與 clone 很慢的問題Github
- 手動下載 Chrome,解決 puppeteer 無法使用問題Chrome
- 磁碟問題定位與解決
- 解決“阻塞效應”-解決指令碼檔案下載阻塞網頁渲染的問題指令碼網頁
- 解決叢集 Yellow 與 Red 的問題
- Bigkey問題的解決思路與方式探索
- SceneKit-解決模型重疊時渲染畫面閃爍的問題模型
- 從“股票問題”談動態規劃問題的解決思路動態規劃
- vue預渲染prerender-spa-plugin解決首屏白屏問題VuePlugin
- 解決ajax中ie快取問題(手動新增時間戳)快取時間戳
- Django在Linux上uwsgi 與nginx的問題與解決DjangoLinuxNginx
- 快取穿透問題與解決方法快取穿透
- 解決 Unexpectedlexicaldeclarationincaseblock的問題BloC
- 解決移動端複製問題
- mongodb啟動失敗問題解決MongoDB
- 解決ASM無法啟動問題ASM
- hbase啟動失敗問題解決
- 移動端滾動穿透問題解決方案穿透
- Wampserver圖示是橙色的【問題與解決方案】Server
- Java 8 的日期與時間問題解決方案Java
- Redis 大key(bigkey)問題的排查與解決方案Redis
- Go 模組存在的意義與解決的問題Go
- 解決移動裝置上iframe滾動條的問題
- 【前端詞典】滾動穿透問題的解決方案前端穿透
- 適配移動端的問題以及解決方案
- Spring Boot幾種啟動問題的解決方案Spring Boot
- div拖動遇到iframe卡頓的問題解決
- 解決 Ubuntu 在啟動時凍結的問題Ubuntu
- 解決MMM啟動監控報錯的問題
- SpringBoot之整合thymeleaf渲染Web頁面Spring BootWeb
- Ajax跨越問題原因分析與解決思路
- java學習中問題與解決方式Java
- 解決vue移動端適配問題Vue