本文為原創,歡迎轉載,轉載請注明出處BlogJava。
public abstract class BaseException extends RuntimeException {
private static final long serialVersionUID = -6765360320533958383L;

private String messageCode;

public String getMessageCode() {
return messageCode;
}

public void setMessageCode(String messageCode) {
this.messageCode = messageCode;
}

public BaseException() {
super();
}

public BaseException(String message) {
super(message);
}

public BaseException(String message, Throwable cause) {
super(message, cause);
}

public BaseException(Throwable cause) {
super(cause);
}

public BaseException(String messageCode, String message) {
super(message);
setMessageCode(messageCode);

}

public BaseException(String messageCode, String message, Throwable cause) {
super(message, cause);
setMessageCode(messageCode);
}
public class BusinessException extends BaseException {

private static final long serialVersionUID = -1657938434382769721L;
public BusinessException() {
super();
}
public BusinessException(String message, Throwable cause) {
super(message, cause);
}
public BusinessException(Throwable cause) {
super(cause);
}
public BusinessException(String messageCode, String message) {
super(messageCode, message);
setMessageCode(messageCode);
}
public BusinessException(String messageCode, String message, Throwable cause) {
super(messageCode, message, cause);
setMessageCode(messageCode);
}
}
攔截器類:ErrorHandlingInterceptor.java 用于攔截異常,并在此統一處理
public class ErrorHandlingInterceptor extends AbstractInterceptor {

private static final long serialVersionUID = 1L;

@Override
public String intercept(ActionInvocation invocation) throws Exception {
try {
return invocation.invoke();
} catch (Exception e) {
e.printStackTrace();
handleException(e);
}
return Action.INPUT;
}
/**
* 處理異常
* @param e
*/
private void handleException(Exception e) {
boolean handled = false;
Throwable throwEx = e;
while (throwEx != null) {
if(throwEx instanceof BusinessException) {
BusinessException be = (BusinessException)throwEx;
String errorCode = be.getMessageCode();
// 從緩存中通過ErrorCode取得對應message
// 實現略
String errorMsg = getMessage(errorCode);
// 頁面顯示錯誤提示信息
fillError4Display(errorMsg);
handled = true;
}
throwEx = throwEx.getCause();
}
if(!handled) {
fillDefaultError();
}
}
private HttpServletRequest getRequest() {
return (HttpServletRequest)ActionContext.getContext().get(StrutsStatics.HTTP_REQUEST);
}
private void fillDefaultError() {
fillError4Display("系統忙,請稍候再試。");
}
private void fillError4Display(String msg) {
getRequest().setAttribute("_error_msg_", msg);
}
}
<div id='_err_msg_div'>
<#if Request['_error_msg_']?exists>
${Request['_error_msg_']}
</#if>
</div>

<script type="text/javascript">
if (!this.Message) {
this.Message = {};
(function() {
/**
* show client message
*/
Message.showMsg = function(msg) {
document.getElementById("_err_msg_div").innerHTML = msg;
};
})();
};
</script>
在使用時,只要在頁面上想要展現異常信息的地方插入如下代碼即可:
<#include "/msg.ftl">
Struts2 版本 2.2.1
Freemarker版本 2.3.16
此統一處理的目的在于 Web層、Service層拋出的業務異常以統一的格式顯示在頁面的固定位置。
首先定義我們的業務異常類。


































































攔截器類:ErrorHandlingInterceptor.java 用于攔截異常,并在此統一處理























































攔截所有的異常,并對其進行處理。
當為 自定義的BusinessException時,根據拋出異常時的msgCode,取得對應的顯示信息。
msgCode與顯示信息的對應關系 可先配置好,系統啟動時將其緩存起來。
如果非BusinessException,則統一顯示為 “系統忙,請稍候再試。”
將要顯示的信息設置到Request中,下面來看看Freemarker模板的寫法:
msg.ftl



















在使用時,只要在頁面上想要展現異常信息的地方插入如下代碼即可:

這樣 系統中的異常 將會被統一的顯示。
當使用js做前臺的表單驗證的時候,提示用戶的輸入有問題,則可以使用 Message.showMsg('...'),提示信息也會顯示在同一個位置。
這樣就實現了異常提示信息的統一展示了。
這是一個比較簡易的實現,只提供一個思路。