Spring MVC異常處理

學編程吧Spring MVC異常處理髮布了,歡迎通過xuebiancheng8.com來訪問

Spring3.0中對異常的處理方法一共提供了兩種:一種是使用HandlerExceptionResolver接口;一種是在Controller類內部使用@ExceptionHandler註解。使用第一種方式可以實現全局異常控制,並且Spring已經提供了一個默認的實現類SimpleMappingExceptionResolver;使用第二種方式可以在Controller內部實現更個性化點異常處理方式,靈活性更高。一般來說,項目中只需要採用第一種方式就可以了,每個人都自己定義異常的展現方式,太過個性了,不統一。

 

從目前的調查結果看,這兩種方式不能共存,不知道未來的版本是否能將他們合二爲一,這樣才能靈活配置。

基於HandlerExceptionResolver接口的異常處理:

使用這種方式只需要實現resolveException方法,該方法返回一個ModelAndView對象,在方法內部對異常的類型進行判斷,然後常見合適的ModelAndView對象,如果該方法返回了null,則Spring會繼續尋找其他的實現了HandlerExceptionResolver 接口的Bean。換句話說,Spring會搜索所有註冊在其環境中的實現了HandlerExceptionResolver接口的Bean,逐個執行,直到返回了一個ModelAndView對象。

示例代碼:

Java代碼  

  1. /** 

  2.  * 基於HandlerExceptionResolver接口的異常處理類 

  3.  * @author ZYWANG 2011-4-2 

  4.  */  

  5. public class CustomExceptionHandler implements HandlerExceptionResolver {  

  6.   

  7.     @Override  

  8.     public ModelAndView resolveException(HttpServletRequest request,  

  9.             HttpServletResponse response, Object object, Exception exception) {  

  10.         if(exception instanceof IOException){  

  11.             return new ModelAndView("ioexp");  

  12.         }else if(exception instanceof SQLException){  

  13.             return new ModelAndView("sqlexp");  

  14.         }  

  15.         return null;  

  16.     }  

  17.   

  18. }  

這個類必須聲明到Spring中去,讓Spring管理它,你可以使用@Component標籤,也可以使用<bean/>節點。爲了簡單的進行異常處理,Spring提供了SimpleMappingExceptionResolver類,該類實現了HandlerExceptionResolver接口,需要使用時只需要使用<bean/>節點進行聲明即可,示例如下:

Xml代碼  

  1. <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">  

  2.     <!-- 定義默認的異常處理頁面,當該異常類型的註冊時使用 -->  

  3.     <property name="defaultErrorView" value="error"></property>  

  4.     <!-- 定義異常處理頁面用來獲取異常信息的變量名,默認名爲exception -->  

  5.     <property name="exceptionAttribute" value="ex"></property>  

  6.     <!-- 定義需要特殊處理的異常,用類名或完全路徑名作爲key,異常也頁名作爲值 -->  

  7.     <property name="exceptionMappings">  

  8.         <props>  

  9.             <prop key="IOException">error/ioexp</prop>  

  10.             <prop key="java.sql.SQLException">error/sqlexp</prop>  

  11.         </props>  

  12.     </property>  

  13. </bean>  

通過SimpleMappingExceptionResolver我們可以將不同的異常映射到不同的jsp頁面(通過exceptionMappings屬性的配置),同時我們也可以爲所有的異常指定一個默認的異

常提示頁面(通過defaultErrorView屬性的配置),如果所拋出的異常在exceptionMappings中沒有對應的映射,則Spring將用此默認配置顯示異常信息(注意這裏配置的異常顯示界面均僅包括主文件名,至於文件路徑和後綴已經在viewResolver中指定)。

一個典型的異常顯示頁面如下: 
<html> 
<head><title>Exception!</title></head> 
<body> 
<% Exception ex = (Exception)request.getAttribute("exception"); %> 
<H2>Exception: <%= ex.getMessage();%></H2> 
<P/> 
<% ex.printStackTrace(new java.io.PrintWriter(out)); %> 
</body> 
</html> 
exception 實在SimpleMappingExceptionResolver 被存放到request中的,具體可以查看源代碼。 
如果SimpleMappingExceptionResolver無法滿足異常處理的需要,我們可以針對 
HandlerExceptionResolver接口實現自己異常處理類,這同樣非常簡單(只需要實現一個 
resolveException方法)。 

如果有ViewResolver,則制定的jsp頁面必須在那個頁面下,到時候如果找不到頁面,可以根據錯誤提示再調整頁面路徑

 

基於@ExceptionHandler的異常處理:

該方法需要定義在Controller內部,然後創建一個方法並用@ExceptionHandler註解來修飾用來處理異常,這個方法基本和 @RequestMapping修飾的方法差不多,只是可以多一個類型爲Exception的參數,@ExceptionHandler中可以添加一個或多個異常的類型,如果爲空的話則認爲可以觸發所有的異常類型錯誤。

示例代碼:

Java代碼  

  1. /** 

  2.  * 基於@ExceptionHandler異常處理 

  3.  * @author ZYWANG 2011-4-2 

  4.  */  

  5. @Controller  

  6. public class ExceptionHandlerController {  

  7.       

  8.     @ExceptionHandler(value={IOException.class,SQLException.class})  

  9.     public String exp(Exception ex,HttpServletRequest request) {  

  10.         request.setAttribute("ex", ex);  

  11.         return "/error.jsp";  

  12.     }  

  13.   

  14. }  

學編程吧Spring MVC異常處理髮布了,歡迎通過xuebiancheng8.com來訪問。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章