首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Ajax >

struts2校验与 ajax其间的那点事

2012-11-16 
struts2校验与 ajax之间的那点事先说说我的问题吧:最近项目使用了struts2的校验(其实我觉得后台校验,特别

struts2校验与 ajax之间的那点事

先说说我的问题吧:

最近项目使用了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-contorl", "no-cache");  PrintWriter writer = response.getWriter();    writer.print("{success:false,message:'" + returnMessage + "'}");  writer.flush();  writer.close();  } catch (IOException e1) {  logger.error(StackTrace.getExceptionTrace(e1));  }    }  }  }


简单解释:假如拦截到input,就从struts的栈中取出一个校验失败的信息,然后返回给页面,

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

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

 

热点排行