Struts 的 Json 的 处理

1、Struts2之Json处理【转】

 

1、使用Struts2自带Json数据支持。

如果页面采用Ajax请求数据,且希望Struts2返回Json数据那么可以采用Struts2自带的对Json的支持功能。Struts2对Json的支持主要是通过拦截器实现的,只需在Struts.xml中稍做配置,然后Action中遵守一定规则即

可。

①、配置Struts.xml文件如下: 

Xml代码 复制代码  收藏代码
  1. <!-- 专门用于json数据处理的包,该包中的action支持响应json格式的字符串 -->  
  2.     <package name="jsonpak" namespace="/" extends="json-default">  
  3.         <action name="studentJson" class="studentAction" method="queryStudentsJson">  
  4.             <result name="studentList" type="json"></result><!--将action的bean属性以json字符串返回浏览器-->  
  5.         </action>  
  6.     </package>  
<!-- 专门用于json数据处理的包,该包中的action支持响应json格式的字符串 -->
	<package name="jsonpak" namespace="/" extends="json-default">
		<action name="studentJson" class="studentAction" method="queryStudentsJson">
			<result name="studentList" type="json"></result><!--将action的bean属性以json字符串返回浏览器-->
		</action>
	</package>

 注意,必需继承json-default包,result设置成json之后,容器会把action中所有以get开头的方法自动封装到一个json对象中(json拦截器来做,注意封装到json中的数据与action中的属性无关,只与get开头的方法有关,即使一个属性都没有,只要有get开头的方法,struts都会正常封装json字符串),然后调用js的callback方法,返回json数据。

②、在对应的Action的方法中将处理后的数据放置到对应的类属性用,并且属性提供get方法,即可。对于上面的配置,在方法queryStudentsJson中将需要返回的数据对象赋给类属性(有对应的get方法)后,返回到

studentList结果视图中即可(return "studentList")。

 

2、Struts2支持Jons所需Jar包。

使用Struts2的Json支持功能,需要的jar包有:commons-lang-2.4.jar;json-lib-2.3-jdk13.jar;jsonplugin-0[1].32.jar;ezmorph-1.0.2.jar;commons-beanutils-1.7.0.jar。

 

3、使用Struts2自带Json支持功能的全部数据Json化问题。

按照上面实现json处理后,会出现一个问题,struts2的拦截器会将Action类中所有的get方法都格式化到Josn字符串中,而在实际需求中,可能只需要部分数据,这时可以采用xml配置或者注解功能,实现筛选控制,这样可以有选择的格式化部分数据到json字符串中。

①、配置Struts.xml文件实现:action标签的子标签result中提供了一些参数解决这个问题,一般情况下用的最多的就是includeProperties 参数和excludeNullProperties参数。 

Xml代码 复制代码  收藏代码
  1. includeProperties 参数:输出结果中需要包含的属性值,这里正则表达式和属性名匹配,可以用“,”分割填充多个正则表达式。这个参数直接返回对象的json数据,前台不需要eval转换,<param name="root">result</param>则不同,需要前台进行eval转换如:输出data对象下面的所有属性 和 总条数。   
  2. <result type="json">  
  3.     <param name="includeProperties">totalCount,data.*</param>  
  4. </result>  
  5.   
  6. excludeProperties 参数:输出结果需要剔除的属性值,也支持正则表达式匹配属性名,可以用“,”分割填充多个正则表达式,类同includeProperties   
  7.   
  8. 更多配置参考如下:   
  9. <result type="json">        
  10.     <!-- 这里指定将被Struts2序列化的属性,该属性在action中必须有对应的getter方法 -->        
  11.     <!-- 默认将会序列所有有返回值的getter方法的值,而无论该方法是否有对应属性 -->        
  12.     <param name="root">dataMap</param>    
  13.        
  14.     <!-- 指定是否序列化空的属性 -->        
  15.     <param name="excludeNullProperties">true</param>  
  16.       
  17.     <!-- 这里指定将序列化dataMap中的那些属性 -->        
  18.     <param name="includeProperties">userList.*</param>    
  19.        
  20.     <!-- 这里指定将要从dataMap中排除那些属性,这些排除的属性将不被序列化,一半不与上边的参数配置同时出现 -->     
  21.     <param name="excludeProperties">SUCCES</param>     
  22. </result>  
includeProperties 参数:输出结果中需要包含的属性值,这里正则表达式和属性名匹配,可以用“,”分割填充多个正则表达式。这个参数直接返回对象的json数据,前台不需要eval转换,<param name="root">result</param>则不同,需要前台进行eval转换如:输出data对象下面的所有属性 和 总条数。
<result type="json">
    <param name="includeProperties">totalCount,data.*</param>
</result>

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

更多配置参考如下:
<result type="json">     
	<!-- 这里指定将被Struts2序列化的属性,该属性在action中必须有对应的getter方法 -->     
	<!-- 默认将会序列所有有返回值的getter方法的值,而无论该方法是否有对应属性 -->     
	<param name="root">dataMap</param> 
    
	<!-- 指定是否序列化空的属性 -->     
	<param name="excludeNullProperties">true</param>
   
	<!-- 这里指定将序列化dataMap中的那些属性 -->     
	<param name="includeProperties">userList.*</param> 
    
	<!-- 这里指定将要从dataMap中排除那些属性,这些排除的属性将不被序列化,一半不与上边的参数配置同时出现 -->  
	<param name="excludeProperties">SUCCES</param>  
</result>

 ②、在action中的get方法上加注解。

Xml代码 复制代码  收藏代码
  1. 默认情况下以get方法开头的都会序列化,如果不想序列化,在action中的相应get方法要打上注解@JSON(serialize=false)   
  2. 如果在属性get方法上面加@JSON(name="newName"),则返回的json数据中名称是指定的新名称。   
  3. @JSON(format ="yyyy-MM-dd'T'HH:mm:ss")设置用于格式化输出、解析日期表单域的格式。   
  4. @JSON(deserialize=true)设置是否反序列化该属性  
默认情况下以get方法开头的都会序列化,如果不想序列化,在action中的相应get方法要打上注解@JSON(serialize=false)
如果在属性get方法上面加@JSON(name="newName"),则返回的json数据中名称是指定的新名称。
@JSON(format ="yyyy-MM-dd'T'HH:mm:ss")设置用于格式化输出、解析日期表单域的格式。
@JSON(deserialize=true)设置是否反序列化该属性

 

4、 使用json功能,报如下错误。

Java代码 复制代码  收藏代码
  1. Class com.googlecode.jsonplugin.JSONWriter can not access a member of class*   
  2.   
  3. Class org.apache.struts2.json.JSONWriter can not access a member of class oracle.jdbc.driver.BaseResultSet with modifiers "public"  
Class com.googlecode.jsonplugin.JSONWriter can not access a member of class*

Class org.apache.struts2.json.JSONWriter can not access a member of class oracle.jdbc.driver.BaseResultSet with modifiers "public"

上面的错误是初使用Struts2的json功能的开发人员经常遇到的。

错误含义:不能把程序中的某种数据结构串行化成json格式。

原因:struts2的action里面的数据转换成json数据时,会将提供了get方法的属性都串行化输出JSON到客户端。有的时候,很多属性并不能串行化成json数据,比如这里的oracle.jdbc.driver.BaseResultSet。这时还进行强行转换就会出现这样的异常。

解决方法:在不能串行化到json的属性相应的get方法前加一条json标记 @JSON(serialize=false)。告诉json不需要转化这个属性。或者根本不写这个get方法。

 

5、自实现Json数据返回

不采用Struts2自带的Json功能,直接操作response对象实现json格式数据返回,这样不但简单,而且回避了上面的各种问题。

①、Struts.xml中不再需要特殊配置,直接继承struts-default包即可,参考如下:

Xml代码 复制代码  收藏代码
  1. <!-- 处理学生信息的action -->  
  2.     <action name="pageQuery" class="classAction" method="pageQueryClasses">  
  3.     </action>  
  4.     <action name="createClass" class="classAction" method="createClass">  
  5.     </action>  
  6.     <action name="updateClass" class="classAction" method="updateClass">  
  7.     </action>  
  8.     <action name="deleteClassById" class="classAction" method="deleteClassById">  
  9.     </action>  
  10.     <action name="getClassById" class="classAction" method="getClassById">  
  11.     </action>  
  12. </package>  
<!-- 处理学生信息的action -->
	<action name="pageQuery" class="classAction" method="pageQueryClasses">
	</action>
	<action name="createClass" class="classAction" method="createClass">
	</action>
	<action name="updateClass" class="classAction" method="updateClass">
	</action>
	<action name="deleteClassById" class="classAction" method="deleteClassById">
	</action>
	<action name="getClassById" class="classAction" method="getClassById">
	</action>
</package>

action标签中不再需要result子标签,在Action对应的方法中直接返回null即可。

Java代码 复制代码  收藏代码
  1. public class ClassAction extends BaseAction  implements ModelDriven<Classe>{   
  2.   
  3.     private static final long serialVersionUID = 8354047356806230499L;   
  4.     /* ClassService接口 */  
  5.     private IClassService classService = null;   
  6.     private Classe classe = new Classe();   
  7.        
  8.     /**  
  9.      * 分页查询数据  
  10.      *   
  11.      * @return  
  12.      * @throws Exception  
  13.      */  
  14.     public String pageQueryClasses() throws Exception {   
  15.         int sourceNum = classService.getCount("");   
  16.         List<Classe> classes = classService.findPage(""this.getPage(), this.getRows());   
  17.         Page pageObj = new Page(0, sourceNum, 10, classes);   
  18.         this.sendJsonDataToClient(JSONObject.fromObject(pageObj).toString(), ServletActionContext.getResponse());   
  19.         return null;   
  20.     }   
  21. ………………………………………………………………  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值