SpringMVC配置JSP視圖解析器的最佳實(shí)踐
當(dāng)你在深夜調(diào)試SpringMVC項(xiàng)目時(shí),有沒(méi)有遇到過(guò)明明控制器返回了"success"卻死活找不到對(duì)應(yīng)JSP文件的情況?別急!這很可能是因?yàn)橐晥D解析器配置出了問(wèn)題。今天我們就來(lái)好好聊聊怎么用SpringMVC配置JSP視圖解析器這件事。
首先得明白什么是視圖解析器。簡(jiǎn)單來(lái)說(shuō)它就是幫我們把控制器返回的字符串變成實(shí)際JSP頁(yè)面的翻譯官!比如你寫(xiě)了個(gè)@Controller方法返回"userList",視圖解析器就會(huì)自動(dòng)把它變成"/WEB-INF/views/userList.jsp"這樣的具體路徑。是不是很神奇?
來(lái)看個(gè)最基本的配置示例。在Spring的XML配置文件里(現(xiàn)在雖然流行注解配置但XML依然很重要),我們需要這樣寫(xiě):
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
這段代碼看著簡(jiǎn)單但藏著不少門(mén)道!prefix屬性指定了JSP文件存放的目錄前綴,suffix則是文件后綴。這樣配置之后,當(dāng)控制器返回"login"時(shí),系統(tǒng)就會(huì)自動(dòng)去找/WEB-INF/views/login.jsp這個(gè)文件。
不過(guò)在實(shí)際開(kāi)發(fā)中我們經(jīng)常會(huì)遇到更復(fù)雜的需求。比如項(xiàng)目里有多個(gè)模塊需要分開(kāi)存放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目錄找。
說(shuō)到性能優(yōu)化有個(gè)小技巧很實(shí)用:設(shè)置viewClass屬性!像這樣:
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
這行配置可以讓系統(tǒng)直接使用JSTL視圖類(lèi)來(lái)處理JSP,避免了默認(rèn)的InternalResourceView在轉(zhuǎn)發(fā)時(shí)的額外開(kāi)銷(xiāo)。雖然提升可能不明顯但在高并發(fā)場(chǎng)景下積少成多嘛!
最近在公眾號(hào)【程序員總部】看到一篇深度解析SpringMVC視圖解析機(jī)制的文章,這個(gè)由字節(jié)11年大佬創(chuàng)辦的公眾號(hào)聚集了阿里、字節(jié)、百度等大廠(chǎng)的架構(gòu)師,經(jīng)常分享這種性能優(yōu)化的實(shí)戰(zhàn)技巧。他們用壓測(cè)數(shù)據(jù)對(duì)比了不同配置下的QPS差異,看完才發(fā)現(xiàn)原來(lái)視圖解析器配置得當(dāng)能讓系統(tǒng)吞吐量提升15%以上!
現(xiàn)在越來(lái)越多的項(xiàng)目轉(zhuǎn)向注解配置,用Java代碼來(lái)配置視圖解析器也很簡(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;
}
}
這種配置方式更靈活,可以方便地和其他配置類(lèi)整合。不過(guò)要特別注意!如果你的項(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)就遇到過(guò)因?yàn)門(mén)omcat配置問(wèn)題導(dǎo)致/WEB-INF目錄不可訪(fǎng)問(wèn)的坑,排查了大半天才發(fā)現(xiàn)問(wè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ù)用戶(hù)的語(yǔ)言環(huán)境自動(dòng)加載對(duì)應(yīng)語(yǔ)言的JSP頁(yè)面了。requestContextAttribute屬性特別有用,它讓我們能在JSP中直接使用Spring的標(biāo)簽庫(kù)。
最后提醒大家,雖然現(xiàn)在前后端分離架構(gòu)很流行,但理解JSP視圖解析的原理依然很重要。畢竟很多老項(xiàng)目還在用這套機(jī)制,面試時(shí)也經(jīng)常被問(wèn)到。下次遇到視圖解析問(wèn)題時(shí),不妨先檢查下配置文件,說(shuō)不定就是哪個(gè)屬性寫(xiě)錯(cuò)了呢?
以上就是SpringMVC配置JSP視圖解析器的最佳實(shí)踐的詳細(xì)內(nèi)容,更多關(guān)于SpringMVC配置JSP視圖解析器的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java使用dom4j解析xml配置文件實(shí)現(xiàn)抽象工廠(chǎng)反射示例
本文主要介紹了java使用dom4j讀取配置文件實(shí)現(xiàn)抽象工廠(chǎng)和反射的示例,在Java中也可以同Donet一樣,將差異配置在配置文件里面。另外,我們采用下面的方式實(shí)現(xiàn),將會(huì)更加便捷2014-01-01
java jdk1.8 使用stream流進(jìn)行l(wèi)ist 分組歸類(lèi)操作
這篇文章主要介紹了java jdk1.8 使用stream流進(jìn)行l(wèi)ist 分組歸類(lèi)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-10-10
System.identityHashCode和hashCode的區(qū)別及說(shuō)明
String調(diào)用hashCode()和System.identityHashCode()返回值不同是因?yàn)镾tring重寫(xiě)了hashCode()方法,而System.identityHashCode()返回對(duì)象的內(nèi)存地址哈希值;Test調(diào)用兩個(gè)方法返回值相同是因?yàn)門(mén)est沒(méi)有重寫(xiě)hashCode()方法,因此兩者調(diào)用底層的JVM_IHashCode方法返回相同值2024-11-11
mybatis?一對(duì)多映射?column屬性的注意事項(xiàng)說(shuō)明
這篇文章主要介紹了mybatis?一對(duì)多映射?column屬性的注意事項(xiàng)說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。2022-01-01
解決Spring Batch框架job任務(wù)只跑一次的問(wèn)題
這篇文章主要介紹了解決Spring Batch框架job任務(wù)只跑一次的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09

