SpringMVC中的拦截器、异常处理器
一、SpringMVC框架中的拦截器
1. 拦截器的概述
1)SpringMVC框架中的拦截器用于对处理器进行预处理和后处理的技术
2) 可以定义拦截器链,连接器链就是将拦截器按着一定的顺序结成一条链,在访问被拦截的方法时,拦截器链中的拦截器会按着定义的顺序执行。
3). 拦截器和过滤器的区别:
* 过滤器是Servlet规范的一部分,任何框架都可以使用过滤器技术。
* 拦截器是SpringMVC框架独有的。
* 过滤器配置了/*,可以拦截任何资源。
* 拦截器只会对控制器中的方法进行拦截。
4)要自定义拦截器,需要实现HandlerInterceptor接口。
2. 自定义拦截器步骤
1) 创建类,实现HandlerInterce
public class MyInterceptor implements HandlerInterceptor { /** * 预处理,controller方法执行前 * return true 放行,执行下一个拦截器,如果没有,执行controller中的方法 * return false 不放行 * @param request * @param response * @param handler * @return * @throws Exception */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("MyInterceptor执行了---------前"); // request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response); return true; } /** * 后处理的方法,controller方法执行之后,success.jsp执行之前 * @param request * @param response * @param handler * @param modelAndView * @throws Exception */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("MyInterceptor执行了---------后"); } /** * success.jsp执行之后,该方法执行 * @param request * @param response * @param handler * @param ex * @throws Exception */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("MyInterceptor执行了---------最后"); } }
2)在springmvc.xml中配置拦截器类
<!--配置拦截器--> <mvc:interceptors> <!--配置拦截器--> <mvc:interceptor> <!--要拦截的方法--> <mvc:mapping path="/user/*"/> <!-- <!–不要拦截的集体方法–>--> <!-- <mvc:exclude-mapping path=""/>--> <!--配置拦截器的对象--> <bean class="cn.li.interceptor.MyInterceptor"/> </mvc:interceptor> </mvc:interceptors>
执行步骤:预处理的方法-----true放行-----> collection方法---------->后处理方法------------->jsp页面------------>最终处理方法
二、SpringMVC的异常处理
1.异常处理思路
1)Controller调用service,service调用dao,异常都是向上抛出的,最终有DispatcherServlet找异常处理器进行异常的处理。
2 SpringMVC的异常处理
1)自定义异常
public class SysException extends Exception { //存储提示信息 private String message; public SysException(String message) { this.message = message; } @Override public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }
2)自定义异常处理器
public class SysExceptionResolver implements HandlerExceptionResolver { /** * 处理异常的逻辑 * @param httpServletRequest * @param httpServletResponse * @param o * @param e :当前抛出的异常 * @return */ @Override public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) { //获取到异常对象 SysException exception=null; if(e instanceof SysException){ exception= (SysException) e; }else { e=new SysException("系统正在维护"); } ModelAndView mv =new ModelAndView(); mv.addObject("errorMsg",e.getMessage()); mv.setViewName("error"); return mv; }
3)在springmvc.xml中配置异常处理器
<!--配置异常处理器--> <bean id="sysExceptionResolver" class="cn.li.exception.SysExceptionResolver"></bean>