struts的異常處理機(jī)制帶我們很大的方便。通過思考和自己作例子,覺得以下這種方式較為靈活:
首先為你的應(yīng)用程序定制一套異常類。例如,先定義一個基類(可以是虛類),注重,在此它擴(kuò)展自RuntimeException,這是為了在struts的action中順利捕捉到。
public class BaseException extends RuntimeException {...}
下來你可以定義幾個子類,例如:Dao異常,事務(wù)處理異常,service異常等。在sPRing中,包
org.springframework.dao下定義了一套Dao異常,值得大家學(xué)習(xí)一下。
接著,在struts-cofig.xml文件中定義全局異常如下,此處的key屬性我已經(jīng)不預(yù)備用了:
<global-exceptions>
<exception key="todo" type="org.chage.exception.BaseException" handler="org.chage.exception.MyExceptionHandler" />
</global-exceptions>
下面看一下我的處理異常的類:
package org.chage.exception;
import org.apache.struts.action.ExceptionHandler;
import ...
public class MyExceptionHandler extends ExceptionHandler {
public ActionForward execute(
Exception exception,
ExceptionConfig config,
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws ServletException
{
request.setAttribute("exception", exception);
//返回原始請求的Forward,當(dāng)然你也可以定義一個全局異常ForWord,都轉(zhuǎn)向它
return mapping.getInputForward();
}
}
在頁面上(此頁面我們設(shè)置為請求action,即發(fā)生異常的action的input屬性),我們顯示錯誤信息時可以使用struts標(biāo)簽如下,注重,這里顯示的信息和資源屬性文件無關(guān),是你自己拋出的:
<logic:present name="exception">
<bean:write name="exception"/>
</logic:present>
這樣作的好處在哪里呢?我們來看一下,一般我們的思路是,發(fā)生了邏輯錯誤,比如說,用戶名輸重復(fù),或者預(yù)備修改的數(shù)據(jù)已被他人刪除等,我們要捕捉它并顯示給用戶,第一感是在action中作的,例如:
try{
//do something logic method...
}catch (XXXException e){
ActionErrors errors= new ActionErrors();
ActionError error=new ActionError("error.missing.username");
errors.add("error.xxx",error);
saveErrors(request,errors);
return mapping.findForward("errorPage");
}
設(shè)計(jì)良好的action應(yīng)該僅僅是web層的一個“路標(biāo)指引器”,真正的邏輯方法是調(diào)用其他的業(yè)務(wù)bean來完成的,簡單地說,通常認(rèn)為action中的代碼越少越好.假如采用了上面那種全局異常處理機(jī)制,action此時就可以不用管邏輯異常了,由業(yè)務(wù)bean負(fù)責(zé)拋出就可以了,大家就可以少寫一些action中的try catch 語塊了,也可以繞開ActionError,思路上是不是更清楚?異常在真正發(fā)生的類中被拋出,然后向上傳遞,一直傳到action中,struts負(fù)責(zé)捕捉之,當(dāng)然這里的異常你必須已經(jīng)定義過了。
注:
1. 假如你不想寫 MyExceptionHandler 類,當(dāng)然struts-config.xml中的handler=屬性也要去掉,還有一種辦法可以顯示錯誤信息在 jsp頁上,先引用jstl標(biāo)簽庫,然后如下:
<c:out value="${requestScope['org.apache.struts.action.EXCEPTION'].message}"/>
新聞熱點(diǎn)
疑難解答
圖片精選