文章目录
1. 过滤器&拦截器
- 过滤器Filter依赖Servlet容器的,基于回调函数,过滤范围广,不但可以对资源进行过滤还可以对请求进行过滤。
- 拦截器Interceptor依赖于框架容器,基于反射机制,只过滤请求。(即只对访问Controller的请求进行拦截)。
2. 编写index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1> <a href="demo/test1" target="_blank">FIND1 no param</a> </h1>
<h1> <a href="back/test1" target="_blank">FIND1 no param</a> </h1>
</body>
</html>
3-1. 编写第一个拦截器MyInterceptor.java继承HandlerInterceptor
package com.hx.spring.mvc.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class MyInterceptor implements HandlerInterceptor{
/**
* 该方法将在调用Controller之前执行,SpringMVC中的Interceptor拦截器是链式调用的,可以同时存在多个Interceptor
* 然后SpringMVC会根据声明的前后顺序,依次调用
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("执行了MyInterceptor中的preHandle方法。。");
return true; //若当前返回值为false,则链式调用中断,请求结束.
}
/**
* 当preHandle的返回值为true,然后调用了Controller之后,在DispatcherServlet进行视图渲染之前执行,
* 也就说这个方法中可以对ModelAndView中的内容进行操作
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("执行了MyInterceptor中的postHandle方法。。");
System.out.println( modelAndView );
modelAndView.setViewName("redirect:/back/find2.html");
}
/**
* 该方法只有在preHandle返回true是才会执行,该方法将在整个请求完成之后,即DispatcherServlet进行视图渲染之后执行,
* 一般用来释放资源,关闭流等
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("执行了MyInterceptor中的afterCompletion方法。。");
}
}
3-2. 编写MyInterceptor2.java继承WebRequestInterceptor
package com.hx.spring.mvc.interceptor;
import org.springframework.ui.ModelMap;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.context.request.WebRequestInterceptor;
public class MyInterceptor2 implements WebRequestInterceptor{
/**
* 在调用Controller之前执行,与HandleInterceptor中的preHandle()方法的区别在于,该方法返回void类型
* 故,不可中断请求,一般用于进行资源准备的工作
*/
@Override
public void preHandle(WebRequest request) throws Exception {
System.out.println("执行了MyInterceptor2的preHandle方法。。");
request.setAttribute("company", "HUATHY", WebRequest.SCOPE_SESSION);
}
@Override
public void postHandle(WebRequest request, ModelMap model) throws Exception {
System.out.println("执行了MyInterceptor2的postHandle方法。。");
for(String key : model.keySet()){
System.out.println( key +"\t"+ model.get(key) );
}
}
@Override
public void afterCompletion(WebRequest request, Exception ex) throws Exception {
System.out.println("执行了MyInterceptor2的afterCompletion方法。。");
}
}
4-1. 编写控制器DemoController.java
package com.hx.spring.mvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller //说明这是一个控制器,这个注解是通过<context:component-scan />来扫描的
/*
* 可以出现在类或方法上,若出现在类上,则请求的url为 类上注解的 + 方法上@RequestMapping注解的地址。
* 若类上的不写,则url就是方法上@RequestMapping注解的url地址
*/
@RequestMapping("/demo")
public class DemoController {
@RequestMapping("/test1")
public String test1(){
System.out.println("进来了。。。");
return "redirect:/back/find1.html";
}
}
4-2. 编写控制器BackController.java
package com.hx.spring.mvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller //说明这是一个控制器,这个注解是通过<context:component-scan />来扫描的
/*
* 可以出现在类或方法上,若出现在类上,则请求的url为 类上注解的 + 方法上@RequestMapping注解的地址。
* 若类上的不写,则url就是方法上@RequestMapping注解的url地址
*/
@RequestMapping("/back")
public class BackController {
@RequestMapping("/test1")
public ModelAndView test1(){
System.out.println("进来了。。。");
ModelAndView mav = new ModelAndView("/back/index2.jsp");
mav.addObject("name", "HUATHY");
return mav;
}
}
5. 配置spirngmvc.xml
<?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:p="http://www.springframework.org/schema/p"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 配置注解扫描器 -->
<context:component-scan base-package="com.hx.spring.mvc" />
<!-- 放过静态资源 -->
<mvc:default-servlet-handler />
<!-- 启用mvc注解 , 扫描注解@RequestMapping、@ResponseBody...-->
<mvc:annotation-driven />
<!-- 配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/demo/**" /> <!-- 拦截路径 -->
<bean class="com.hx.spring.mvc.interceptor.MyInterceptor" /> <!-- 拦截后处理器,拦截后交给谁处理 -->
</mvc:interceptor>
</mvc:interceptors>
</beans>
附:
- spirngmvc入门—springmvc的使用(1):https://blog.csdn.net/qq_40366738/article/details/104841413
- springmvc入门—springmvc的使用(2):https://blog.csdn.net/qq_40366738/article/details/104857441
- springmvc入门—springmvc的使用(3)interceptor拦截器:https://blog.csdn.net/qq_40366738/article/details/104905550