struts2校验与 ajax之间的那点事

5 篇文章 0 订阅
2 篇文章 0 订阅

先说说我的问题吧:

最近项目使用了struts2的校验(其实我觉得后台校验,特别是struts的校验,完全可以放在其他地方处理,比如交给js或者业务逻辑),而且系统刚好还使用了extjs,此时问题出现了:假如提交数据后,struts校验没有通过,那么struts会自动返回input,而extjs提交数据方式都是ajax,根本就不理会struts 的返回值,然后系统就会报错,页面也不可能显示校验失败的相关信息,  

针对此种情况,一种处理方式是在struts.xml中增加input结果集,重定向到另一个action处理,然后给页面返回ajax请求的结果,但是页面不会显示校验失败的相关信息.如何能解决页面显示校验失败的详细信息呢?

上网查了一下,发现struts2新版本的interceptor支持返回结果集的预处理监听函数(举个例子:在action方法返回一个input后,我能在拦截器中拦截到你返回了Input视图),我们只需实现此接口,然后在拦截器中加入监听即可.

看代码:

public class ExceptionInterceptor extends AbstractInterceptor {
  	private static final Logger logger = LoggerFactory
  			.getLogger("ExceptionInterceptor");
  
  	@Override
  	public String intercept(ActionInvocation invocation) {
  		try {
 			//增加监听
  			invocation.addPreResultListener(new MyStrutsListener());
  			String retString = invocation.invoke();
  			return retString;
  		} catch (Exception e) {
  			logger.error(StackTrace.getExceptionTrace(e));
  			//to-do
  		}
  	}
  }
  	
 //实现接口: PreResultListener
 class MyStrutsListener implements PreResultListener {
  	@Override
  	public void beforeResult(ActionInvocation actionInvocation, String result) {
  		// 过滤result为input视图的请求
  		if (result != null && result.equals("input")) {
  			//设置struts返回值为空
  			actionInvocation.setResultCode(null);
 			//从action中取得fieldError的错误校验信息
  			ActionContext actionContext = actionInvocation
  					.getInvocationContext();
  			ValueStack vc = actionContext.getValueStack();
  			Map<String, Object> ferrors = (Map<String, Object>) vc
  					.findValue("fieldErrors");
  			String returnMessage = null;
  			for (Map.Entry<String, Object> entry : ferrors.entrySet()) {
  				ArrayList list = (ArrayList) entry.getValue();
  				if (list != null && list.size() > 0) {
  					returnMessage = list.get(0).toString();
  					break;
  				}
  			}
  			// 页面回写json
  			try {
  				HttpServletResponse response = (HttpServletResponse) actionContext
  						.getContext().get(
  								org.apache.struts2.StrutsStatics.HTTP_RESPONSE);
  				response.setContentType("application/json; charset=utf-8");
  				response.setHeader("cache-control", "no-cache");
  				PrintWriter writer = response.getWriter();
  			
  				writer.print("{success:false,message:'" + returnMessage + "'}");
  				writer.flush();
  				writer.close();
  			} catch (IOException e1) {
  				logger.error(StackTrace.getExceptionTrace(e1));
  			}
  
  		}
  	}
  }

最后在前台解析接收到的json数据,反馈给用户,效果与struts校验失败后的提示信息一模一样。^_^
简单解释:假如拦截到input,就从struts的栈中取出一个校验失败的信息,然后返回给页面,

以上为个人见解,难免有不周的地方

欢迎转载,请注明装载出处http://blog.csdn.net/jsjxieyang/article/details/8107547

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值