本文共 1724 字,大约阅读时间需要 5 分钟。
最近的项目中用到了很多ajax的操作,需要向struts2后台提交、然后接收后台返回的json对象。为这个事情折腾了好久,现在有点空闲了,把过程记录一下。
通用配置
建议用maven来管理jar包。虽然有些大材小用,但一般不会有遗漏。
除struts2的jar包外,还需要struts2-json-plugin.jar。需要注意的是这个插件包和strut2的版本相匹配。我们这次把struts2升级到了2.3.14,导致此前用的struts2-json-plugin-1.8.1.jar抛出ClassNotFoundException。原因就是两个jar包版本不匹配。升级后就ok了。
从struts2返回json对象
最基本的配置就是为action的result属性增加type="json"字段,如下所示:
1 2 3 | < action name = "securityAction" class = "SecurityAction" > < result name = "success" type = "json" /> </ action > |
有一点需要注意的是,在返回json的默认处理中,struts2只会将当前root对象(默认就是当前请求的action对象)自己的get方法或属性加入json对象中,而不会处理它的父类中的方法或属性。因此,在action中应该把自己需要输出到json中的方法、属性明确的进行定义,不能指望从父类继承。
如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | public class Father { private String name; private int age; public String getName(){ return this .name; } public int getAge(){ return this .age; } } public class Son extends Father { @Override public String getName(){ return this .name; } public String execute(){ return "success" ; } } |
当把Son.java用作一个action时,它的<
result
name
=
"success"
type
=
"json"
/>
将只会输出
1 2 3 | { "name" : "xxx" } |
而不会把父类中的age属性也输出到json对象中。如果需要输出age,则Son中还要定义getAge()方法才行。
从根子上说,这是因为struts2的json拦截器中,有一个属性"ignoreHierarchy"默认设置为"true"。看名字就能猜到,它的意思是“忽略继承等层级关系”。如果在拦截器的配置中将其设置为false,那么输出的json对象将把root的所有父类方法都遍历一遍,直到Object。这就有点矫枉过正了。
向struts2提交json对象这个需求稍微复杂一点。比上面那个需求多两步:
1、前端发起的ajax请求中,要定义 contentType : "application/json" 这个属性;
2、struts2的拦截器堆栈中,要显式增加json的拦截器:<interceptor-ref name="json" />
此外,就是通用的,get和set方法了。
在提交json对象时也遇到了不能用调用父类方法的问题,解决方法和返回json时是一样的。
另外还遇到一个问题。在spring中,为action配置了parent="parentAction"属性;而parentAction的配置中又有abstract="true"的配置。结果,有的开发人员就无法将json对象提交到action中,而同样的配置,另一位开发人员就可以提交。还没有找到原因。
本文转自 斯然在天边 51CTO博客,原文链接:http://blog.51cto.com/winters1224/1217400,如需转载请自行联系原作者