1. 程式人生 > >Spring MVC(攔截器與檢視解析器)

Spring MVC(攔截器與檢視解析器)

Spring MVC
攔截器:
<!--配置攔截器-->
    <mvc:interceptors>
        <!--<bean class="com.ma.interceptor.CustomeInterceptor" />-->
        <!--攔截器1-->
        <mvc:interceptor>
            <!--配置攔截器的作用路徑-->
            <mvc:mapping path="/**"/>
            <mvc:exclude-mapping path=""/>
            <!--定義在<mvc:interceptor>下面的表示匹配指定路徑的請求才進行攔截-->
            <bean class="com.ma.interceptor.Intercptor1"/>
        </mvc:interceptor>
        <!--攔截器2-->
        <mvc:interceptor>
            <mvc:mapping path="/hello"/>
            <bean class="com.ma.interceptor.Interceptor2"/>
        </mvc:interceptor>
上面的程式碼中,<mvc:interceptors>元素用於配置一組攔截器,基子元素<bean>中定義的是全域性攔截器,它會攔截所有的請求;而<mvc:interceptor>元素中定義的是指定路徑的攔截器,它會對指定路徑下的請求生效。<mvc:interceptor>元素的子元素<mvc:mapping>用於配置攔截器作用的路徑,該路徑在其屬性path 中定義。如上述程式碼中 path 的屬性值“/**” 表示攔截所有路徑,“/hello” 表示攔截所有以 “/hello” 結尾的路徑。如果在請求路徑中包含不需要攔截的內容,還可以通過<mvc:exclude-mapping>元素進行配置。
注意:<mvc:interceptor>中的子元素必須按照上述程式碼中的配置順序進行編寫,即<mvc:mapping> <mvc:exclude-mapping> <bean>,否則檔案會報錯。

編寫攔截器的類:
1.通過實現HandlerInterceptor介面,或繼承HandlerInterceptor介面的實現類(如HandlerInterceptorAdapter)來定義。


2.需重寫以下方法:
preHandle() 方法:該方法會在控制器方法前執行,其返回值表示是否中斷後續操作。當其返回值為true時,表示繼續向下執行;
當其返回值為false時,會中斷後續的所有操作(包括呼叫下一個攔截器和控制器類中的方法執行等)。


postHandle()方法:該方法會在控制器方法呼叫之後,且解析檢視之前執行。可以通過此方法對請求域中的模型和檢視做出進一步的修改。


afterCompletion()方法:該方法會在整個請求完成,即檢視渲染結束之後執行。可以通過此方法實現一些資源清理、記錄日誌資訊等工作。


檢視解析器:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="prefix" value="/WEB-INF/views/"/>
  <property name="suffix" value=".jsp"/>
  <property name="order" value="-99"/>   //可不寫
</bean>
檢視解析器優先順序:在指定 order 屬性的情況下,order 值越小的,越先會遍歷。
如果沒有優先順序則按其在配置檔案中的位置:(在沒有被快取的情況下,有快取按快取順序,需重啟伺服器)
判斷該檢視是否被快取,如果沒有被快取,則建立檢視,如果被快取,則從快取中獲取。
在建立檢視前會檢查返回值是否是以:"redirect:" 或 "forward:" 開頭的。如果是重定向:則建立一個重定向檢視,返回建立的檢視。如果是轉發:則返回通過 轉發 url 建立的 InternalResourceView 檢視
返回型別:ModelAndView ,Map,ModelMap,Model,View,String,Void
render(mv, request, response);方法,這個方法就是渲染檢視的方法