本文為原創(chuàng),歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明出處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 用于攔截異常,并在此統(tǒng)一處理
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取得對(duì)應(yīng)message
// 實(shí)現(xiàn)略
String errorMsg = getMessage(errorCode);
// 頁面顯示錯(cuò)誤提示信息
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("系統(tǒng)忙,請(qǐng)稍候再試。");
}
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>
在使用時(shí),只要在頁面上想要展現(xiàn)異常信息的地方插入如下代碼即可:
<#include "/msg.ftl">
Struts2 版本 2.2.1
Freemarker版本 2.3.16
此統(tǒng)一處理的目的在于 Web層、Service層拋出的業(yè)務(wù)異常以統(tǒng)一的格式顯示在頁面的固定位置。
首先定義我們的業(yè)務(wù)異常類。


































































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























































攔截所有的異常,并對(duì)其進(jìn)行處理。
當(dāng)為 自定義的BusinessException時(shí),根據(jù)拋出異常時(shí)的msgCode,取得對(duì)應(yīng)的顯示信息。
msgCode與顯示信息的對(duì)應(yīng)關(guān)系 可先配置好,系統(tǒng)啟動(dòng)時(shí)將其緩存起來。
如果非BusinessException,則統(tǒng)一顯示為 “系統(tǒng)忙,請(qǐng)稍候再試。”
將要顯示的信息設(shè)置到Request中,下面來看看Freemarker模板的寫法:
msg.ftl



















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

這樣 系統(tǒng)中的異常 將會(huì)被統(tǒng)一的顯示。
當(dāng)使用js做前臺(tái)的表單驗(yàn)證的時(shí)候,提示用戶的輸入有問題,則可以使用 Message.showMsg('...'),提示信息也會(huì)顯示在同一個(gè)位置。
這樣就實(shí)現(xiàn)了異常提示信息的統(tǒng)一展示了。
這是一個(gè)比較簡(jiǎn)易的實(shí)現(xiàn),只提供一個(gè)思路。