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