博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
struts2.0的json操作
阅读量:6422 次
发布时间:2019-06-23

本文共 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时,它的<resultname="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,如需转载请自行联系原作者

你可能感兴趣的文章
Java Collection: List、Set、 Map、 HashMap、 Hashtable、 Vector
查看>>
T-SQL查询进阶--流程控制语句
查看>>
Excel VBA小试
查看>>
备份Toad中保存的数据库连接用户名和密码
查看>>
ASP.NET中 Repeater 的使用前台绑定
查看>>
微信公众平台模拟群发技术
查看>>
C语言学习之指针详解
查看>>
学习使用Bing Maps Silverlight Control(一):准备和新建
查看>>
讲一讲什么叫阻塞非阻塞同步异步
查看>>
选择器补遗
查看>>
C# 实体集合和实体转换成相应的string、XDocument、XElement、XDocument
查看>>
轻松记住大端小端的含义(附对大端和小端的解释)
查看>>
dreamweaver中的 map怎么调用?_制作热点图像区域
查看>>
代码19
查看>>
Win10系列:UWP界面布局进阶5
查看>>
ABP Zero 本地化语言的初始化和扩展
查看>>
转Hibernate 一对多关联的CRUD__@ManyToOne(cascade=(CascadeType.ALL))
查看>>
FCT需求分析
查看>>
开门人和关门人(杭电1234)
查看>>
万能adapter
查看>>