欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring MVC配置及拦截器的实现

程序员文章站 2022-05-23 10:28:35
...

如题所示,这里主要是介绍拦截器的使用了但是为了更贴合实际的项目所以我们先导入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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

现在具体看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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

这样配置就可以使用注解,分发请求,进行拦截了,具体的意思看注释吧。以后根据需要我们还可以在这里添加其他的配置比如上传文件就需要添加配置了如:

<bean id="multipartResolver"
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize">
            <value>104857600</value>
        </property>
    </bean>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

见名知意我就不细说了 
然后我们来测试一下, 首先必须实现这个类TestInterceptor,TestInterceptor实现了 HandlerInterceptor这个接口。这个接口有三个方法本别对应了处理请求之前,处理请求结束渲染图层前和图层渲染结束请求结束这三个阶段。

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

这个是请求处理之前,如果返回true就继续向下执行请求给与通过,如果返回false就拦截不给请求通过。handler这个参数是处理这个请求所在的Controller对象,request、response是请求的接受和返回对象。如此关于请求的很多信息我们就可以在拦截器中获取了。

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

这是处理请求结束渲染图层之前的阶段,modelAndView这个参数是相信大家都很熟悉就是我们要渲染的图层对象,所以我们可以在这里改变一些信息从而控制图层。

public void afterCompletion(
            HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception
  • 1
  • 2
  • 3

这是请求的最后阶段了,通常在这个方法中会做一些收尾工作比如资源的释放。看代码吧,

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("========视图渲染结束了,请求处理完毕====");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

再看看控制器吧:

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;
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

还有个视图文件hellow.jsp

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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

然后在浏览器中输入测试的url:http://localhost:7060/api/hellow.html 
测试结果: 
Spring MVC配置及拦截器的实现


今天想拦截所有的json请求,找了一圈没找到解决方案,偶然看到*上面的回复,才解决了这个难题。

特贴出来共享。

直接在xml文件中配置即可:

[html] view plain copy
  1. <mvc:interceptors>  
  2.         <mvc:interceptor>  
  3.             <mvc:mapping path="/**/*.json" />  
  4.             <!-- 定义在mvc:interceptor下面的表示是对特定的请求才进行拦截的 -->  
  5.             <bean class="com.interceptor" />  
  6.         </mvc:interceptor>  
  7.     </mvc:interceptors>