本文為原創(chuàng),歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明出處BlogJava。
Struts2 版本 2.2.1
Freemarker版本 2.3.16
此統(tǒng)一處理的目的在于 Web層、Service層拋出的業(yè)務(wù)異常以統(tǒng)一的格式顯示在頁面的固定位置。
首先定義我們的業(yè)務(wù)異常類。

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取得對應(yīng)message
// 實現(xiàn)略
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("系統(tǒng)忙,請稍候再試。");
}

private void fillError4Display(String msg)
{
getRequest().setAttribute("_error_msg_", msg);
}
}
攔截所有的異常,并對其進行處理。
當為 自定義的BusinessException時,根據(jù)拋出異常時的msgCode,取得對應(yīng)的顯示信息。
msgCode與顯示信息的對應(yīng)關(guān)系 可先配置好,系統(tǒng)啟動時將其緩存起來。
如果非BusinessException,則統(tǒng)一顯示為 “系統(tǒng)忙,請稍候再試。”
將要顯示的信息設(shè)置到Request中,下面來看看Freemarker模板的寫法:
msg.ftl
<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>
在使用時,只要在頁面上想要展現(xiàn)異常信息的地方插入如下代碼即可:
<#include "/msg.ftl">
這樣 系統(tǒng)中的異常 將會被統(tǒng)一的顯示。
當使用js做前臺的表單驗證的時候,提示用戶的輸入有問題,則可以使用 Message.showMsg('...'),提示信息也會顯示在同一個位置。
這樣就實現(xiàn)了異常提示信息的統(tǒng)一展示了。
這是一個比較簡易的實現(xiàn),只提供一個思路。