SpringMVC对异常处理的支持
来源:程序员人生 发布时间:2015-01-07 08:11:04 阅读次数:2314次
不管做甚么项目,进行异常处理都是非常有必要的,而且你不能把1些只有程序员才能看懂的毛病代码抛给用户去看,所以这时候候进行统1的异常处理,展现1个比较友好的毛病页面就显得很有必要了。跟其他MVC框架1样,springMVC也有自己的异常处理机制。
springMVC提供的异常处理主要有两种方式,1种是直接实现自己的HandlerExceptionResolver,固然这也包括使用Spring已为我们提供好的SimpleMappingExceptionResolver和DefaultHandlerExceptionResolver,另外一种是使用注解的方式实现1个专门用于处理异常的Controller――ExceptionHandler。
1、实现自己的HandlerExceptionResolver,HandlerExceptionResolver是1个接口,springMVC本身已对其有了1个本身的实现――DefaultHandlerExceptionResolver,该解析器只是对其中的1些比较典型的异常进行了拦截,然后返回对应的毛病码,固然你也能够继承DefaultHandlerExceptionResolver类,然后重写其中的1些异常处理方法来实现自己的异常处理。
-
import javax.servlet.http.HttpServletRequest;
-
import javax.servlet.http.HttpServletResponse;
-
-
import org.springframework.web.servlet.HandlerExceptionResolver;
-
import org.springframework.web.servlet.ModelAndView;
-
-
public class ExceptionHandler implements HandlerExceptionResolver {
-
-
@Override
-
public ModelAndView resolveException(HttpServletRequest request,
-
HttpServletResponse response, Object handler, Exception ex) {
-
-
return new ModelAndView("exception");
-
}
-
-
}
上述的resolveException的第4个参数表示对哪一种类型的异常进行处理。由于Exception类是所有异常类的基类,所以如果想根据异常类型的不同来进行不同的处理的话,可以在resolveException方法里面根据不同的异常类型进行不同的处理,返回不同的异常视图。如:
-
public class ExceptionHandler implements HandlerExceptionResolver {
-
-
@Override
-
public ModelAndView resolveException(HttpServletRequest request,
-
HttpServletResponse response, Object handler, Exception ex) {
-
-
if (ex instanceof NumberFormatException) {
-
-
return new ModelAndView("number");
-
} else if (ex instanceof NullPointerException) {
-
-
return new ModelAndView("null");
-
}
-
return new ModelAndView("exception");
-
}
-
-
}
定义了这样1个异常处理器以后就要在applicationContext中定义这样1个bean对象,如:
-
<bean id="exceptionResolver" class="com.tiantian.xxx.web.handler.ExceptionHandler"/>
Spring除实现了1个DefaultHandlerExceptionResolver以外,还实现了1个SimpleMappingExceptionResolver,这二者都是继承自抽象类AbstractHandlerExceptionResolver,而AbstractHandlerExceptionResolver是实现了HandlerExceptionResolver接口的resolveException方法的,并由此抽取出两个抽象方法,1个是在进行异常处理之前履行的方法prepareResponse(exception,
response),1个是进行异常解析的doResolveException(request, response, handler, exception)方法。SimpleMappingExceptionResolver,顾名思义就是通过简单的映照关系来决定由哪一个视图来处应当前的毛病信息。SimpleMappingExceptionResolver提供了通过异常类型exceptionMappings来进行异常与视图之间的映照关系,提供了在产生异常时通过statusCodes来映照异常返回的视图名称和对应的HttpServletResponse的返回码。而且可以通过defaultErrorView和defaultErrorCode来指定默许值,defaultErrorView表示当没有在exceptionMappings里面找到对应的异常类型时就返回defaultErrorView定义的视图,defaultErrorCode表示在产生异常时当没有在视图与返回码的映照关系statusCodes里面找到对应的映照时默许返回的返回码。在使用SimpleMappingExceptionResolver时,当产生异常的时候,SimpleMappingExceptionResolver将会把当前的异常对象放到本身属性exceptionAttribute中,当没有指定exceptionAttribute时,exceptionAttribute就是用默许值exception。
以下是1个简单的例子:
(1)SpringMVC的servlet配置文件中申明1个SimpleMappingExceptionResolver bean,并通过配置属性exceptionMappings和defaultExceptionView来指定异常和视图的对应关系。
-
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
-
<property name="exceptionMappings">
-
<props>
-
<prop key="NumberFormatException">number</prop>
-
<prop key="NullPointerException">null</prop>
-
</props>
-
</property>
-
<property name="defaultErrorView" value="exception"/>
-
<property name="statusCodes">
-
<props>
-
<prop key="number">500</prop>
-
<prop key="null">503</prop>
-
</props>
-
</property>
-
<property name="defaultStatusCode" value="404"/>
-
</bean>
(2)以下访问:
-
@Controller
-
@RequestMapping("/test")
-
public class TestController {
-
-
@RequestMapping("/null")
-
public void testNullPointerException() {
-
Blog blog = null;
-
-
System.out.println(blog.getId());
-
}
-
-
@RequestMapping("/number")
-
public void testNumberFormatException() {
-
-
Integer.parseInt("abc");
-
}
-
-
@RequestMapping("/default")
-
public void testDefaultException() {
-
if (1==1)
-
-
throw new RuntimeException("Error!");
-
}
-
-
}
(3)Jsp页面中可以访问到的异常对象,这里以NumberFormatException的返回视图number.jsp作为示例:
-
<%@ page language="java" import="java.util.*" pageEncoding="GB18030" isErrorPage="true"%>
-
<%
-
String path = request.getContextPath();
-
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
-
%>
-
-
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-
<html>
-
<head>
-
<base href="<%=basePath%>">
-
-
<title>My JSP 'number.jsp' starting page</title>
-
-
<meta http-equiv="pragma" content="no-cache">
-
<meta http-equiv="cache-control" content="no-cache">
-
<meta http-equiv="expires" content="0">
-
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
-
<meta http-equiv="description" content="This is my page">
-
<!--
-
<link rel="stylesheet" type="text/css" href="styles.css">
-
-->
-
-
</head>
-
-
<body>
-
NumberFormatException. <br>
-
<%=exception.getMessage() %><br/>
-
<%=exception %><br/><span style="color: #3366ff;"><!-- 这是JSP中的内置对象exception --></span>
-
-
-
-
<%=request.getAttribute("ex") %><br><span style="color: #3366ff;"><!-- 这是SpringMVC放在返回的Model中的异常对象 --></span>
-
-
-
-
<%=request.getAttribute("javax.servlet.error.status_code") %><span style="color: #3366ff;"><!-- HttpServletResponse返回的毛病码信息,由于前面已配置了NumberFormatException的毛病码返回值为888,所以这里应当显示888 --></span>
-
-
-
-
</body>
-
</html>
(4)当要求/test/number.do的时候会返回定义好的number视图,返回结果以下:
2、使用@ExceptionHandler进行处理
使用@ExceptionHandler进行处理有1个不好的地方是进行异常处理的方法必须与出错的
生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠