• struts2 中的 result 返回类型是 json 的配置问题


    struts2 中的 result 返回类型是 json 的配置问题

    1、引入包(本文中的包全部引自struts-2.1.8.1lib)

    struts2-json-plugin-2.1.8.1.jar 

    json-lib-2.1.jar

    commons-collections-3.2.jar

    commons-beanutils-1.7.0.jar

    commons-lang-2.3.jar

    commons-logging-1.0.4.jar

    ezmorph-1.0.3.jar

    7个包是返回json形式的数据必须的。因为json大量引用了Apache commons的包,所以要加入4个,commons包,除了commons的包外,还需要引入一个 ezmorph的包。最后加入struts2必须的6个包: 

    struts2-core-2.1.8.1.jar 

    xwork-core-2.1.6.jar

    ognl-2.7.3.jar

    freemarker-2.3.15.jar

    commons-fileupload-1.2.1.jar

    commons-io-1.3.2.jar

    1) Userinfo实体类代码

    public class UserInfo implements Serializable {   

        private int userId;  

        private String userName; 

        private String password; 

        get set方法略

    }

    2) Action类

    public class TestAction extends ActionSupport {

        private String message;                //使用json返回单个值

        private UserInfo userInfo;              //使用json返回对象

        private List userInfosList;     //使用josn返回List对象

        get set方法略

          

       public String returnMsg(){   

            this.message = "成功返回单个值";  

            return SUCCESS; 

       }  

          

       public String returnUser(){ 

           userInfo = new UserInfo();

           userInfo.setUserId(10000);

           userInfo.setUserName("刘栋");

           userInfo.setPassword("123456");

           return SUCCESS; 

       } 

       

       public String returnList(){   

           userInfosList = new ArrayList<UserInfo>(); 

           UserInfo u1 = new UserInfo(); 

           u1.setUserId(10000);   

           u1.setUserName("张三"); 

           u1.setPassword("111111");

           UserInfo u2 = new UserInfo();

           u2.setUserId(10001);   

           u2.setUserName("李四");   

           u2.setPassword("222222"); 

           userInfosList.add(u1); 

           userInfosList.add(u2);  

           return SUCCESS;   

       }   

    }

    3) struts.xml(必须继承json-default、json-default继承自struts-default)

    <package name="default" namespace="/json" extends="json-default"> 

    <action name="returnMsg" class="com.testAction " method="returnMsg">   

    <result  name="success" type="json">

    <param name="root">validate</param>

    </result>   

    </action> 

    <action name="returnUser " 

    class="com.testAction " method="returnUser ">

    <result  name="success" type="json">

    <param name="includeProperties">

    userInfo.userId,userInfo.userName,userInfo.password

    </param>

    </result>   

    </action>

    <action name="returnList" class="com.testAction "

     method="returnList">   

    <result  name="success" type="json">

    <param name="includeProperties">

    userInfosList[d+].userName,userInfosList[d+].password

    </param>

    </result>   

    </action>

    </package>

    4、只要继承extends="json-default"result type设置成json之后,容器会把action的属性自动封装到一个json对象中(json拦截器来做

    5includeProperties 参数:输出结果中需要包含的属性值,这里正则表达式和属性名匹配,可以用“,”分割填充多个正则表达式。 

    如:输出UserInfo的所有属性及UserInfouserName属性

    <result type="json">

       <param name="includeProperties"> userInfo.*, 

       userInfo . userName </param>

    </result> 

    6excludeProperties 参数:输出结果需要剔除的属性值,也支持正则表达式匹配属性名,可以用“,”分割填充多个正则表达式,类同includeProperties 

    7、输出一个JSON List列表

    <result name="success" type="json"> 

    <param name="includeProperties"> 

        userInfosList[d+].userName,userInfosList[d+].password

    </param> 

    </result>

    其中userInfosListaction中的一个List类型的属性,userInfosList [d+]. userName表示,userInfosList中存储的对象0..enduserName属性(list中存储的对象必须有userName属性)。

    8、为什么要用includePropertiesexcludeProperties 参数:主要是为了过滤掉接口,pojosetlist、其它对象等不需要的数据防止循环取其它关联对象或找不到接口。如果不配置,默认是处理 action中的所有属性,如果action中有接口注入,json拦截器可能找不到接口而返回不了结果,还有如果action中有一个对象,这个对象与好多对象都有关联,json拦截器会将相关联的所有对象的属性全部转换成json格式,如果其它对象有listset,其返回结果相当庞大,有可能是死循环而无法返回 。如果不用<param name="includeProperties">或其他方式进行json数据过滤,通过debug你会发现前台返回的json字符串,是把 action中的所有属性全部转化成json字符串返回给客户端(包括service接口、pojo所有属性及有关联的pojo。有时候根本返回不了结果,也不报错,后台执行了,但前台执行不到callback function,这主要是因为找不到接口或者关联的pojo太多,造成死循环),一般情况下用的最多的就是root、 includeProperties excludeNullProperties参数。当然还有其他的方法,如给pojo的属性加json注解。

    9、总结: action中避免使用get开头的action方法,去掉action中的接口的get方法 为json类型的result配置includeProperties, excludeProperties等参数.

    10、不配置

    <param name="includeProperties"> 

        userInfosList[d+].userName,userInfosList[d+].password

    </param> 

    status 会把Action所有的get方法都执行 就会多了很多sql执行 就是为了获得 Action中定义的所有属性 返回的josn串也会是所有属性的长串。

  • 相关阅读:
    一个简单的makefile,一次性编译本文件夹下所有的cpp文件
    c++ 最短路两种算法
    C++语言十进制数,CDecimal(未完成)
    C语言面向对象的简便方法
    C语言2048
    C图书借还示例
    Javascript 备忘
    原型与原型链
    css3动画-跳动圈
    学习css3动画
  • 原文地址:https://www.cnblogs.com/weixiaole/p/5044398.html
Copyright © 2020-2023  润新知