1. 程式人生 > >Spring MVC學習-----------異常處理以及日誌記錄

Spring MVC學習-----------異常處理以及日誌記錄

如何實現全域性的異常處理?

在spring MVC的配置檔案中:

Xml程式碼  收藏程式碼
  1. <!-- 總錯誤處理-->  
  2. <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">  
  3.     <property name="defaultErrorView">    
  4.         <value>/error/error</value>  
  5.     </property>
      
  6.     <property name="defaultStatusCode">    
  7.         <value>500</value>  
  8.     </property>     
  9. <property name="warnLogCategory">    
  10.         <value>org.springframework.web.servlet.handler.SimpleMappingExceptionResolver</value>  
  11.     </property>     
  12. </bean
    >   

這裡主要的類是SimpleMappingExceptionResolver類,和他的父類AbstractHandlerExceptionResolver類。

具體可以配置哪些屬性,我是通過檢視原始碼知道的。

你也可以實現HandlerExceptionResolver介面,寫一個自己的異常處理程式。spring的擴充套件性是很好的。

通過SimpleMappingExceptionResolver我們可以將不同的異常對映到不同的jsp頁面(通過exceptionMappings屬性的配置)。

同時我們也可以為所有的異常指定一個預設的異常提示頁面(通過defaultErrorView屬性的配置),如果所丟擲的異常在exceptionMappings中沒有對應的對映,則Spring將用此預設配置顯示異常資訊。

注意這裡配置的異常顯示介面均僅包括主檔名,至於檔案路徑和字尾已經在viewResolver中指定。如/error/error表示/error/error.jsp

顯示錯誤的jsp頁面:

Html程式碼  收藏程式碼
  1. <%@ page language="java" contentType="text/html; charset=GBK"  
  2.     pageEncoding="GBK"%>  
  3. <%@ page import="java.lang.Exception"%>  
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  5. <html>  
  6. <head>  
  7. <meta http-equiv="Content-Type" content="text/html; charset=GBK">  
  8. <title>錯誤頁面</title>  
  9. </head>  
  10. <body>  
  11. <h1>出錯了</h1>  
  12. <%  
  13. Exception e = (Exception)request.getAttribute("exception");  
  14. out.print(e.getMessage());  
  15. %>  
  16. </body>  
  17. </html>  

其中一句:request.getAttribute("exception"),key是exception,也是在SimpleMappingExceptionResolver類預設指定的,是可能通過配置檔案修改這個值的,大家可以去看原始碼。

如何把全域性異常記錄到日誌中?

在前的配置中,其中有一個屬性warnLogCategory,值是“SimpleMappingExceptionResolver類的全限定名”。我是在SimpleMappingExceptionResolver類父類AbstractHandlerExceptionResolver類中找到這個屬性的。檢視原始碼後得知:如果warnLogCategory不為空,spring就會使用apache的org.apache.commons.logging.Log日誌工具,記錄這個異常,級別是warn。

值:“org.springframework.web.servlet.handler.SimpleMappingExceptionResolver”,是“SimpleMappingExceptionResolver類的全限定名”。這個值不是隨便寫的。  因為我在log4j的配置檔案中還要加入log4j.logger.org.springframework.web.servlet.handler.SimpleMappingExceptionResolver=WARN,保證這個級別是warn的日誌一定會被記錄,即使log4j的根日誌級別是ERROR。