這篇文章將為大家詳細講解有關(guān)SpringBoot能否同時支持多個視圖解析器jsp+html+其他模版引擎,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)建站!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、微信小程序開發(fā)、集團企業(yè)網(wǎng)站建設(shè)等服務(wù)項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了陽高免費建站歡迎大家使用!
SpringBoot同時支持多個視圖解析器jsp+html+其他模版引擎!
有一個不算老的項目,經(jīng)歷過幾波人迭代,源碼維護的一塌糊涂。視圖這一塊,用的有 jsp,html,freemarker 等。視圖不統(tǒng)一,導(dǎo)致啟用 html 后,就不能訪問 jsp 和 freemarker。這些具備互斥的因素,導(dǎo)致項目跑了 3 個,通過 Nginx 來適配。
今天,我給大家分享一種辦法,讓 SpringBoot 項目,同時支持多種模版引擎。
先說一下,這里沒有新技術(shù),新發(fā)明。只是根據(jù) WebMvc 視圖解析器的原理進行略微的改造。
我們都知道,在 SpringMVC 中有 3 個主要的類:DispatherServlet(前端控制器)、ViewResolver(視圖解析器)、View(視圖類)。
下面是一個簡單的視圖解析的流程。
由圖可知,如果我們要支持多個視圖,就需要配置多個視圖解析器。比如:ThymeleafViewResolver、InternalResourceViewResolver(系統(tǒng)默認實現(xiàn))、ContentNegotiatingViewResolver、BeanNameViewResolver等。
DispatcherServlet 在選擇視圖解析器的時候,以優(yōu)先級為處理原則,此優(yōu)先級是根據(jù)該 ViewResolver 實現(xiàn) Ordered 接口或者使用 @Order 注解賦值,數(shù)字最小優(yōu)先級越高為原則。
然后對應(yīng)視圖解析器會返回一個具體的 View 類。最終通過3、4步驟渲染成 HTML 或者是 XML 等視圖內(nèi)容。
下圖就是具體的排序方法,viewResolvers 是一個 List 集合。
排完序后,匹配 View 對象的方法,遍歷 viewResolvers,匹配到第一個 View 對象,則返回。
因此,當配置多個視圖,需要同時支持多個視圖時,就會發(fā)生一些 404(當我們配置多個視圖解析器時,出現(xiàn)只支持一種視圖解析器器,其他類型產(chǎn)生 404)。
以 ThymeleafViewResolver 為例,在 ThymeleafAutoConfiguration 中,可以看到它的 Order 為 Ordered.LOWEST_PRECEDENCE - 5。
而 SpringBoot 自動注入的 InternalResourceViewResolver 的優(yōu)先級為最低級。
注意:這里指的是自動注入,就是在我們不經(jīng)過任何改造的情況下,是屬于最低級的。
@Bean
public InternalResourceViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/");
viewResolver.setSuffix(".jsp");
viewResolver.setOrder(0);
viewResolver.setContentType("text/html;charset=UTF-8");
return viewResolver;
}
由于,匹配到一個 View 對象,就立即返回。導(dǎo)致你不管配置了多少個視圖解析器,返回的 View 可能都不是正確的,這就導(dǎo)致了 404 的出現(xiàn)。
那么有沒有可能動態(tài)的調(diào)整排序,或者動態(tài)的指定視圖解析器就成了關(guān)鍵。好在,SpringMVC 給我們留下了口子。我們只需要間的重寫一個 InternalResourceView 即可。
public class HandleResourceViewExists extends InternalResourceView {
@Override
public boolean checkResource(Locale locale) {
File file = new File(this.getServletContext().getRealPath("/") + getUrl());
//判斷頁面是否存在
return file.exists();
}
}
通過上面的代碼,我們先檢查一下對應(yīng)的模版文件是否存在。然后通過下面的代碼,動態(tài)的調(diào)整視圖解析器。
@Bean
public InternalResourceViewResolver htmlViewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix("/");
//設(shè)置檢查器
viewResolver.setViewClass(HandleResourceViewExists.class);
viewResolver.setSuffix(".html");
viewResolver.setOrder(0);
viewResolver.setContentType("text/html;charset=UTF-8");
return viewResolver;
}
@Bean
public InternalResourceViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
//設(shè)置檢查器
viewResolver.setViewClass(HandleResourceViewExists.class);
viewResolver.setPrefix("/WEB-INF/");
viewResolver.setSuffix(".jsp");
viewResolver.setOrder(0);
viewResolver.setContentType("text/html;charset=UTF-8");
return viewResolver;
}
這里給大家提供了一個思路,如果通過調(diào)試代碼,發(fā)現(xiàn)問題,解決問題。
關(guān)于SpringBoot能否同時支持多個視圖解析器jsp+html+其他模版引擎就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
本文名稱:SpringBoot能否同時支持多個視圖解析器jsp+html+其他模版引擎
標題鏈接:http://chinadenli.net/article6/ppcsog.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、關(guān)鍵詞優(yōu)化、小程序開發(fā)、網(wǎng)站策劃、外貿(mào)網(wǎng)站建設(shè)、面包屑導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)