zoukankan      html  css  js  c++  java
  • struts2 的验证框架validation如何返回json数据 以方便ajax交互

    struts2 的验证框架validation简单,好用,但是input只能输出到jsp页面通过struts2的标签<s:fielderror  />才能取出,(EL应该也可以)。

    如果使用的是ajax访问,那么就比较悲剧,如何返回json数据以方便ajax交互。

    开始想是不是可以直接将input以json方式输出,类似:<result name="input" type="json"></result> ,发现不行,因为type="json"后Result会把整个Action实例转换json字符串后直接作为服务器响应。

    方法1:推荐 ,使用struts2提供的拦截器栈jsonValidationWorkflowStack

    http://blog.163.com/guomaolin_gavin/blog/static/199618307201212232521748/

    关于拦截器截器栈http://hi.baidu.com/wihwtsdkunbnsyr/item/390c735ae811e8968d12edaa

    1.这里的action和普通的action一样没有区别。这是因为采用struts2的校验器是不会进过action的(除非校验全通过)

    2.配置***-validation.xml   ***表示和要校验的action同一(***和action类名保存一样)

    ***-validation.xml 配置形式:

    <validators>
        <field name="username">
            <field-validator type="requiredstring">
                <message key="user.required"/>
            </field-validator>
        </field>
        <field name="password">
            <field-validator type="requiredstring">
                <message key="pass.required"/>
            </field-validator>
        </field>
    </validators>

    3.配置struts.xml这里的作用是。将得到的校验信息进行转成json返回给ajax

    <package name="XXX" extends="json-default">,以下放到action里面,形式:

                <interceptor-ref name="jsonValidationWorkflowStack"></interceptor-ref>
                <result name="input" type="json">
                    <param name="ignoreHierarchy">false</param>
                    <param name="includeProperties">fieldErrors..+$</param>
                </result>

    输出

    {"fieldErrors":{"username":["user.required"],"password":["pass.required"]}}

    4.ajxa进行接收、因为传给ajax的是json。故ajax用json进行接收

    var message = data.fieldErrors;

    方法2:

    这里通过自定义一个result实现,往下看

    http://bbs.csdn.net/topics/370186521

    1.自己定义一个result

    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());
     
        }
     
    }

    2.然后修改配置文件struts.xml

    添加type的定义,放在<package></package> 之间

    <result-types>
        <result-type name="validators_json" class="result.validators_json" default="true">   </result-type>
    </result-types>

    3.使用

    <result name="input" type="validators_json"></result> 

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

    最近在想,是不是可以不用struts2 的验证框架validation,自己写个validate()方法,将所有的验证消息都直接写道message里面就可以了

  • 相关阅读:
    URL参数解析成一个Json对象
    线程(一)实现方式和生命周期
    有1、2、3、4 四个数字,编程实现能组成多少个互不相同且无重复数字的三位数?都是多少?
    Mybatis学习一 CRUD的实现
    Mybatis学习二 实现关联表查询
    .attr()和.prop()和.css()的区别
    利用try-catch判断变量是已声明未赋值还是未声明
    转载的清除浮动
    表单控件之select
    keypress和keydown事件及keyCode和keyChar
  • 原文地址:https://www.cnblogs.com/lxsky/p/3686067.html
Copyright © 2011-2022 走看看