Spring MVC配置及攔截器的實現

如題所示,這裏主要是介紹攔截器的使用了但是爲了更貼合實際的項目所以我們先導入spring mvc框架。爲了使用spring mvc我們要導入相關的包,它依賴於spring-web 和spring -webmvc我這裏的版本是4.0.6的。將相關的包導入到工程中並且添加編譯路徑後我們再在web.xml文件中配置spring mvc。
前面說過配置一個基本的servlet時要配置和這兩個標籤,同理spring mvc也要配置這兩個標籤,因爲spring mvc是對請求的集中處理分發在這之前它也需要接受到請求才行。這裏就不細說直接看代碼和註釋吧。

<servlet>
        <servlet-name>spring</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <!-- spring-mvc具體的配置文件 -->
            <param-value>/WEB-INF/spring-mvc.xml</param-value>
        </init-param>
        <!-- servlet加載的優先級,當值大於等於0時在應用啓動時就加載這
            個servlet,值越小優先級越高。
        當值爲負數或未指定時servlet被使用時才加載 -->
        <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
        <servlet-name>spring</servlet-name>
        <!-- spring-mvc能夠處理的請求要匹配如下格式 -->
        <url-pattern>*.html</url-pattern>
</servlet-mapping>

現在具體看spring-mvc.xml這個schema文件吧。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:p="http://www.springframework.org/schema/p" xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
            http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context-3.1.xsd
            http://www.springframework.org/schema/mvc 
            http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd">

        <!-- 默認的註解映射支持 -->
        <mvc:annotation-driven/>
        <!-- 自動掃描使用了註解的包如使用了
        @Controller、@Service這些註解的文件必須在這個包下面 -->
        <context:component-scan base-package="ServaceStudy"/>

        <!-- 視圖解釋類 -->  
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
            <!-- 視圖名前面部分匹配的格式,可以理解爲視圖文件的目錄結構 -->
        <property name="prefix" value="/WEB-INF/jsp/"/>  
        <!-- 視圖的文件後面匹配的格式,簡單理解就是視圖文件的後綴名 -->
        <property name="suffix" value=".jsp"/>  
        <!-- 視圖的類型,這裏配置的是jsp。視圖類型有很多種具體可以根據項目需求配置不同的類型 -->
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />  
    </bean>  

    <!-- 配置攔截器 -->
     <mvc:interceptors>
        <mvc:interceptor>
        <!-- 攔截器攔截的URL格式 -->
            <mvc:mapping path="/api/**" />
            <!-- 處理攔截的具體實現類 -->
            <bean class="ServaceStudy.TestInterceptor" />
        </mvc:interceptor>
    </mvc:interceptors>  

</beans>

這樣配置就可以使用註解,分發請求,進行攔截了,具體的意思看註釋吧。以後根據需要我們還可以在這裏添加其他的配置比如上傳文件就需要添加配置瞭如:

<bean id="multipartResolver"
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize">
            <value>104857600</value>
        </property>
    </bean>

見名知意我就不細說了
然後我們來測試一下, 首先必須實現這個類TestInterceptor,TestInterceptor實現了 HandlerInterceptor這個接口。這個接口有三個方法本別對應了處理請求之前,處理請求結束渲染圖層前和圖層渲染結束請求結束這三個階段。

boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception

這個是請求處理之前,如果返回true就繼續向下執行請求給與通過,如果返回false就攔截不給請求通過。handler這個參數是處理這個請求所在的Controller對象,request、response是請求的接受和返回對象。如此關於請求的很多信息我們就可以在攔截器中獲取了。

public void postHandle(
            HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
            throws Exception 

這是處理請求結束渲染圖層之前的階段,modelAndView這個參數是相信大家都很熟悉就是我們要渲染的圖層對象,所以我們可以在這裏改變一些信息從而控制圖層。

public void afterCompletion(
            HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception

這是請求的最後階段了,通常在這個方法中會做一些收尾工作比如資源的釋放。看代碼吧,

package ServaceStudy;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class TestInterceptor implements HandlerInterceptor{
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        System.out.println("======處理請求之前======");

        return true;
    }

    @Override
    public void postHandle(
            HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
            throws Exception {
        System.out.println("========處理請求後,渲染頁面前======");
        modelAndView.addObject("post","interceptor change view before rendering");
    }

    @Override
    public void afterCompletion(
            HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        System.out.println("========視圖渲染結束了,請求處理完畢====");
    }
}

再看看控制器吧:

package ServaceStudy;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
//@Scope("prototype") 默認Controller是單例,所有的請求都是一個Controller。Scope聲明作用域,prototype原型
public class SpringMvcTest {

    public Integer i = 1;

    @RequestMapping("/api/test.html")
    public void requestTest(HttpServletRequest request,HttpServletResponse response) {
        System.out.println("==========");

    }
    //攔截器測試
    @RequestMapping("/api/hellow.html")
    public ModelAndView requestHellowWord(HttpServletRequest request,HttpServletResponse response) {
        ModelAndView model = new ModelAndView("/hellow");
        model.addObject("count",i++);
        System.out.println("==========處理請求中=======");
        return model;
    }

}

還有個視圖文件hellow.jsp

<h1>Test</h1>
<div>HTLLOWORD</div>
<div>count:${count}</div> 
<div>interceptor:${post}</div>

然後在瀏覽器中輸入測試的url:http://localhost:7060/api/hellow.html
測試結果:
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章