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對應的消息
注:每一步執行的前提是在上一步未搜索到的情況下