zoukankan      html  css  js  c++  java
  • 用异提交时,后台通过校验规则文件,校验不通过时,跳转到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验证框架异步验证数据。

  • 相关阅读:
    【解决办法】移动硬盘在电脑上显示“本地磁盘”并且出现打不开的情况
    在Windows上搭建Python环境
    Thymeleaf模板的使用
    thymeleaf中的th:remove用法
    AngularJS PhoneCat代码分析
    AngularJS PhoneCat代码分析
    利用java反射调用类的的私有方法--转
    Java Reflection (JAVA反射) --转载
    Eclipse 常用快捷键 (动画讲解)--转载
    三大JavaScript框架对比——AngularJS、BackboneJS和EmberJS
  • 原文地址:https://www.cnblogs.com/dangzhenjiuhao/p/5565676.html
Copyright © 2011-2022 走看看