Struts2中將global-exception定位到一個Action中處理,及獲取其異常資訊的方法
阿新 • • 發佈:2019-01-24
通常情況下,會使用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"; }