SpringMVC(6)
SpringMVC的拦截器
流程:
结合流程图和后台打印结果看
后台打印结果:
preHandle执行了。。。1111
preHandle执行了。。。2222
testInterceptor执行了...
postHandle执行了。。。2222
postHandle执行了。。。1111
success.jsp执行了...
afterCompletion执行了。。。2222
afterCompletion执行了。。。1111
步骤:
(1)编写拦截器类,实现HandlerInterceptor接口
(2)配置拦截器
HandlerInterceptor
接口的重写方法:
(1)preHandle
:预处理,在controller方法执行前
return true:放行,执行下一个拦截器,如果没有,执行controller中的方法
return false:不放行,直接跳转页面
(2)postHandle
:后处理,在controller方法执行后,success.jsp执行之前
(3)afterCompletion
:在success.jsp页面执行后
流程
具体代码:
index.jsp
首页:
<a href="user/testInterceptor" >拦截器</a>
success.jsp
成功页面:
<h3>执行成功</h3>
<% System.out.println("success.jsp执行了..."); %>
error.jsp
错误页面:
<h3>错误页面</h3>
MyInterceptor1.java
:拦截器类,实现HandlerInterceptor接口
public class MyInterceptor1 implements HandlerInterceptor {
/**
* 预处理,在controller方法执行前
* return true:放行,执行下一个拦截器,如果没有,执行controller中的方法
* return false:不放行,直接跳转页面
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle执行了。。。1111");
// 放行
return true;
// 跳转到页面
// request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request, response);
// // 不放行
// return false;
}
/**
* 后处理,在controller方法执行后,success.jsp执行之前
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle执行了。。。1111");
// 指定页面跳转,就不会跳到success.jsp了
request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request, response);
}
/**
* 在success.jsp页面执行后
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion执行了。。。1111");
}
}
springmvc.xml
:配置拦截器,将自定义拦截器类MyInterceptor1
注入到容器中
<mvc:interceptors>
<mvc:interceptor>
<!-- 要拦截的具体的方法
一般只需要写一个(拦截或者不拦截)
/user/*:请求路径中user下的所有controller方法
-->
<mvc:mapping path="/user/*"/>
<!-- 不要拦截的具体的方法 -->
<!-- <mvc:exclude-mapping path=""/>-->
<!-- 配置拦截器对象 -->
<bean class="com.Lemon.interceptor.MyInterceptor1"/>
</mvc:interceptor>
</mvc:interceptors>
UserController
控制器类:
@Controller
@RequestMapping("/user")
public class UserController {
/**
* SpringMVC的拦截器
*/
@RequestMapping("/testInterceptor")
public String testInterceptor(){
System.out.println("testInterceptor执行了...");
return "success";
}
}
注意:
(1)在配置拦截器时,<mvc:mapping path="/user/*"/>
表示请求路径中user下的所有controller方法
(2)在preHandle
预处理方法中,可以reutrn false
不放行,并跳转至指定的error.jsp
错误页面
(3)在postHandle
后处理方法中,也可以跳转至指定的error.jsp
错误页面
(4)如果都不指定,那么就跳转至success.jsp
成功页面
效果:
(1)不指定跳转,都return true
放行:
- 页面会跳转至success.jsp
成功页面
- 后台会打印
preHandle执行了。。。1111
testInterceptor执行了...
postHandle执行了。。。1111
success.jsp执行了...
afterCompletion执行了。。。1111
(2)return false
不放行,并指定跳转到error.jsp
错误页面:
- 页面会跳转至error.jsp
成功页面
- 如果是preHandle
先指定了跳转并return false
,那么后台只打印preHandle执行了。。。1111
,后续的控制器方法等都不会执行
- 如果是postHandle
指定了跳转,而preHandle
是return true
,那么控制器方法也会执行,后台打印
preHandle执行了。。。1111
testInterceptor执行了...
postHandle执行了。。。1111
success.jsp执行了...
afterCompletion执行了。。。1111
配置多个拦截器:
MyInterceptor2
自定义拦截器类:和MyInterceptor1
相同
public class MyInterceptor2 implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle执行了。。。2222");
// 放行
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle执行了。。。2222");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion执行了。。。2222");
}
}
springmvc.xml
:配置拦截器,将自定义拦截器类MyInterceptor1
和MyInterceptor2
注入到容器中
<mvc:interceptors>
<!-- 配置第一个拦截器 -->
<mvc:interceptor>
<mvc:mapping path="/user/*"/>
<bean class="com.Lemon.interceptor.MyInterceptor1"/>
</mvc:interceptor>
<!-- 配置第二个拦截器 -->
<mvc:interceptor>
<mvc:mapping path="/user/*"/>
<bean class="com.Lemon.interceptor.MyInterceptor2"/>
</mvc:interceptor>
</mvc:interceptors>
最终后台打印:
preHandle执行了。。。1111
preHandle执行了。。。2222
testInterceptor执行了...
postHandle执行了。。。2222
postHandle执行了。。。1111
success.jsp执行了...
afterCompletion执行了。。。2222
afterCompletion执行了。。。1111