1. 程式人生 > >跟開濤學SpringMVC(4.4):Controller介面控制器詳解(4)

跟開濤學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();  }
Java程式碼  
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。