跟開濤學SpringMVC(4.4):Controller介面控制器詳解(4)
4.12、ParameterizableViewController
引數化檢視控制器,不進行功能處理(即靜態檢視),根據引數的邏輯檢視名直接選擇需要展示的檢視。
Java程式碼1 2 3 4 |
<bean
name= "/parameterizableView"
class = "org.springframework.web.servlet.mvc.ParameterizableViewController" >
<property
name= "viewName"
value= "success" />
</bean> |
該控制器接收到請求後直接選擇引數化的檢視,這樣的好處是在配置檔案中配置,從而避免程式的硬編碼,比如像幫助頁面等不需要進行功能處理,因此直接使用該控制器對映到檢視。
4.13、AbstractUrlViewController
提供根據請求URL路徑直接轉化為邏輯檢視名的支援基類,即不需要功能處理,直接根據URL計算出邏輯檢視名,並選擇具體檢視進行展示:
urlDecode:是否進行url解碼,不指定則預設使用伺服器編碼進行解碼(如Tomcat預設ISO-8859-1);
urlPathHelper:用於解析請求路徑的工具類,預設為org.springframework.web.util.UrlPathHelper。
UrlFilenameViewController是它的一個實現者,因此我們應該使用UrlFilenameViewController。
4.14、UrlFilenameViewController
將請求的URL路徑轉換為邏輯檢視名並返回的轉換控制器,即不需要功能處理,直接根據URL計算出邏輯檢視名,並選擇具體檢視進行展示:
根據請求URL路徑計算邏輯檢視名;
Java程式碼1 2 3 4 5 6 7 8 |
<bean
name= "/index1/*"
class = "org.springframework.web.servlet.mvc.UrlFilenameViewController" />
<bean
name= "/index2/**"
class = "org.springframework.web.servlet.mvc.UrlFilenameViewController" />
<bean
name= "/*.html"
class = "org.springframework.web.servlet.mvc.UrlFilenameViewController" />
<bean
name= "/index3/*.html"
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,字尾會被刪除(不僅僅可以是html);
/index3/*.html:可以匹配/index3/abc.html,邏輯檢視名也是abc;
上述模式為spring Web MVC使用的Ant-style 模式進行匹配的:
Java程式碼1 2 3 4 5 6 7 8 9 10 11 |
?
匹配一個字元,如/index? 可以匹配 /index1 , 但不能匹配 /index 或 /index12
*
匹配零個或多個字元,如/index1 /*,可以匹配/index1/demo,但不匹配/index1/demo/demo
**
匹配零個或多個路徑,如/index2/**:可以匹配/index2路徑下的所有子路徑,如匹配/index2/demo,或/index2/demo/demo
如果我有如下模式,那Spring該選擇哪一個執行呢?當我的請求為“/long/long”時如下所示:
/long/long
/long/**/abc
/long/**
/**
Spring的AbstractUrlHandlerMapping使用:最長匹配優先;
如請求為“/long/long”
將匹配第一個“/long/long”,但請求“/long/acd” 則將匹配 “/long/**”,如請求“/long/aa/abc”則匹配“/long/**/ abc”,如請求“/abc”則將匹配“/**”
|
UrlFilenameViewController還提供瞭如下屬性:
prefix:生成邏輯檢視名的字首;
suffix:生成邏輯檢視名的字尾;
Java程式碼1 2 3 |
protected
String postProcessViewName(String viewName) {
return
getPrefix() + viewName + getSuffix();
}
|
1 2 3 4 |
<bean
name= "/*.htm"
class = "org.springframework.web.servlet.mvc.UrlFilenameViewController" >
<property
name= "prefix"
value= "test" />
<property
name= "suffix"
value= "test" />
</bean>
|
當prefix=“test”,suffix=“test”,如上所示的/*.htm:可以匹配如/abc.htm,但邏輯檢視名將變為testabctest。