Struts2 改验证错误提示

本文介绍了一种在Struts2框架中实现异常统一处理的方法,包括定义业务异常类、使用拦截器捕获并处理异常,以及如何在Freemarker模板中展示异常信息。
Struts2 版本 2.2.1 Freemarker版本 2.3.16 此统一处理的目的在于 Web层、Service层抛出的业务异常以统一的格式显示在页面的固定位置。 首先定义我们的业务异常类。
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);    
}
}
拦截所有的异常,并对其进行处理。 当为 自定义的BusinessException时,根据抛出异常时的msgCode,取得对应的显示信息。 msgCode与显示信息的对应关系 可先配置好,系统启动时将其缓存起来。 如果非BusinessException,则统一显示为 “系统忙,请稍候再试。” 将要显示的信息设置到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>
在使用时,只要在页面上想要展现异常信息的地方插入如下代码即可: <#include "/msg.ftl"> 这样 系统中的异常 将会被统一的显示。 当使用js做前台的表单验证的时候,提示用户的输入有问题,则可以使用 Message.showMsg('...'),提示信息也会显示在同一个位置。 这样就实现了异常提示信息的统一展示了。 这是一个比较简易的实现,只提供一个思路。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值