struts2 ajax action框架 action的父类写protected属性在ajax json中获取不到。父类中写get set

博客访问: 515479
博文数量: 193
博客积分: 3853
博客等级: 中校
技术积分: 1883
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: Java
所用技术:struts2+jsonplugin+jquery+flexigrid
在struts2中,通常情况下action直接继承的是ActionSupport,有时为了项目的需要,可能要写一个BaseAction类来继承ActionSupport,让所有的action来继承BaseAction
Java代码 &
@ParentPackage("jshop")&&
public&class&BaseActiton&extends&ActionSupport&{&&
&&&&&&&&&&&&&&&..........&&
&&&&&&&&&&&&&&&&private&String&&&
&&&&public&String&getTest()&{&&
&&&&&&&&return&&&
&&&&public&void&setTest(String&test)&{&&
&&&&&&&&this.test&=&&&
Java代码 &
public&class&ProuctsAction&extends&BaseActiton&{&&&private&String&&&
&&&&private&String&&&
&&&&private&List&&&
&&&&private&int&&&
&&&&private&int&page&=&1;&&
&&&&private&int&total&=&0;&&
&&&&private&boolean&&&
&&&&private&boolean&&&
&&&&private&String&&&
&&&&private&String&&&
.............&&
}&&&&&&&&&&&&&
添加BaseAction的初衷是项目用到了flexigrid,flexigrid接收json格式的数据,所以action中的查询方法要返回json类型,而flexigrid又有很多自己的一些参数需要接收并返回,如下:
Java代码 &
&&&&&&&&&&private&String&&&
private&String&&&
private&List&&&
private&int&&&
private&int&page&=&1;&&
private&int&total&=&0;&&
private&boolean&&&
private&boolean&&&
private&String&&&
private&String&&&
&如果在每个action中都单独写这些flexigrid所需要用的属性,还有对应的get set方法,显而易见每个action中会有很多这样重复的代码,为此我们需要把这些属性提炼出来,添加到BaseAction。
&&改造完毕,在页面点查询的时候flexigrid的相关属性可以正常获取,但是返回到前台的时候用firebug查看返回的json格式,这些属性却丢失了,查阅相关struts2资料看到这样一个属性:
Java代码 &
</result&&
&ignoreHierarchy 参数:表示是否忽略等级,也就是继承关系,比如:ProuctsAction继承于 BaseAction,那么
ProuctsAction中返回的 json 字符串默认是不会包含父类 BaseAction 的属性值,ignoreHierarchy 值默认为 true,
设置为 false 后会将父类和子类的属性一起返回。
由于用的注解,经过测试这样修改为:
Java代码 &
@Action(value&=&"findAll",&results&=&{&@Result(name&=&"json",&type&=&"json",&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&params={"ignoreHierarchy","false"})&})&&
&&&&public&String&findAll()&{&&&&&
&&&&&&&&&&&&&&&&&&&.....&&&
&&&&&&&&&&&&&&&&&&return&"json";&&
&再用firebug查看返回的json,父类中的属性已经存在。
阅读(4774) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。Struts2+AJAX获取json数据
&#xe614;博客专家
Struts2+AJAX获取json数据
Java EE 企业级框架
&&&&&&&&&&&& 昨天晚上遇到了一个bug,是ajax调用struts2里面的方法获取json的问题,虽然现在那个问题没有解决,但是各种百度后,发现对stuts2跟ajax的交互认识又深了。&一,如果设置Action返回的结果为json类型&&&&&&&&&&&&&&&& &&&&&&&&&& 如上图,如果要这个action返回的结果为json,首先要指定包继承为json-default,之后,在result里面,指明type=&json&。&&&&&&& &result&节点中还可以添加param参数,来指定序列化的参数:从哪儿开始序列化,序列化谁,不序列化谁。。。比如上图,配置序列化的根节点为success,如果没有配置的话,会默认序列化Action中所有提供get***()方法的属性。如果制定了,则从root开始向下序列化。二,Action中一些常用配置&&&&&&&&&&&&& 如果配置文件中没有配置root,可以在不需要序列化的方法上:&&&&&&&&&&&& &&&&&&&&&&&&&& 加上这个注解之后,会忽略对get**()的序列化。另外,在@JSON中还可以指定序列化的格式,名称。&&&&&& 三,对实现Serializable接口的对象&&&&&&&&&& 一般序列化的时候会默认序列化非静态的提供了get方法的成员变量。但是可以通过关键字transient指定不需要序列化的属性。&&&&&&&&&&&&& &&&&&&&&&& 但是对于实现Externalizable接口的类,这个关键字没啥用。&&&&&& 四,struts2+ajax的一些坑&&&&&&&&&&&&&&&&&&&&&&&&&&&& 1,每次报错,strtus2的报错页信息就会返回给ajax,并且是进入ajax的success方法中,(⊙﹏⊙)b。。。。。。。。&&&&&&&&&&&&&&&&&& 2,对于新手,不熟悉json的,又看不到json具体转换过程的人来说,只能靠猜测序列化的时候报错了。&&&&&&&&&&&& &&&&&&&&
我的热门文章
即使是一小步也想与你分享<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&1213人阅读
在SSH2框架下,当和某些前台JS的Ajax框架,例如:EasyUI、Ext等结合使用的时候,常用到struts2中result的类型type为json的result,这个时候可以很方便的将Action中的域通过Struts2的json插件转化为JSON字符串传递给前天Ajax框架使用。
但是,当配合Hibernate使用,要向前台通过JSON方式传递Hibernate实体类中级联的其他实体类时,系统就会报NoSuchMethod:getHibernateLazyInitializer()异常。这里主要的原因是Hibernate会将实体类内部级联的其他实体类类型的域做类&#20284;于反射机制的处理,用以实现Hibernate内部的Lazyload或其他神奇的特性,这样做会使Stuts2对实体类级联JSON序列化的时候,报出NoSuchMethod:getHibernateLazyInitializer()异常。
解决方式1:
给实体类添加getHibernateLazyInitializer()方法,这个方法虽然可以避免报错,但是应用程序启动的时候,系统会报MultiMethed异常。虽然在使用Hibernate的时候并未发现这种方式的修改会给系统运行带来什么困扰,但是由于开发中时间短,没有时间完全的评估出MutiMethod异常究竟对Hibernate的使用产生何种影响,所以不推荐使用这种方法,会有使用隐患。
解决方式2:
从struts2的json插件动手,struts2中type为json的result可以有多个参数设置:
&result type=&json&&
&!-- 要JSON序列化的action中的属性名,其实就是对getXXX方法的返回&#20540;进行序列化 --&
&param name=&root&&list&/param&
&!-- JSON序列化时不需要序列化的属性的正则表达式,这里的&\&是转义字符,[d&#43;]表示了List中的index,hibernateLazyInitializer就是是否调用getHibernateLazyInitializer方法,当然也可以添加
类&#20284;的其他正则表达式,这里就不一一列举了 --&
&param name=&excludeProperties&&\[\d&#43;\]\.hibernateLazyInitializer,\[\d&#43;\]\.rack\.hibernateLazyInitializer,\[\d&#43;\]\.connectbox\.hibernateLazyInitializer&/param&
&!-- JSON序列化时是否去除&#20540;为null的属性 --&
&param name=&excludeNullProperties&&true&/param&
&!-- JSON序列化时需要序列化的属性的正则表达式,这里的&\&是转义字符,[d&#43;]表示了List中的index,hibernateLazyInitializer就是是否调用getHibernateLazyInitializer方法,当然也可以添加
类&#20284;的其他正则表达式,这里就不一一列举了,注意:excludeProperties与includeProperties一般不同时使用,当然也有特例,请实际情况使用 --&
&param name=&includeProperties&&
\[\d&#43;\]\.id,\[\d&#43;\]\.rack\.name,\[\d&#43;\]\.connectbox\.id,\[\d&#43;\]\.connectbox\.name,\[\d&#43;\]\.columns,\[\d&#43;\]\.block,\[\d&#43;\]\.linePairNumber
这里在使用的时候,感觉既然已经写出了不需要序列化的属性、方法,为什么系统还会报NoSuchMethod:getHibernateLazyInitializer()呢?查看struts2的json插件的源代码(JSONWriter类)发现,其原来的代码是,先序列化各个属性,然后再对所有序列化出的属性,根据参数设定哪些要过滤。
所以我修改了其源代码,先根据条件过滤,然后再序列化,只是调换了其代码的顺序。修改后的JSONWrite类,修改了bean(Object object)方法,将原来的221-232行,提前到193-204行。修改后的JSONWriter类在文章最后。
上边两种解决方式,推荐使用第二种,有写的不对的地方,请指正、一起讨论,谢谢!
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:36720次
排名:千里之外
原创:31篇
(1)(1)(2)(11)(10)(1)(2)(1)(3)(1)(3)(2)

我要回帖

更多关于 struts2 action配置 的文章

 

随机推荐