SpringMVC拦截器
类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。(责任链模式,AOP思想)
1.创建拦截器实现HandlerInterceptor接口
public class MyInterceptor1 implements HandlerInterceptor {
//在目标方法执行之前 执行
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle...");
return true; /*返回值 false:后面方法都不执行 true:后面方法都执行*/
}
//在目标方法执行之后 视图对象返回之前执行
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle...");
}
//整个流程都执行完毕后 执行
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion...");
}
}
2.在spring-mvc.xml
中配置拦截器
<mvc:interceptors>
<mvc:interceptor>
<!--对哪些资源执行拦截操作-->
<mvc:mapping path="/**"/>
<bean class="com.heiko.interceptor.MyInterceptor1"/>
</mvc:interceptor>
</mvc:interceptors>
3.测试拦截器的拦截效果
执行http://localhost:8080/my_spring_interceptor_war_exploded//target
@RequestMapping("/target")
public ModelAndView show() {
System.out.println("目标资源执行....");
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("name", "heiko");
modelAndView.setViewName("index");
return modelAndView;
}
可以看到打印了日志
preHandle...
目标资源执行....
postHandle...
afterCompletion...
有了拦截器,我们就可以在preHandler中进行拦截跳转操作
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle...");
String params = request.getParameter("params");
if (params.equals("yes")) {
return true;
} else {
request.getRequestDispatcher("/error.jsp").forward(request, response);
return false;
}
在postHandle中,可以进行参数的增加修改
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle...");
modelAndView.addObject("name", "zhangsan");
}
多个拦截器
多个拦截器,会先顺序执行preHandle,再反顺序调用postHandle和afterCompletion。
preHandle1...
preHandle2...
目标资源执行...
postHandle2...
postHandle1...
afterCompletion2...
afterCompletion1...
SpringMVC异常处理机制
可以用来进行统一的异常处理。
新建处理类继承自HandlerExceptionResolver
public class MyExceptionResolver implements HandlerExceptionResolver {
/*
参数Exception:异常对象
返回值ModelAndView:跳转到错误视图信息
*/
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
ModelAndView modelAndView = new ModelAndView();
if(e instanceof MyException){
modelAndView.addObject("info","自定义异常");
}else if(e instanceof ClassCastException){
modelAndView.addObject("info","类转换异常");
}
modelAndView.setViewName("error");
return modelAndView;
}
}
在spring-mvc.xml
中配置自定义异常处理器
<bean class="com.heiko.resolver.MyExceptionResolver"/>
如果出现Crash,就可以进行统一处理了。