1、SpringMVC异常处理
CustomException
package exception;
//自定义异常
public class CustomException extends Exception{
private String message;
public CustomException(String message){
this.message = message;
}
public String getMessage() {
return message;
}
}
CustomExceptionResolver
package exception;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
//自定义异常处理器
public class CustomExceptionResolver implements HandlerExceptionResolver{
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response,
Object handler,Exception e) {
//打印异常信息
e.printStackTrace();
//定义一个自己的异常对象
CustomException ce = null;
//判断当前对象是否为异常对象
if(e instanceof CustomException) {
ce = (CustomException) e;
}else {
ce = new CustomException("系统问题,请联系管理员");
}
//创建ModelAndView对象
ModelAndView mav = new ModelAndView();
mav.setViewName("error");
mav.addObject("errorMessage", ce.getMessage());
return mav;
}
}
2、SpringMVC中的拦截器
SpringMVC的处理拦截器类似于Filter,用于对处理器进行预处理和后处理。
1)自定义拦截器
MyInterceptor
package interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
//自定义拦截器
public class MyInterceptor implements HandlerInterceptor{
//在DispatcherServlet完全处理完请求后被调用,只有在preHandler为true时调用
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("afterCompletion方法执行了");
}
//在业务处理器处理完请求后,但是DispatcherServlet向客户端返回响应前被调用
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("postHandle方法执行了");
}
/*
* 当请求到达时,先执行此处的方法
* 此方法的返回值决定了是否放行
* true:放行,如果有下一个拦截器就执行下一个,如果该拦截器是最后一个就执行handler方法(控制器中的方法)
* false:不放行
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("自定义拦截器执行了");
return true;
}
}
<!-- 配置springmvc拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 用于拦截哪些请求映射 -->
<mvc:mapping path="/**"/>
<!-- 配置拦截器 -->
<bean id="myInterceptor" class="interceptor.MyInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
2)拦截器执行顺序
再创建一个MyInterceptor
当1为false,只执行1的proHandle
当2为false