1 SpringMVC异常处理之分析和搭建环境
2 SpringMVC异常处理之演示程序异常
3 SpringMVC异常处理之异常处理代码编写
步骤
创建环境 pom.xml, web.xml, springmvc.xml … => 复制前端控制器, 过滤器 => sysException.java 文件 => 配置异常处理类 => 完成 UserController.java =>编写 SysException.java => 编写 SYSExceptionResolver.java
UserController.java
/**
* @author YYDCYY
* @create 2019-10-08
*/
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/testException")
public String testException() throws SysException {
System.out.println("testException 执行了... ");
try {
int a = 10 / 0;
} catch (Exception e) {
e.printStackTrace();
throw new SysException("查询所有用户出现错误了...");
}
return "success";
}
}
模拟一个错误, 调用自己的错误处理类 “SYSException”
SYSException
/**
*
* 自定义异常类
* @author YYDCYY
* @create 2019-10-08
*/
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;
}
}
SysException.java
/**
* 处理异常业务逻辑
* @param httpServletRequest
* @param httpServletResponse
* @param handler
* @param ex
* @return
*/
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler, Exception ex) {
// 获取到异常对象
SysException e = null;
if (ex instanceof SysException){
e = (SysException) ex;
}else
e = new SysException("系统维护中呢....");
// 创建ModelAndView对象
ModelAndView mv = new ModelAndView();
mv.addObject("errorMsg", e.getMessage());
mv.setViewName("error");
return mv;
}
注: 结果提交至 request 域 ModelAndView
springmvc.xml
<!--配置异常处理器-->
<bean id="sysExceptionResolver" class="com.yydcyy.exception.SysExceptionResolver"/>
类似前端控制器, 不配置异常类咋起作用?
结果 Dmoe
说明 : 用户页面很友好, 控制台输出原因
4 SpringMVC拦截器之介绍和搭建环境
拦截器中有 3 个方法 ① preHandle ② postHandle ③ afterCompletion
流程示意图
拦截器执行步骤 : pre1 -> pre2 -> controller =>post2 -> post2 - > after2 -> after1
见 pdf 文档
拦截器可做的事, 过滤器都可以做; 过滤器做的事, 拦截器不一定能做
1 编写拦截器类, 实现 HandlerInterceptor.java 接口
2 配置拦截器
5 SpringMVC拦截器之编写controller
@RequestMapping("/testInterceptor")
public String testInterceptor(){
System.out.println("testInterceptor执行了...");
return "success";
}
6 SpringMVC拦截器之拦截器入门代码
interceptor1
/**
* @author YYDCYY
* @create 2019-10-08
*/
public class MyInterceptor1 implements HandlerInterceptor {
/**
* 预处理,controller方法执行前
* * return true 放行,执行下一个拦截器,如果没有,执行controller中的方法
* * return false不放行
* 用于 eg : 登录时候预检测, 当前状态没登录, 跳转至登录页面类似这样
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("MyInterceptor1执行了...前1111");
return true;
}
/**
* 后处理方法,controller方法执行后,success.jsp执行之前
* eg : 用于退出后 跳转至登录页面等
* @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("MyInterceptor1执行了...后1111");
}
/**
* eg : 结束后资源释放等
* @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("MyIntercept⁄or1执行了...最后1111");
}
}
interceptor2
/**
* @author YYDCYY
* @create 2019-10-08
*/
public class MyInterceptor2 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("MyInterceptor1执行了...前2222");
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("MyInterceptor1执行了...后2222");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("MyInterceptor1执行了...最后2222");
}
}
Springmvc.xml 配置拦截对象
<!--配置拦截器-->
<mvc:interceptors>
<!--配置拦截器-->
<mvc:interceptor>
<!--要拦截的具体的方法-->
<mvc:mapping path="/user/*"/>
<!--不要拦截的方法
<mvc:exclude-mapping path=""/>
-->
<!--配置拦截器对象-->
<bean class="cn.yydcyy.controller.cn.itcast.interceptor.MyInterceptor1" />
</mvc:interceptor>
<!--配置第二个拦截器-->
<mvc:interceptor>
<!--要拦截的具体的方法-->
<mvc:mapping path="/**"/>
<!--不要拦截的方法
<mvc:exclude-mapping path=""/>
-->
<!--配置拦截器对象-->
<bean class="cn.yydcyy.controller.cn.itcast.interceptor.MyInterceptor2" />
</mvc:interceptor>
</mvc:interceptors>
7 SpringMVC拦截器之拦截器接口方法演示
结果 Demo
多个拦截器时:(2 个 执行步骤见上面示意图) :