摘要: 提供根據(jù)請(qǐng)求URL路徑直接轉(zhuǎn)化為邏輯視圖名的支持基類褒繁,即不需要功能處理,直接根據(jù)URL計(jì)算出邏輯視圖名付鹿,并選擇具體視圖進(jìn)行展示: urlDecode:是否進(jìn)行url解碼澜汤,不指定則默認(rèn)使用服務(wù)器編碼進(jìn)行解碼(如Tomcat默認(rèn)ISO-8859-1); urlPathHelper:用于解析請(qǐng)求路徑的工具類舵匾,默認(rèn)為org.springframework.web.util.UrlPathHelper俊抵。 UrlFilenameViewController是它的一個(gè)實(shí)現(xiàn)者,因此我們應(yīng)該使用UrlFilenameViewController坐梯。 歡迎大家一起學(xué)習(xí)研究相關(guān)技術(shù)愿意了解框架技術(shù)
4.12徽诲、ParameterizableViewController
參數(shù)化視圖控制器,不進(jìn)行功能處理(即靜態(tài)視圖)吵血,根據(jù)參數(shù)的邏輯視圖名直接選擇需要展示的視圖谎替。
Java代碼
class="org.springframework.web.servlet.mvc.ParameterizableViewController">
該控制器接收到請(qǐng)求后直接選擇參數(shù)化的視圖,這樣的好處是在配置文件中配置蹋辅,從而避免程序的硬編碼钱贯,比如像幫助頁面等不需要進(jìn)行功能處理,因此直接使用該控制器映射到視圖侦另。
4.13秩命、AbstractUrlViewController
提供根據(jù)請(qǐng)求URL路徑直接轉(zhuǎn)化為邏輯視圖名的支持基類,即不需要功能處理褒傅,直接根據(jù)URL計(jì)算出邏輯視圖名弃锐,并選擇具體視圖進(jìn)行展示:
urlDecode:是否進(jìn)行url解碼,不指定則默認(rèn)使用服務(wù)器編碼進(jìn)行解碼(如Tomcat默認(rèn)ISO-8859-1)殿托;
urlPathHelper:用于解析請(qǐng)求路徑的工具類霹菊,默認(rèn)為org.springframework.web.util.UrlPathHelper。
UrlFilenameViewController是它的一個(gè)實(shí)現(xiàn)者支竹,因此我們應(yīng)該使用UrlFilenameViewController旋廷。
經(jīng)典介紹:
源碼結(jié)構(gòu)
4.14鸠按、UrlFilenameViewController
將請(qǐng)求的URL路徑轉(zhuǎn)換為邏輯視圖名并返回的轉(zhuǎn)換控制器,即不需要功能處理柳洋,直接根據(jù)URL計(jì)算出邏輯視圖名待诅,并選擇具體視圖進(jìn)行展示:
根據(jù)請(qǐng)求URL路徑計(jì)算邏輯視圖名;
Java代碼
class="org.springframework.web.servlet.mvc.UrlFilenameViewController"/>
class="org.springframework.web.servlet.mvc.UrlFilenameViewController"/>
class="org.springframework.web.servlet.mvc.UrlFilenameViewController"/>
class="org.springframework.web.servlet.mvc.UrlFilenameViewController"/>
/index1/*:可以匹配/index1/demo熊镣,但不匹配/index1/demo/demo卑雁,如/index1/demo邏輯視圖名為demo;
/index2/**:可以匹配/index2路徑下的所有子路徑绪囱,如匹配/index2/demo测蹲,或/index2/demo/demo,“/index2/demo”的邏輯視圖名為demo鬼吵,而“/index2/demo/demo”邏輯視圖名為demo/demo扣甲;
/*.html:可以匹配如/abc.html,邏輯視圖名為abc齿椅,后綴會(huì)被刪除(不僅僅可以是html)琉挖;
/index3/*.html:可以匹配/index3/abc.html,邏輯視圖名也是abc;
上述模式為Spring Web MVC使用的Ant-style?模式進(jìn)行匹配的:
Java代碼
?????匹配一個(gè)字符涣脚,如/index??可以匹配?/index1?示辈,?但不能匹配?/index?或?/index12
*????匹配零個(gè)或多個(gè)字符,如/index1/*遣蚀,可以匹配/index1/demo矾麻,但不匹配/index1/demo/demo
**???匹配零個(gè)或多個(gè)路徑,如/index2/**:可以匹配/index2路徑下的所有子路徑芭梯,如匹配/index2/demo险耀,或/index2/demo/demo
如果我有如下模式,那Spring該選擇哪一個(gè)執(zhí)行呢玖喘?當(dāng)我的請(qǐng)求為“/long/long”時(shí)如下所示:
/long/long
/long/**/abc
/long/**
/**
Spring的AbstractUrlHandlerMapping使用:最長匹配優(yōu)先甩牺;
如請(qǐng)求為“/long/long”?將匹配第一個(gè)“/long/long”,但請(qǐng)求“/long/acd”?則將匹配?“/long/**”累奈,如請(qǐng)求“/long/aa/abc”則匹配“/long/**/abc”贬派,如請(qǐng)求“/abc”則將匹配“/**”
UrlFilenameViewController還提供了如下屬性:
prefix:生成邏輯視圖名的前綴;
suffix:生成邏輯視圖名的后綴费尽;
Java代碼
protected?String?postProcessViewName(String?viewName)?{
return?getPrefix()?+?viewName?+?getSuffix();
}
Java代碼
當(dāng)prefix=“test”赠群,suffix=“test”羊始,如上所示的/*.htm:可以匹配如/abc.htm旱幼,但邏輯視圖名將變?yōu)閠estabctest。
更多詳細(xì)源碼參考來源:http://minglisoft.cn/technology