用异提交时,后台通过校验规则文件,校验不通过时,跳转到INPUT视图时,前台显示错误信息的解决办法...

1.第一种:

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

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

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

看代码:

 

[java]  view plain  copy
 
 print?
  1. public class ExceptionInterceptor extends AbstractInterceptor {  
  2.     private static final Logger logger = LoggerFactory  
  3.             .getLogger("ExceptionInterceptor");  
  4.     
  5.     @Override  
  6.     public String intercept(ActionInvocation invocation) {  
  7.         try {  
  8.             //增加监听  
  9.             invocation.addPreResultListener(new MyStrutsListener());  
  10.             String retString = invocation.invoke();  
  11.             return retString;  
  12.         } catch (Exception e) {  
  13.             logger.error(StackTrace.getExceptionTrace(e));  
  14.             //to-do  
  15.         }  
  16.     }  
  17.   }  
  18.       
  19.  //实现接口: PreResultListener  
  20.  class MyStrutsListener implements PreResultListener {  
  21.     @Override  
  22.     public void beforeResult(ActionInvocation actionInvocation, String result) {  
  23.         // 过滤result为input视图的请求  
  24.         if (result != null && result.equals("input")) {  
  25.             //设置struts返回值为空  
  26.             actionInvocation.setResultCode(null);  
  27.             //从action中取得fieldError的错误校验信息  
  28.             ActionContext actionContext = actionInvocation  
  29.                     .getInvocationContext();  
  30.             ValueStack vc = actionContext.getValueStack();  
  31.             Map<String, Object> ferrors = (Map<String, Object>) vc  
  32.                     .findValue("fieldErrors");  
  33.             String returnMessage = null;  
  34.             for (Map.Entry<String, Object> entry : ferrors.entrySet()) {  
  35.                 ArrayList list = (ArrayList) entry.getValue();  
  36.                 if (list != null && list.size() > 0) {  
  37.                     returnMessage = list.get(0).toString();  
  38.                     break;  
  39.                 }  
  40.             }  
  41.             // 页面回写json  
  42.             try {  
  43.                 HttpServletResponse response = (HttpServletResponse) actionContext  
  44.                         .getContext().get(  
  45.                                 org.apache.struts2.StrutsStatics.HTTP_RESPONSE);  
  46.                 response.setContentType("application/json; charset=utf-8");  
  47.                 response.setHeader("cache-control", "no-cache");  
  48.                 PrintWriter writer = response.getWriter();  
  49.               
  50.                 writer.print("{success:false,message:'" + returnMessage + "'}");  
  51.                 writer.flush();  
  52.                 writer.close();  
  53.             } catch (IOException e1) {  
  54.                 logger.error(StackTrace.getExceptionTrace(e1));  
  55.             }  
  56.     
  57.         }  
  58.     }  
  59.   }  


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

 

 

 

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

装载出处http://blog.csdn.net/jsjxieyang/article/details/8107547

 

---------------------------------------------------------------------------

 

第二种:

 

一:自己定义一个result

Java code
 
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package  result;
 
import  java.io.PrintWriter;
import  java.util.Map;
 
import  org.apache.struts2.ServletActionContext;
import  net.sf.json.JSONObject;
import  com.opensymphony.xwork2.ActionContext;
import  com.opensymphony.xwork2.ActionInvocation;
import  com.opensymphony.xwork2.Result;
import  com.opensymphony.xwork2.util.ValueStack;
 
public  class  validators_json  implements  Result {
 
     @SuppressWarnings ( "unchecked" )
     @Override
     public  void  execute(ActionInvocation arg0)  throws  Exception {
         //获值栈中fieldErrors的值
         ValueStack vc = ActionContext.getContext().getValueStack();
         Map<String, String[]>  ferrors = (Map<String,String[]>)  vc.findValue( "fieldErrors" );
         //获得输出流
         ServletActionContext.getResponse().setCharacterEncoding( "utf8" );
         ServletActionContext.getResponse().setContentType( "text/html" );
         PrintWriter out = ServletActionContext.getResponse().getWriter();
         //将map转换为json
         JSONObject json =JSONObject.fromObject(ferrors);
         //想客户端输出
         System.out.println(json.toString());
         out.print(json.toString());
         out.close();
//        for (Map.Entry<String, String[]> entry : ferrors.entrySet())
//           System.out.println("key:" + entry.getKey() + "  value:" + entry.getValue());
 
     }
 
}



二,然后修改配置文件struts.xml

添加type的定义

XML/HTML code
 
?
1
2
3
< result-types >
     < result-type  name = "validators_json"  class = "result.validators_json"  default = "true" >   </ result-type >
</ result-types >


使用

XML/HTML code
 
?
1
< result  name = "input"  type = "validators_json" ></ result


这样 验证框架所产生的message就可以以json的方式发向客户端了,当然发送方式可以自己定义
实现了ajax+struts2验证框架异步验证数据。

转载于:https://www.cnblogs.com/dangzhenjiuhao/p/5565676.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值