在struts2應用程序中你還在使用try catch語句來捕獲異常麼?如果是這樣的,那你OUT啦!struts2支持聲明式異常處理,可以再Action中直接拋出異常而交給struts2來處理,當然需要我們在xml文件中配置,由於拋出同樣的異常的處理方法通常都一樣,所以如果能在xml中配置全局異常,將會使得開發便捷性大大提高。
以前的異常捕獲可能是這樣的:
/** *
執行更新 *
*
@return */ public String
update() { Article
article = new Article(); article.setContent(content); article.setTitle(title); article.setId(id); try { articleService.update(article); return SUCCESS; }
catch (SQLException
e) { e.printStackTrace(); return ERROR; }
catch (InvalidInputException
e) { e.printStackTrace(); System.out.println( "輸入非法" ); return ERROR; } } |
這種方式是完全的手動處理異常,一來不夠簡潔明快,而且還不容易維護,畢竟如果修改了這些代碼都需要再次編譯。
採用struts2的聲明式異常處理就會簡單很多了。
首先,上面的代碼的try catch 就可以全都不要了,但是,當然,得新加throw語句拋出異常:
/** *
執行更新 *
*
@return *
@throws InvalidInputException *
@throws SQLException */ public String
update() throws SQLException,
InvalidInputException { Article
article = new Article(); article.setContent(content); article.setTitle(title); article.setId(id); articleService.update(article); return SUCCESS; } |
代碼清晰了很多,不是麼?
捕獲異常的任務則交給xml配置文件了,配置文件還是比較容易理解的:
< package name="wow"
extends="struts-default"> < global-results > < result name="sql">/internal_Error.jsp</ result > < result name="invalidinput">/invalid_Input.jsp</ result > < result name="naming">/internal_Error.jsp</ result > </ global-results > < global-exception-mappings > < exception-mapping result="sql"
exception="java.sql.SQLException"></ exception-mapping > < exception-mapping result="invalidinput" exception="cn.codeplus.exception.InvalidInputException"></ exception-mapping > < exception-mapping result="naming" exception="javax.naming.NamingException"></ exception-mapping > </ global-exception-mappings > < action name="*_*"
class="cn.codeplus.action.{2}Action" method="{1}"> < result name="success">/{1}_{2}_success.jsp</ result > < result name="error">/{1}_{2}_error.jsp</ result > <!--<exception-mapping
result="sql" exception="java.sql.SQLException"></exception-mapping>--> </ action > </ package > |
用於異常處理的<exception-mapping>標籤可以配置在Action中,也可以配置在<global-exception-mappings>,顧名思義<global-exception-mappings>就是全局異常,當然執行Action的時候發生異常時,如果在Action中沒有捕獲異常而是拋出異常的話,struts2會首先在正在執行的Action中查找<exception-mapping>,尋找對應的Exception進行處理,如果找不到,纔會去<global-exception-mappings>去尋找對應的Exception處理,如果還是找不到的話,就只好拋出異常了。
下面說說異常處理:
< exception-mapping result="sql"
exception="java.sql.SQLException"></ exception-mapping > |
上面代碼說明,當捕獲java.sql.SQLException時候,去尋找對應的result爲sql的視圖返回,即<global-result>中name爲sql的result去返回internal_Error.jsp。當然如果<exception-mapping>配置在action中的話,則會首先去action的result搜尋返回視圖,失敗了纔會去搜尋<global-result>。
在我們編寫上面的xml配置的時候可能會遇到如下錯誤:
這個是因爲,我們xml配置文件各個標籤<action>、<global-result>、<global-exception-mapping>的順序不對,調整一下標籤的順序,符合黃色的提示語即可。
最後,我們說說視圖層怎樣獲取異常信息,invalid_Input.jsp文件是這樣的:
... <%@taglib
prefix="s" uri="/struts-tags"%> ... < body > < jsp:include page="nav.jsp"></ jsp:include > < div > 抱歉,服務器內部錯誤。 </ div > < div > < s:property value="exception.message"/> </ div > < s:debug ></ s:debug > </ body > ... |
< s:property value="exception.message"/>表示從valuestack中獲取錯誤信息,顯示在前臺頁面上。當然,我們也可以選擇更人性化得處理方案,比如說,放個失望的表情,寫上“抱歉,服務器內部錯誤,您可以發郵件給我們提示此錯誤,[email protected]”等等; |
經測試,當發生SQLException的時候,頁面信息如下: |
好了,很高興來到園子,嘿嘿,希望這篇文章對大家有用。
原文地址:http://www.cnblogs.com/codeplus/archive/2011/07/16/2107999.html