Struts2的聲明式異常處理

在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

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