Struts2中使用JSON的完整指南
在Java Web开发中,Struts2框架与JSON的结合使用非常常见,特别是在前后端分离架构中,本文将详细介绍在Struts2中如何配置和使用JSON进行数据交互。
准备工作
添加依赖
需要在项目中添加Struts2的JSON插件依赖,对于Maven项目,在pom.xml中添加:
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-json-plugin</artifactId>
<version>2.5.30</version> <!-- 使用与Struts2版本匹配的插件版本 -->
</dependency>
配置struts.xml
在struts.xml中配置JSON结果类型:
<package name="default" namespace="/" extends="json-default">
<action name="userAction" class="com.example.UserAction">
<result type="json"></result>
</action>
</package>
注意:这里继承的是json-default包,而不是默认的struts-default。
Action配置
基本JSON返回
创建一个Action类,提供getter方法供JSON序列化:
public class UserAction {
private String username;
private int age;
private List<String> hobbies;
// getter和setter方法
public String execute() {
// 业务逻辑处理
return "success";
}
}
控制JSON输出
可以通过注解或配置来控制JSON输出:
@Namespace("/api")
@ParentPackage("json-default")
public class UserAction {
private String username;
private int age;
private List<String> hobbies;
@JSON(name = "user_name") // 指定JSON中的key名称
public String getUsername() {
return username;
}
@JSON(serialize = false) // 不序列化该字段
public int getAge() {
return age;
}
// 其他getter和setter
public String execute() {
return "success";
}
}
处理复杂对象
返回嵌套对象
public class UserAction {
private User user;
private List<Role> roles;
// getter和setter
public String getUserDetail() {
user = new User("张三", 25);
roles = Arrays.asList(new Role("admin"), new Role("user"));
return "success";
}
}
处理日期格式
使用@JSON(format = "yyyy-MM-dd")注解:
public class User {
private String name;
private Date birthday;
@JSON(format = "yyyy-MM-dd HH:mm:ss")
public Date getBirthday() {
return birthday;
}
}
接收JSON请求
配置允许接收JSON
在struts.xml中配置:
<action name="saveUser" class="com.example.UserAction" method="save">
<interceptor-ref name="json">
<param name="enableSMD">true</param>
<param name="ignoreSMDParameter">false</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
<result type="json"></result>
</action>
解析JSON请求
public class UserAction {
private User user; // 需要有setter方法
public String save() {
// 处理接收到的user对象
System.out.println("Received user: " + user.getName());
return "success";
}
public void setUser(User user) {
this.user = user;
}
}
前端发送JSON请求示例:
$.ajax({
url: "saveUser",
type: "POST",
contentType: "application/json",
data: JSON.stringify({
name: "李四",
age: 30
}),
success: function(response) {
console.log(response);
}
});
常见问题与解决方案
循环引用问题
当对象之间存在循环引用时,JSON序列化会出错,解决方案:
@JSON(serialize = false)
public User getFriend() {
return friend;
}
或使用@JSON注解的serialize属性控制。
自定义序列化
实现JSONString接口或使用@JSON注解的serialize属性。
处理集合类型
Struts2 JSON插件默认支持List、Set等集合类型的序列化。
最佳实践
- 始终对返回的JSON数据进行验证
- 使用DTO(数据传输对象)而不是直接暴露实体类
- 考虑安全性,避免序列化敏感信息
- 合理使用
@JSON注解控制输出格式 - 对于复杂场景,可以考虑使用Jackson或Gson等专业JSON库
Struts2通过JSON插件提供了强大的JSON支持,使得前后端数据交互变得简单高效,通过合理的配置和编码实践,可以轻松实现复杂的数据序列化和反序列化需求,随着前后端分离架构的普及,Struts2中的JSON使用技巧变得越来越重要。



还没有评论,来说两句吧...