1. 程式人生 > >Struts2中將global-exception定位到一個Action中處理,及獲取其異常資訊的方法

Struts2中將global-exception定位到一個Action中處理,及獲取其異常資訊的方法

 通常情況下,會使用Struts2的異常框架對系統中產生的異常進行統一處理,其好處是可以讓開發人員減少程式成中的try catch塊,更多的關於業務處理,並且可以通過global與區域性異常的配合使用,達到理想的效果。

    當使用了這種方式之後,其異常可以指向一個result,該result可以顯示為一個jsp頁面,在該頁面中可以友好的顯示異常資訊,通常顯示異常可以由以下Struts標籤完成:

<s:propertyvalue="exception.message"/>

     以上方式基本滿足異常的處理,但有些情況下,業務上需要處理更多的資訊,一個簡單的異常頁面不能夠滿足需求。這時,我們更希望該異常捕獲後,result能夠定位到一個Action,由此Action進行後續操作。

    要實現這種效果,可以在捕獲異常的result中,使用chain型別的result進行處理。

在處理的Action中以下述方式獲取異常資訊:

    ActionContext.getContext().getValueStack().findValue("exception")

    示例:加入有一個介面系統,所有對外的介面均以XML作為結果輸出,異常使用Struts2的統一異常框架進行處理。其實現方式如下:

   在Struts2的配置檔案中定義異常的處理方式(全域性Exception示例):

   <global-results>

     <resultname="all"type="chain">error</result>

     </global-results>

<global-exception-mappings>

           <exception-mappingresult="all"exception="java.lang.Exception"/>

   </global-exception-mappings>

<actionname="error"class="com.ray.action.ErrorAction">

           <resultname="xmlMessage"></result>

   </action>

    當介面中發生了異常,此時無法將正確的結果返回給客戶端,需要將操作失敗的資訊返回給使用者(以定義的錯誤XML介面返回),同時將異常資訊記錄到日誌中,ErrorAction的操作大致如下所示:

   

   public String execute() {

       HttpServletResponse response = ServletActionContext.getResponse();

       response.setContentType("text/xml;charset=UTF-8");

       response.setHeader("Cache-Controll", "no-cache");

 

       PrintWriter pw = null;

       try{

           pw = response.getWriter();

       } catch(IOException e) {

           e.printStackTrace();

       }

    

       pw.write("<result>"

              + ActionContext.getContext().getValueStack()

                     .findValue("exception") + "</result>");

       pw.close();

 

       return "xmlMessage";

    }