SpringMVC對(duì)異常處理的支持
來(lái)源:程序員人生 發(fā)布時(shí)間:2015-01-07 08:11:04 閱讀次數(shù):2538次
不管做甚么項(xiàng)目,進(jìn)行異常處理都是非常有必要的,而且你不能把1些只有程序員才能看懂的毛病代碼拋給用戶去看,所以這時(shí)候候進(jìn)行統(tǒng)1的異常處理,展現(xiàn)1個(gè)比較友好的毛病頁(yè)面就顯得很有必要了。跟其他MVC框架1樣,springMVC也有自己的異常處理機(jī)制。
springMVC提供的異常處理主要有兩種方式,1種是直接實(shí)現(xiàn)自己的HandlerExceptionResolver,固然這也包括使用Spring已為我們提供好的SimpleMappingExceptionResolver和DefaultHandlerExceptionResolver,另外一種是使用注解的方式實(shí)現(xiàn)1個(gè)專門(mén)用于處理異常的Controller――ExceptionHandler。
1、實(shí)現(xiàn)自己的HandlerExceptionResolver,HandlerExceptionResolver是1個(gè)接口,springMVC本身已對(duì)其有了1個(gè)本身的實(shí)現(xiàn)――DefaultHandlerExceptionResolver,該解析器只是對(duì)其中的1些比較典型的異常進(jìn)行了攔截,然后返回對(duì)應(yīng)的毛病碼,固然你也能夠繼承DefaultHandlerExceptionResolver類,然后重寫(xiě)其中的1些異常處理方法來(lái)實(shí)現(xiàn)自己的異常處理。
-
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個(gè)參數(shù)表示對(duì)哪一種類型的異常進(jìn)行處理。由于Exception類是所有異常類的基類,所以如果想根據(jù)異常類型的不同來(lái)進(jìn)行不同的處理的話,可以在resolveException方法里面根據(jù)不同的異常類型進(jìn)行不同的處理,返回不同的異常視圖。如:
-
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個(gè)異常處理器以后就要在applicationContext中定義這樣1個(gè)bean對(duì)象,如:
-
<bean id="exceptionResolver" class="com.tiantian.xxx.web.handler.ExceptionHandler"/>
Spring除實(shí)現(xiàn)了1個(gè)DefaultHandlerExceptionResolver以外,還實(shí)現(xiàn)了1個(gè)SimpleMappingExceptionResolver,這二者都是繼承自抽象類AbstractHandlerExceptionResolver,而AbstractHandlerExceptionResolver是實(shí)現(xiàn)了HandlerExceptionResolver接口的resolveException方法的,并由此抽取出兩個(gè)抽象方法,1個(gè)是在進(jìn)行異常處理之前履行的方法prepareResponse(exception,
response),1個(gè)是進(jìn)行異常解析的doResolveException(request, response, handler, exception)方法。SimpleMappingExceptionResolver,顧名思義就是通過(guò)簡(jiǎn)單的映照關(guān)系來(lái)決定由哪一個(gè)視圖來(lái)處應(yīng)當(dāng)前的毛病信息。SimpleMappingExceptionResolver提供了通過(guò)異常類型exceptionMappings來(lái)進(jìn)行異常與視圖之間的映照關(guān)系,提供了在產(chǎn)生異常時(shí)通過(guò)statusCodes來(lái)映照異常返回的視圖名稱和對(duì)應(yīng)的HttpServletResponse的返回碼。而且可以通過(guò)defaultErrorView和defaultErrorCode來(lái)指定默許值,defaultErrorView表示當(dāng)沒(méi)有在exceptionMappings里面找到對(duì)應(yīng)的異常類型時(shí)就返回defaultErrorView定義的視圖,defaultErrorCode表示在產(chǎn)生異常時(shí)當(dāng)沒(méi)有在視圖與返回碼的映照關(guān)系statusCodes里面找到對(duì)應(yīng)的映照時(shí)默許返回的返回碼。在使用SimpleMappingExceptionResolver時(shí),當(dāng)產(chǎn)生異常的時(shí)候,SimpleMappingExceptionResolver將會(huì)把當(dāng)前的異常對(duì)象放到本身屬性exceptionAttribute中,當(dāng)沒(méi)有指定exceptionAttribute時(shí),exceptionAttribute就是用默許值exception。
以下是1個(gè)簡(jiǎn)單的例子:
(1)SpringMVC的servlet配置文件中申明1個(gè)SimpleMappingExceptionResolver bean,并通過(guò)配置屬性exceptionMappings和defaultExceptionView來(lái)指定異常和視圖的對(duì)應(yīng)關(guān)系。
-
<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)以下訪問(wèn):
-
@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頁(yè)面中可以訪問(wèn)到的異常對(duì)象,這里以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中的內(nèi)置對(duì)象exception --></span>
-
-
-
-
<%=request.getAttribute("ex") %><br><span style="color: #3366ff;"><!-- 這是SpringMVC放在返回的Model中的異常對(duì)象 --></span>
-
-
-
-
<%=request.getAttribute("javax.servlet.error.status_code") %><span style="color: #3366ff;"><!-- HttpServletResponse返回的毛病碼信息,由于前面已配置了NumberFormatException的毛病碼返回值為888,所以這里應(yīng)當(dāng)顯示888 --></span>
-
-
-
-
</body>
-
</html>
(4)當(dāng)要求/test/number.do的時(shí)候會(huì)返回定義好的number視圖,返回結(jié)果以下:

2、使用@ExceptionHandler進(jìn)行處理
使用@ExceptionHandler進(jìn)行處理有1個(gè)不好的地方是進(jìn)行異常處理的方法必須與出錯(cuò)的
生活不易,碼農(nóng)辛苦
如果您覺(jué)得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)