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