Struts2异常处理机制
任何成熟的MVC框架都應該提供成就的異常處理機制,Strut2也不例外。Struts2提供了一種聲明式的異常處理方式,Struts2也是通過配置的攔截器來實現異常處理機制的。
一、? 異常處理機制
1. 配置
Struts2的異常處理機制是:通過在struts.xml文件中配置﹤exception-mapping …﹥元素完成的,配置該元素時,需要指定兩個屬性:
exception:此屬性指定該異常映射所設置的異常類型。
result:此屬性指定Action出現該異常時,系統轉入result屬性所指向的結果。
異常映射也分為兩種:
局部異常映射:<exception-mapping…>元素作為<action…>元素的子元素配置。
全局異常映射:<exception-mapping…>元素作為<global-exception-mappings>元素的子元素配置。
2. 輸出異常信息
使用Struts2的標簽來輸出異常信息:
<s:property value="exception.message"/>:輸出異常對象本身。
<s:property value="exceptionStack"/>: 輸出異常堆棧信息。
利用struts2的異常處理機制和攔截器機制,可以很方便的實現異常處理功能,你不再需要在Action中捕獲異常,并拋出相關的異常了,這些都交給攔截器來幫你做了。
二、? 應用示例
1. 配置struts.xml文件
1.? 在 struts.xml 文件中,聲明全局異常映射,以及對應的全局異常轉發如下所示:
<global-results>
?????????? <result name="error">/admin/error/ErrDisplay.ftl</result>
?????? </global-results>
??????
?????? <global-exception-mappings>
?????????? <exception-mapping result="error"
????????????? exception="org.basis.common.exception.SystemException"></exception-mapping>
?????? </global-exception-mappings>
2. 異常處理類
SystemException是異常處理類,代碼如下所示:
package org.basis.common.exception;
?
public class SystemException extends RuntimeException {
?
??? private static final long serialVersionUID = 1L;
?
??? public SystemException(String frdMessage) {
?????? super(createFriendlyErrMsg(frdMessage));
??? }
?
??? public SystemException(Throwable throwable){
?????? super(throwable);
??? }
?
??? public SystemException(Throwable throwable, String frdMessage){
?????? super(throwable);
??? }
?
??? /**
??? ?* 創建友好的報錯信息
??? ?* */
??? private static String createFriendlyErrMsg(String msgBody) {
?????? String prefixStr = "抱歉。";
?????? String suffixStr = "請稍后再試或與管理員聯系!";
?????? StringBuffer friendlyErrMsg = new StringBuffer();
?????? friendlyErrMsg.append(prefixStr);
?????? friendlyErrMsg.append(msgBody);
?????? friendlyErrMsg.append(suffixStr);
?????? return friendlyErrMsg.toString();
??? }
?
}
3. 全局異常處理頁面
在系統的/WebRoot/common/global/目錄下,新建一個全局的異常處一頁面errorPage.jsp。這個頁面很簡單。
JAVA代碼:errorPage.jsp
<%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page isErrorPage="true"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%
??? response.setHeader("Cache-Control","no-cache");
??? response.setHeader("Cache-Control","no-store");
??? response.setDateHeader("Expires",0);
??? response.setHeader("Pragma","no-cache");
%>
<html>
<head>
<script language="javascript">
function showContent(){
??? if(document.getElementById("errorMessage").style.display == 'block'){
?????? document.getElementById("errorMessage").style.display = 'none';
??? }else{
?????? document.getElementById("errorMessage").style.display = 'block';
??? }
}
</script>
</head>
<body scroll="auto">
<table width="100%" height="100%" border="0" cellpadding="0" cellspacing="0">
<tr>
??? <td align="center" class="bg" valign="top">
?????? <table width="100%" border="0" cellspacing="0" cellpadding="0" style="table-layout:fixed;word-break:break-all;">
?????????? <tr>
????????????? <td align="center" width="100%" height="80">
????????????????? <img src="${pageContext.request.contextPath}/common/images/basis/systemException.gif" border="0" align="absmiddle">?? <s:property value="exception.message" />???????????????????
????????????? </td>
?????????? </tr>
?????????? <tr>
????????????? <td height="30" align="center">
????????????????? <a href="#" οnclick="javascript:history.go(-1);"><s:text name="global.return"/></a>
????????????????? <a href="#" οnclick="javascript:showContent();">查看詳細信息</a>
????????????? </td>
?????????? </tr>
?????????? <tr>
????????????? <td align="left" valign="top">
????????????????? <!-- 異常堆棧信息(開發人員用) -->
????????????? ??? <div style="display:none;" id="errorMessage">
????????????? ??? <pre>?? <s:property value="exceptionStack" /></pre>
????????????? ??? </div>
????????????? </td>
?????????? </tr>
?????? </table>
??? </td>
</tr>
</table>
</body>
</html>
4. 自定義異常攔截器類
在這里,應用自定義的異常攔截器,在攔截器中,捕獲常見的異常,并以友好異常信息拋出,相關代碼如下所示:
JAVA代碼:ExceptionInterceptor.java
package org.basis.struts.interceptor;
?
import java.io.IOException;
import java.sql.SQLException;
import org.basis.common.exception.SystemException;
import org.springframework.dao.DataAccessException;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
?
@SuppressWarnings("serial")
public class ExceptionInterceptor extends AbstractInterceptor {
?
??? @SuppressWarnings("unchecked")
??? public String intercept(ActionInvocation actionInvocation) throws Exception {
?????? String result = "";
?????? try {
?????????? result = actionInvocation.invoke();
?????? } catch (DataAccessException ex) {
?????????? throw new SystemException("數據庫操作失敗!");
?????? } catch (NullPointerException ex) {
?????????? throw new SystemException("空指針,調用了未經初始化或者是不存在的對象!");
?????? } catch (IOException ex) {
?????????? throw new SystemException("IO讀寫異常!");
?????? } catch (ClassNotFoundException ex) {
?????????? throw new SystemException("指定的類不存在!");
?????? } catch (ArithmeticException ex) {
?????????? throw new SystemException("數學運算異常!");
?????? } catch (ArrayIndexOutOfBoundsException ex) {
?????????? throw new SystemException("數組下標越界!");
?????? } catch (IllegalArgumentException ex) {
?????? ??? throw new SystemException("調用方法的參數錯誤!");
?????? } catch (ClassCastException ex) {
?????????? throw new SystemException("類型強制轉換錯誤!");
?????? } catch (SecurityException ex) {
?????????? throw new SystemException("違背安全原則異常!");
?????? } catch (SQLException ex) {
?????????? throw new SystemException("操作數據庫異常!");
?????? } catch (NoSuchMethodError ex) {
?????????? throw new SystemException("調用了未定義的方法!");
?????? } catch (InternalError ex) {
?????????? throw new SystemException("Java虛擬機發生了內部錯誤!");
?????? } catch (Exception ex) {
?????????? throw new SystemException("程序內部錯誤,操作失敗!");
?????? }
?????? return result;
??? }
}
5. 配置異常攔截器
配置這個攔截器,代碼如下:
struts.xml文件局部:
<interceptors>
?????????? <interceptor name="checkLogin" class="org.basis.struts.interceptor.CheckLoginInterceptor" />
?????????? <interceptor name="checkException" class="org.basis.struts.interceptor.ExceptionInterceptor" />
?????????? <!-- 定義一個攔截器棧 -->
?????????? <interceptor-stack name="mydefault">
????????????? <interceptor-ref name="defaultStack" />
????????????? <interceptor-ref name="checkException" />
?????????? </interceptor-stack>
?????? </interceptors>
?????? <default-interceptor-ref name="mydefault" />
?
?????? <global-results>
?????????? <result name="error">/common/global/errorPage.jsp</result>
?????? </global-results>
??????
?????? <global-exception-mappings>
?????????? <exception-mapping result="error"
????????????? exception="org.basis.common.exception.SystemException"></exception-mapping>
?????? </global-exception-mappings>
經過這樣處理,Struts2做異常處理還是比較方便的了。
6. 實際應用效果
下面我們修改一下前面國際華的那個Action,讓它拋一個錯誤。
package demo.struts2.action;
?
import java.util.ArrayList;
import java.util.List;
import com.opensymphony.xwork2.ActionSupport;
?
public class MessageAction extends ActionSupport {
?
??? public String execute() throws Exception {
?????? // getText(String) string為key
?????? String str1 = getText("label.helloWorld");
?????? System.out.println(str1);
?????? // 帶參數的
?????? String str2 = getText("label.hello", new String[] { "fjf" });
?????? System.out.println(str2);
?
?????? // 與上一種實現一樣
?????? List l = new ArrayList();
?????? l.add("callan");
?????? String str3 = getText("label.hello", l);
?????? System.out.println(str3);
??????
?????? String str4 = getText("userName.required");
?????? System.out.println(str4);
??????
?????? int i = 1/0;
?
?????? return SUCCESS;
??? }
}
總結
以上是生活随笔為你收集整理的Struts2异常处理机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: struts2配置详解(struts.x
- 下一篇: MyEclipse10.0