Spring MVC學習-----------異常處理以及日誌記錄
如何實現全域性的異常處理?
在spring MVC的配置檔案中:
Xml程式碼- <!-- 總錯誤處理-->
- <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
- <property name="defaultErrorView">
- <value>/error/error</value>
-
</property>
- <property name="defaultStatusCode">
- <value>500</value>
- </property>
- <property name="warnLogCategory">
- <value>org.springframework.web.servlet.handler.SimpleMappingExceptionResolver</value>
- </property>
-
</bean
這裡主要的類是SimpleMappingExceptionResolver類,和他的父類AbstractHandlerExceptionResolver類。
具體可以配置哪些屬性,我是通過檢視原始碼知道的。
你也可以實現HandlerExceptionResolver介面,寫一個自己的異常處理程式。spring的擴充套件性是很好的。
通過SimpleMappingExceptionResolver我們可以將不同的異常對映到不同的jsp頁面(通過exceptionMappings屬性的配置)。
同時我們也可以為所有的異常指定一個預設的異常提示頁面(通過defaultErrorView屬性的配置),如果所丟擲的異常在exceptionMappings中沒有對應的對映,則Spring將用此預設配置顯示異常資訊。
注意這裡配置的異常顯示介面均僅包括主檔名,至於檔案路徑和字尾已經在viewResolver中指定。如/error/error表示/error/error.jsp
顯示錯誤的jsp頁面:
Html程式碼- <%@ page language="java" contentType="text/html; charset=GBK"
- pageEncoding="GBK"%>
- <%@ page import="java.lang.Exception"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=GBK">
- <title>錯誤頁面</title>
- </head>
- <body>
- <h1>出錯了</h1>
- <%
- Exception e = (Exception)request.getAttribute("exception");
- out.print(e.getMessage());
- %>
- </body>
- </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。