struts2.1.8.1+jquery1.4.2返回json数据(action中避免使用get开头的action方法)

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

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

2、后台:

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;      }       /*返回UserInfo对象*/        public String returnUser(){          userInfo = new UserInfo();         userInfo.setUserId(10000);         userInfo.setUserName("刘栋");         userInfo.setPassword("123456");         return SUCCESS;      }     /*返回List对象*/        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>  

3、前台:

1) 页面引入jquery-1.4.2.js
2) 代码如下:
<script language="javascript">     function getMsg(){         $.ajax({           url:'json/returnMsg.action',            type:'post',           dataType:'json',            success:function(data){            $("#result").html(data.message);           }        });      }       function getUser(){         $("# result ").html("");          $.ajax({           url:'json/returnUser.action',            type:'post',           dataType:'json',            success:function(data){            $("#result").append("用户ID:"+data.userInfo.userId+"")                          .append("用户名:"+data.userInfo.userName+"")                          .append("密码:"+data.userInfo.password+"");           }        });      }       function getUserList(){         $("# result ").html("");           $.ajax({           url:'json/returnList.action',            type:'post',           dataType:'json',            success:function(data){              $.each(data.userInfosList,function(i,value){                $("#result").append("第"+(i+1)+"个用户")                            .append("用户名:"+value.userName+"")                            .append("密码:"+value.password+"");             }           }        });      }  </script>  <div id="result"></div>  <input type="button" value="获得单个消息" οnclick="getMsg()"/>  <input type="button" value="获得用户信息" οnclick="getUser()"/>  <input type="button" value="获得用户列表" οnclick="getUserList()"/>   

4、只要继承extends="json-default",result type设置成json之后,容器会把action的属性自动封装到一个json对象中(json拦截器来做),然后调用ajax的callback方法. 返回json数据

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

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

<result type="json">     <param name="includeProperties"> userInfo.*,      userInfo \. userName </param>  </result>    

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

7、输出一个JSON List列表

<result name="success" type="json">   <param name="includeProperties">       userInfosList\[\d+\]\.userName,userInfosList\[\d+\]\.password  </param>   </result>

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

8、为什么要用includeProperties或excludeProperties 参数:主要是为了过滤掉接口,pojo的set、list、其它对象等不需要的数据防止循环取其它关联对象或找不到接口。如果不配置,默认是处理 action中的所有属性,如果action中有接口注入,json拦截器可能找不到接口而返回不了结果,还有如果action中有一个对象,这个对象与好多对象都有关联,json拦截器会将相关联的所有对象的属性全部转换成json格式,如果其它对象有list、set,其返回结果相当庞大,有可能是死循环而无法返回 。如果不用<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等参数.

————————————————————————华丽的分割线——————————————————————

本人做了个小小的测试,下面的action方法执行完后,容器会把该action的所有属性封装到一个JSON中,并返回该JSON。而封装的过程就是执行Aciton里所有以get开头的aciton方法,难怪总疑惑为什么有一些action方法会执行两次,其他又只有一次。

若把下面的注释去掉,则只会将action的erro属性封装到JSON里。

 <action name="commitAirWaybill" class="com.szair.smartme.tlm.action.PackingListManageAction" method="commitAirWaybill">
            <result type="json" name="success">
               <!--  <param name="includeProperties">erro</param> -->
            </result>
        </action>

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值