关于Action向页面传递数据,对传递属性JSON化的拦截。

一、如果Action的属性很多,我们想要从Action返回数据到调用页面。这个时候配置includeProperties或者 excludeProperties拦截器即可,而这2个拦截器的定义都在struts2的json-default包内,所以要使用该拦截器的包都要继承json-default包,json-default继承自struts-default。

例1:

<struts>
	<package name="default" extends="json-default">
		<action name="user" class="icar.chenlong.UserAction" method="saveUser">
			<result type="json">
				<param name="includeProperties">user\.username,user\.password </param>
			</result>
		</action>
	</package>
</struts>
1、result中type设置成json之后,容器会把action的属性自动封装到一个json对象中(json拦截器来做),然后调用ajax的callback方法,返回json数据。

2、includeProperties 参数:输出结果中需要包含的属性值,这里支持正则表达式和属性名匹配。可以用“,”分割填充多个正则表达式。
如:<param name="includeProperties">group.*,user\.username</param>,表示要包含近JSON数据中的数据有:group的所有属性及user的username属性。

3、excludeProperties 参数:输出结果中需要排除的属性值,这里也支持正则表达式和属性名匹配。可以用“,”分割填充多个正则表达式,类似includeProperties。

4、为什么要用includeProperties或excludeProperties 参数?
  a.主要是为了过滤掉接口,pojo的set、list、其它对象等不需要的数据防止循环取其它关联对象或找不到接口。
  b.如果不配置,默认是处理 action中的所有属性,如果action中有接口注入,json拦截器可能找不到接口而返回不了结果。
  c.如果action中有一个对象,这个对象与好多对象都有关联,json拦截器会将相关联的所有对象的属性全部转换成json格式。
  d.如果其它对象有list、set,其返回结果相当庞大,有可能是死循环而无法返回。
  e.如果不用<param name="includeProperties"></param>或其他方式进行json数据过滤,通过debug你会发现前台返回的json字符串,是把 action中的所有属性全部转化成json字符串返回给客户端。(包括service接口、pojo所有属性及有关联的pojo。有时候根本返回不了结果,也不报错,后台执行了,但前台执行不到callback function,这主要是因为找不到接口或者关联的pojo太多,造成死循环),一般情况下用的最多的就是root、includeProperties、excludeProperties、ignoreHierarchy和excludeNullProperties参数。当然还有其他的方法,如给pojo的属性加json注解。
注1:
includeProperties:这个属性表示要包含进JSON数据中的数据。
excludeProperties:这个属性表示不要包含进JSON数据中的数据。
excludeNullProperties:这个属性表示去除空数据。
ignoreHierarchy :这个属性表示是否忽略等级,也就是继承关系,设置为 false 后会将父类和子类的属性一起返回。struts-json插件默认不会级联序列化父类,即不能返回父类属性。

5、result标签中的name属性,即表示是struts2中的action类中返回的名称。
例2:

public String findAllById() throws Exception{
	Integer id=Integer.parseInt(this.request.getParameter("id"));
	List<User> list=service.findById(id);
	return "findAll";
}
上面代码return "findAll"就会找到findAll的结果集,并将其封装起来,返回json给客户端。
因此 action 可以配置多个result。

6、利用Struts 2的支持的可配置结果,可以达到过滤器的效果。Action的处理结果配置支持正则表达式。 但是如果返回的对象是一个数组格式的Json数据。比如user Bean中有对象user01...user09,而我只要user01的json数据, 则可以用如下的正则表达式。
例3:(此处代码样式有异常,请点击左上角view plain查看。)
<struts>
    <package name="default" extends="json-default">
        <action name="user" class="icar.chenlong.UserAction" method="findUsers">
            <result type="json">
                <param name="includeProperties">user\[\d+\]\.user01 </param>
            </result>
        </action>
    </package>
</struts>

7、excludeProperties拦截器的用法与此类同,如果拦截的仅仅是一个对象,或者拦截掉user的整个对象。
例4:
<struts>
    <package name="default" extends="json-default">
        <action name="user" class="icar.chenlong.UserAction" method="saveUser">
            <result type="json">
                <param name="excludeProperties">user</param>
            </result>
        </action>
    </package>
</struts>

8、传递List或者对象时,后面要加上“.*”代表全部元素的意思。
例5:

<param name="includeProperties">topicList.*</param>


9、需要注意的是,如果用JSON插件把返回结果定为JSON。而JSON的原理是在ACTION中的get方法都会序列化,所以前面是get的方法只要没指定不序列化,都会执行,那么可以在该方法的前面加注解声明该方法不做序列化。

例6:

@JSON(serialize = false)
public User getUser() {
    return this.User;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值