輕量級JavaEE企業應用實戰(十二)

Struts2的異常處理機制

我們在execute犯法中使用try—catch方法可以捕獲異常,當捕捉到指定異常時,系統返回對應邏輯視圖名。這種方式完全是手動處理異常,可維護性不好;
Struts2允許通過struts.xml文件來配置異常的處理,通過此方法我們無需在execute中進行異常捕捉,僅需在struts.xml中配置異常處理;爲了使用這種機制,需要打開異常映射功能需要的攔截器

<interceptors>
    <interceptor name="exception" class="com.opensymphony
        .xwork.interceptor.ExceptionMapping.Interceptor" />
    <interceptor-stack name="defaultStack"
        <interceptor-ref name="exception" />
    </interceptor-stack>
</interceptors>

聲明式異常捕捉

Struts2異常處理機制,在struts.xml中配置exception-mapping元素,需要以下屬性:
exception:指定該異常映射所設置的異常類型
result:指定Action出現該異常時,系統返回result屬性值對應的邏輯視圖名

public class LoginAction implements Action {
    ...
    if(getUsername().equalsIngoreCase("sql")) {
        throw new java.sql.SQLException("用戶名不能爲SQL");
    }

    if(getUsername().equalsIngoreCase("user")) {
        throw newe MyException("自定義異常");
    }
}

<global-exception-mappings>
    <exception-mapping exception="java.sql.SQLException" result="sql">
    <exception-mapping exception="java.lang.Exception" result="root">

    <action name="login" class="com.action.LoginAction">
        <exception-mapping exception="com.exception.MyException">
        ...
    </action>
</global-exception-mappings>

輸出異常信息

<s:property value="exception" /> 輸出異常對象本身
<s:property value="exceptionStack" /> 輸出異常堆棧信息

使用國際化文件

<constant name="struts.custom.i18n.resources"    value="messageResource" />
輸出:
<s:text name="propertiesKey" />

輸出帶佔位符的國際化消息:使用<s:param />標籤來替代佔位符的值,支持多個

welcomeMsg = {0},您好,現在時間是{1}

<jsp:useBean id="d" class="java.util.Date" scope="page" />
<s:text name="welcomeMsg">
    <s:param><s:property value="username"></s:param>
    <s:param>${d}</s:param>
</s:text>

另外方式:

welcomeMsg = ${username},您好,現在時間是{0}

<s:text name="welcomeMsg">
    <s:param>${d}</s:param>
</s:text>

加載資源文件的方式

爲Struts2應用指定包範圍資源文件的方法:
在包的根路徑下建立多個文件名爲page_language_country.properties的文件,一旦建立了這個系列的國際化資源文件,應用中處於該包下的所有Action都可以訪問該資源文件
注:如果有中文和英文兩種資源文件,會根據語言環境優先選擇

臨時指定資源文件
<s:i18n name="tmp">
    <s:text name="loginPage">
</s:i18n>

<s:i18n name="tmp">
    <s:form action="login">
        <s:textfield name="username" key="user"> //key爲資源文件左邊部分
        <s:textfield name="password" key="pass">
        <s:submit key="login" />
    </s:form>
</s:i18n>

加載資源文件的效率

假設:我們需要在ChildAction中訪問國際化文件
1.優先加載系統中保存在ChildAction的類文件相同位置
2.假如ChildAction有父類,則加載parentAction的類相同位置,且baseName爲ParentAction的系列資源文件
3.假如ChildAction由實現接口,則加載系統保存在IChildAction的類相同文件,且baseName爲IChildAction的系列資源文件
4.假如ChildAction有實現接口ModelDriven,則對於getModel()方法返回的對象,重新執行第一步操作
5.查找當前包下baseName爲package的系列資源文件
6.沿着當前包上溯,知道最頂層包來查找baseName爲package的系列資源文件
7.查找struts.custom.i18n.resources常量指定baseName的系列資源文件
8.系統停止搜索,直接輸出該key對應的消息
注:每一步執行的前提是在上一步未搜索到的情況下

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