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,然后单击"完成"