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里面就可以了

posted on 2014-04-24 17:25  lxsky  阅读(685)  评论(0编辑  收藏  举报

导航