异常处理
在我们的应用系统运行的过程中,可能由于运行环境、用户操作、资源不足等各方面的原因导致系统出现异常(HTTP状态异常、Exception),如果系统出现了异常,这些异常将会通过浏览器呈现给用户,而这种异常的显示是没有必要,因此我们可以在服务器进行特定的处理。当系统出现异常之后,呈现给用户一个统一的、可读的的异常提示页面。
异常处理思路
Controller调用service,service调用dao,异常都是向上抛出的,最终有DispatcherServlet找异常处理器进行异常的处理。
HTTP异常状态统一处理
HTTP Status 404
1、创建一个用于进行异常提示的页面:404.jsp
2、在web.xml中进行配置
<error-page>
<error-code>404</error-code>
<location>/404.jsp</location>
</error-page>
Java代码异常处理
1、基于Servlet API的处理
<error-page>
<exception-type>java.lang.NumberFormatException</exception-type>
<location>/err.jsp</ location>
</error-page>
2、SpringMVC的异常处理
package com.coydone.utils;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
@ControllerAdvice
public class MyExceptionHandler {
@ExceptionHandler(NullPointerException.class)
public String nullHandler() {
return "/err1.jsp";
}
@ExceptionHandler(NumberFormatException.class)
public String formatHandler() {
return "/err2.jsp";
}
}
SpringMVC的异常处理
1、自定义异常类
package com.coydone.exception;
public class SysException extends Exception{
private static final long serialVersionUID = 4055945147128016300L;
// 异常提示信息
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public SysException(String message) {
this.message = message;
}
}
2、自定义异常处理器
public class SysExceptionResolver implements HandlerExceptionResolver{
//跳转到具体的错误页面的方法
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
ex.printStackTrace();
SysException e = null;
// 获取到异常对象
if(ex instanceof SysException) {
e = (SysException) ex;
}else {
e = new SysException("请联系管理员");
}
ModelAndView mv = new ModelAndView();
// 存入错误的提示信息
mv.addObject("message", e.getMessage());
// 跳转的Jsp页面
mv.setViewName("error");
return mv;
}
}
3、配置异常处理器
<!-- 配置异常处理器 -->
<bean id="sysExceptionResolver" class="cn.coydone.exception.SysExceptionResolver"/>
SpringMVC中的拦截器
拦截器概述
SpringMVC中的拦截器用于对处理器进行预处理和后处理的技术。
可以定义拦截器链,连接器链就是将拦截器按着一定的顺序结成一条链,在访问被拦截的方法时,拦截器链中的拦截器会按着定义的顺序执行。
拦截器和过滤器的功能比较类似,有区别:
-
过滤器是Servlet规范的一部分,任何框架都可以使用过滤器技术。
-
拦截器是SpringMVC框架独有的。
-
过滤器配置了/*,可以拦截任何资源。
-
拦截器只会对控制器中的方法进行拦截。
拦截器也是AOP思想的一种实现方式。想要自定义拦截器,需要实现HandlerInterceptor接口。
自定义拦截器
1、创建类,实现HandlerInterceptor接口,重写需要的方法
public class MyInterceptor1 implements HandlerInterceptor{
/**
* controller方法执行前,进行拦截的方法
* return true放行
* return false拦截
* 可以使用转发或者重定向直接跳转到指定的页面。
*/
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("拦截器执行了...");
return true;
}
}
2、在springmvc.xml中配置拦截器类
<!-- 配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 哪些方法进行拦截 -->
<mvc:mapping path="/user/*"/>
<!-- 哪些方法不进行拦截
<mvc:exclude-mapping path=""/>
-->
<!-- 注册拦截器对象 -->
<bean class="com.coydone.demo1.MyInterceptor1"/>
</mvc:interceptor>
</mvc:interceptors>
HandlerInterceptor接口中的方法
preHandle()方法是Controller中方法执行前拦截的方法
-
可以使用request或者response跳转到指定的页面
-
return true放行,执行下一个拦截器,如果没有拦截器,执行Controller中的方法。
-
return false不放行,不会执行Controller中的方法。
postHandle()是Controller方法执行后执行的方法,在JSP视图执行前。
-
可以使用request或者response跳转到指定的页面
-
如果指定了跳转的页面,那么Controller方法跳转的页面将不会显示。
-
postHandle()方法是在JSP执行后执行。
-
request或者response不能再跳转页面。
配置多个拦截器
1、编写多个拦截器类
2、springmvc配置文件中配置
<!-- 配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 哪些方法进行拦截 -->
<mvc:mapping path="/user/*"/>
<!-- 哪些方法不进行拦截
<mvc:exclude-mapping path=""/>
-->
<!-- 注册拦截器对象 -->
<bean class="com.coydone.demo1.MyInterceptor1"/>
</mvc:interceptor>
<mvc:interceptor>
<!-- 哪些方法进行拦截 -->
<mvc:mapping path="/**"/>
<!-- 注册拦截器对象 -->
<bean class="com.coydone.demo1.MyInterceptor2"/>
</mvc:interceptor>
</mvc:interceptors>
拦截器链
将多个拦截器按照—定的顺序构成一个执行链。
评论区