Controller调用service,service调用dao,异常都是向上抛出的,最终有DispatcherServlet找异常处理器进
行异常的处理
自定义异常类
/**
 * 自定义异常类
 */
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;
    }
}
自定义异常处理器,需要实现HandlerExceptionResolver接口
/**
 * 自定义异常处理器
 */
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 ex = null;
        //获取异常对象
        if(e instanceof SysException)
            ex = (SysException) e;
        else
            ex = new SysException("请联系管理员");
        ModelAndView mv = new ModelAndView();
        //存入错误的提示信息
        mv.addObject("errorMsg",ex.getMessage());
        mv.setViewName("error");
        return mv;
    }
}
配置异常处理器,在SpringMVC.xml中添加配置
<!--配置异常处理器-->
    <bean id="sysExceptionResolver" class="com.chenpeng.exception.SysExceptionResolver"></bean>
创建拦截器类,实现HandlerInterceptor接口,重写需要的方法
public class MyInterceptor1 implements HandlerInterceptor {
    /**
     * controller方法执行前,进行拦截的方法
     * return true 放行
     * 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("preHandle拦截方法执行了1");
        return true;
    }
    /**
     * controller方法执行后在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("postHandle拦截方法执行了1");
    }
    /**
     * 在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("afterCompletion拦截方法执行了1");
    }
}
HandlerInterceptor接口中的方法
配置自定义的拦截器类,在SpringMVC.xml中添加配置
<!--配置拦截器-->
    <mvc:interceptors>
        <mvc:interceptor>
            <!--哪些方法进行拦截-->
            <mvc:mapping path="/user/*"/>
            <!--哪些方法不拦截
            <mvc:exclude-mapping path=""/>-->
            <!--注册拦截器对象-->
            <bean class="com.chenpeng.interceptor.MyInterceptor1"></bean>
        </mvc:interceptor>
    </mvc:interceptors>
配置两个拦截器
<!--配置拦截器-->
    <mvc:interceptors>
        <mvc:interceptor>
            <!--哪些方法进行拦截-->
            <mvc:mapping path="/user/*"/>
            <!--哪些方法不拦截
            <mvc:exclude-mapping path=""/>-->
            <!--注册拦截器对象-->
            <bean class="com.chenpeng.interceptor.MyInterceptor1"></bean>
        </mvc:interceptor>
        <mvc:interceptor>
            <!--哪些方法进行拦截-->
            <mvc:mapping path="/user/*"/>
            <!--哪些方法不拦截
            <mvc:exclude-mapping path=""/>-->
            <!--注册拦截器对象-->
            <bean class="com.chenpeng.interceptor.MyInterceptor2"></bean>
        </mvc:interceptor>
    </mvc:interceptors>
多个拦截器执行的顺序
preHandle拦截方法执行了1
preHandle拦截方法执行了2
testInterceptor执行了
postHandle拦截方法执行了2
postHandle拦截方法执行了1
success.jsp执行了
afterCompletion拦截方法执行了2
afterCompletion拦截方法执行了1
原文:https://www.cnblogs.com/codeDD/p/12699139.html