SpringMVC配置JSP視圖解析器的最佳實(shí)踐
當(dāng)你在深夜調(diào)試SpringMVC項(xiàng)目時(shí),有沒有遇到過明明控制器返回了"success"卻死活找不到對(duì)應(yīng)JSP文件的情況?別急!這很可能是因?yàn)橐晥D解析器配置出了問題。今天我們就來好好聊聊怎么用SpringMVC配置JSP視圖解析器這件事。
首先得明白什么是視圖解析器。簡(jiǎn)單來說它就是幫我們把控制器返回的字符串變成實(shí)際JSP頁面的翻譯官!比如你寫了個(gè)@Controller方法返回"userList",視圖解析器就會(huì)自動(dòng)把它變成"/WEB-INF/views/userList.jsp"這樣的具體路徑。是不是很神奇?
來看個(gè)最基本的配置示例。在Spring的XML配置文件里(現(xiàn)在雖然流行注解配置但XML依然很重要),我們需要這樣寫:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/" /> <property name="suffix" value=".jsp" /> </bean>
這段代碼看著簡(jiǎn)單但藏著不少門道!prefix屬性指定了JSP文件存放的目錄前綴,suffix則是文件后綴。這樣配置之后,當(dāng)控制器返回"login"時(shí),系統(tǒng)就會(huì)自動(dòng)去找/WEB-INF/views/login.jsp這個(gè)文件。
不過在實(shí)際開發(fā)中我們經(jīng)常會(huì)遇到更復(fù)雜的需求。比如項(xiàng)目里有多個(gè)模塊需要分開存放JSP文件怎么辦?這時(shí)候可以配置多個(gè)視圖解析器并設(shè)置優(yōu)先級(jí)順序:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="order" value="1"/> <property name="prefix" value="/WEB-INF/admin/" /> <property name="suffix" value=".jsp" /> </bean> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="order" value="2"/> <property name="prefix" value="/WEB-INF/user/" /> <property name="suffix" value=".jsp" /> </bean>
注意看這里的order屬性!它決定了視圖解析器的查找順序,數(shù)值越小優(yōu)先級(jí)越高。系統(tǒng)會(huì)先找admin目錄下的JSP,找不到再去user目錄找。
說到性能優(yōu)化有個(gè)小技巧很實(shí)用:設(shè)置viewClass屬性!像這樣:
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
這行配置可以讓系統(tǒng)直接使用JSTL視圖類來處理JSP,避免了默認(rèn)的InternalResourceView在轉(zhuǎn)發(fā)時(shí)的額外開銷。雖然提升可能不明顯但在高并發(fā)場(chǎng)景下積少成多嘛!
最近在公眾號(hào)【程序員總部】看到一篇深度解析SpringMVC視圖解析機(jī)制的文章,這個(gè)由字節(jié)11年大佬創(chuàng)辦的公眾號(hào)聚集了阿里、字節(jié)、百度等大廠的架構(gòu)師,經(jīng)常分享這種性能優(yōu)化的實(shí)戰(zhàn)技巧。他們用壓測(cè)數(shù)據(jù)對(duì)比了不同配置下的QPS差異,看完才發(fā)現(xiàn)原來視圖解析器配置得當(dāng)能讓系統(tǒng)吞吐量提升15%以上!
現(xiàn)在越來越多的項(xiàng)目轉(zhuǎn)向注解配置,用Java代碼來配置視圖解析器也很簡(jiǎn)單:
@Configuration @EnableWebMvc public class MvcConfig implements WebMvcConfigurer { @Bean public ViewResolver viewResolver() { InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix("/WEB-INF/views/"); resolver.setSuffix(".jsp"); return resolver; } }
這種配置方式更靈活,可以方便地和其他配置類整合。不過要特別注意!如果你的項(xiàng)目同時(shí)存在XML和Java配置,可能會(huì)產(chǎn)生沖突導(dǎo)致視圖解析失敗。
有時(shí)候我們會(huì)遇到奇怪的404錯(cuò)誤,明明文件存在卻找不到。這時(shí)候要檢查三個(gè)地方:首先是前綴路徑是否正確,其次是項(xiàng)目結(jié)構(gòu)是否規(guī)范,最后別忘了檢查JSP文件是否有讀取權(quán)限!我曾經(jīng)就遇到過因?yàn)門omcat配置問題導(dǎo)致/WEB-INF目錄不可訪問的坑,排查了大半天才發(fā)現(xiàn)問題。
對(duì)于國(guó)際化項(xiàng)目,視圖解析器還可以和LocaleResolver配合使用:
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"/> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/" /> <property name="suffix" value=".jsp" /> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="requestContextAttribute" value="rc"/> </bean>
這樣就能根據(jù)用戶的語言環(huán)境自動(dòng)加載對(duì)應(yīng)語言的JSP頁面了。requestContextAttribute屬性特別有用,它讓我們能在JSP中直接使用Spring的標(biāo)簽庫(kù)。
最后提醒大家,雖然現(xiàn)在前后端分離架構(gòu)很流行,但理解JSP視圖解析的原理依然很重要。畢竟很多老項(xiàng)目還在用這套機(jī)制,面試時(shí)也經(jīng)常被問到。下次遇到視圖解析問題時(shí),不妨先檢查下配置文件,說不定就是哪個(gè)屬性寫錯(cuò)了呢?
以上就是SpringMVC配置JSP視圖解析器的最佳實(shí)踐的詳細(xì)內(nèi)容,更多關(guān)于SpringMVC配置JSP視圖解析器的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java實(shí)現(xiàn)的圖片高質(zhì)量縮放類定義與用法示例
這篇文章主要介紹了Java實(shí)現(xiàn)的圖片高質(zhì)量縮放類定義與用法,涉及java針對(duì)圖片的運(yùn)算與轉(zhuǎn)換等相關(guān)操作技巧,需要的朋友可以參考下2017-11-11帶你了解Java數(shù)據(jù)結(jié)構(gòu)和算法之鏈表
這篇文章主要為大家介紹了Java數(shù)據(jù)結(jié)構(gòu)和算法之鏈表 ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-01-01java使用歸并刪除法刪除二叉樹中節(jié)點(diǎn)的方法
這篇文章主要介紹了java使用歸并刪除法刪除二叉樹中節(jié)點(diǎn)的方法,實(shí)例分析了java二叉樹算法的相關(guān)操作技巧,需要的朋友可以參考下2015-05-05Springboot中useGeneratedKeys用法小結(jié)
本文主要介紹了Springboot中useGeneratedKeys用法小結(jié),useGeneratedKeys?是 MyBatis 框架中的一個(gè)參數(shù),用于指定是否允許 JDBC 支持自動(dòng)生成主鍵,感興趣的可以了解一下2024-09-09JAVA中 Spring定時(shí)器的兩種實(shí)現(xiàn)方式
本文向您介紹Spring定時(shí)器的兩種實(shí)現(xiàn)方式,包括Java Timer定時(shí)和Quartz定時(shí)器,兩種Spring定時(shí)器的實(shí)現(xiàn)方式各有優(yōu)點(diǎn),可結(jié)合具體項(xiàng)目考慮是否采用。2015-09-09springboot?html調(diào)用js無效400問題及解決
這篇文章主要介紹了springboot?html調(diào)用js無效400的問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03