Spring MVC拦截器HanderInterceptorAdapter示例
有时我们需要拦截传入的请求并进行一些预处理,或者在完成请求后需要执行此操作。
与我们使用的过滤器一起使用的过滤器非常相似。
有两种方法可以使用带有Spring MVC的拦截器。
HandlerInterceptor接口:
我们可以实现HandlerInterceptor接口以使用拦截器。
它有三种我们需要实施的方法。
公共布尔预处理(httpservletrequest请求,httpservletresponse响应,对象处理程序):此方法在请求移交处理程序方法之前执行此方法。
如果我们注意到它具有布尔返回类型。
如果此方法返回true,则它将转到其他拦截器或者处理程序方法。
如果此方法返回false,则此请求仅由拦截器处理,我们应该使用响应对象发送回客户端。
公共void posthandle(httpservletrequest请求,httpservletresponse响应,对象处理程序,
ModelAndView ModelDandView):当处理程序方法完成其进程但DispatcherServlet尚未处理视图时,调用此方法。
此方法可用于添加可在视图中使用的一些模型视图对象。
它可以通过将对象添加到ModelDandView对象来完成。
public void delempletion(httpservletrequest请求,httpservletresponse响应,对象处理程序,例外ex):在查看后调用此方法呈现呈现呈现,请求完全处理。
HandlerInterceptorAdapter类:
与HandlerInterceptor有关的问题是我们需要实现所有方法,但如果扩展到Astract Class叫做HandlerInterceptorAdapter,则只能实现我们想要的方法,也可以使用其他方法具有默认实现。
允许使用HandlerInterceptorAdapter类实现自定义拦截器示例。
Spring MVC拦截器示例:
我在这里使用Spring MVC Hello World示例,对此进行了很小的更改。
添加Spring MVC依赖项
在pom.xml中添加Spring依赖项。
我们需要Spring核心和SpringMVC依赖。
pom.xml.
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.igi.theitroad</groupId>
<artifactId>SpringMVCHelloWorldExample</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>SpringMVCHelloWorldExample Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
<build>
<finalName>SpringMVCHelloWorldExample</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>${jdk.version}</source>
<target>${jdk.version}</target>
</configuration>
</plugin>
</plugins>
</build>
<properties>
<spring.version>4.2.1.RELEASE</spring.version>
<jdk.version>1.7</jdk.version>
</properties>
</project>
创建控制器
创建名为"org.igi.theitroad.springmvc.controller"的包创建一个名为"helloWorldcontroller.java"的控制器类
package org.igi.theitroad.springmvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class HelloWorldController {
@RequestMapping("/helloworld")
public ModelAndView hello() {
return new ModelAndView("hello");
}
}
创建拦截器
创建名为sampleinterceptor.java的拦截器类
package org.igi.theitroad.springmvc.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
public class SampleInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
request.setAttribute("blogName", "theitroad");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
String blogName = (String) request.getAttribute("blogName");
//We are adding some modelAndView objects here and will use it in view jsp.
modelAndView.addObject("blogName",blogName);
modelAndView.addObject("authorName", "igi");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
String blogName = (String) request.getAttribute("blogName");
String authorName = (String) request.getAttribute("authorName");
System.out.println("Request URL::" + request.getRequestURL().toString());
System.out.println("Blog name : " + blogName);
System.out.println("Author Name : " + authorName);
}
}
其中我在prehandle方法中设置请求属性(blogname),我们在Posthandle方法中获取它。
我们还将两个对象添加到ModelDandView,我们将在JSP中使用。
创建视图
修改下面的index.jsp a s
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>HelloWorld</title>
</head>
<body>
<a href="helloworld.html">Click here to read hello message </a>
</body>
</html>
在/web-inf /文件夹中创建hello.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Hello</title>
</head>
<body>
This is written by ${authorName} on ${blogName}
</body>
</html>
配置Spring MVC应用程序
现在我们需要配置两个文件"web.xml"和"springmvc-dispatcher-servlet.xml",我们需要在Web.xml for Spring MVC中声明DispatcherServlet。
初始化DirplatcherServlet时,Spring尝试从[servlet name] -servet.xml文件中加载应用程序上下文。
因此,在这种情况下,它将尝试加载springmvc-dispatcher-servlet.xml。
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<display-name>Archetype Created Web Application</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>springmvc-dispatcher</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc-dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
在/Web-Inf文件夹中创建名为"springmvc-dispatcher-servlet.xml"的XML文件。
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="org.igi.theitroad.springmvc.controller"
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/"
<beans:property name="suffix" value=".jsp"
</beans:bean>
<interceptors>
<interceptor>
<mapping path="/helloworld.html"
<beans:bean
class="org.igi.theitroad.springmvc.interceptor.SampleInterceptor"></beans:bean>
</interceptor>
</interceptors>
</beans:beans>
在/Web-Inf文件夹中创建名为"springmvc-dispatcher-servlet.xml"的XML文件。
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
其中我们在上面的文件中声明了拦截器(SampleInterceptor),该文件将拦截特定的URL(/helloworld.html)。
这是时候做Maven建造了。
右键单击项目 - >运行AS - > Maven Build
将目标作为清洁安装(如下所示),然后单击运行
运行应用程序
右键单击项目 - >在服务器上运行AS - >运行
选择Apache Tomcat,然后单击"完成"

