首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > JavaScript >

struts2.1.8.1+jquery1.4.2回到json数据

2012-08-24 
struts2.1.8.1+jquery1.4.2返回json数据1、引入包(本文中的包全部引自struts-2.1.8.1\lib):struts2-json-pl

struts2.1.8.1+jquery1.4.2返回json数据

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" method="returnMsg">   <result  name="success" type="json"><param name="root">validate</param></result>   </action> <action name="returnUser " method="returnUser "><result  name="success" type="json"><param name="includeProperties">userInfo\.userId,userInfo\.userName,userInfo\.password</param></result>   </action><action name="returnList" 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="获得单个消息" onclick="getMsg()"/><input type="button" value="获得用户信息" onclick="getUser()"/><input type="button" value="获得用户列表" onclick="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等参数.

热点排行