Struts2 返回 JSON 数据的完整指南
在 Struts2 框架中,返回 JSON 数据是一项常见的需求,特别是在开发 RESTful API 或前后端分离的应用时,本文将详细介绍如何在 Struts2 中配置和实现 JSON 数据的返回,包括多种实现方式和最佳实践。
准备工作
在开始之前,确保你的项目中已经包含了必要的依赖,对于 Struts2 返回 JSON 数据,主要需要以下 jar 包:
- struts2-json-plugin.jar(核心 JSON 插件)
- xwork-core.jar(通常随 Struts2 一起提供)
如果你的项目使用 Maven,可以在 pom.xml 中添加以下依赖:
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-json-plugin</artifactId>
<version>2.5.30</version> <!-- 使用与你的 Struts2 版本匹配的版本 -->
</dependency>
配置 Struts2 支持 JSON
启用 JSON 支持
在 struts.xml 配置文件中,确保已经启用了 JSON 插件,这个插件会自动加载,但为了确保万无一失,可以在 struts.xml 中显式声明:
<package name="default" extends="json-default">
<!-- 你的 Action 配置 -->
</package>
注意这里 extends="json-default" 而不是默认的 struts-default,json-default 包含了处理 JSON 响应的拦截器。
配置 Action
定义一个 Action,并配置其结果类型为 JSON:
<action name="userAction" class="com.example.UserAction">
<result type="json" name="success">
<param name="root">user</param>
</result>
</action>
这里的 root 参数指定了要序列化为 JSON 的对象,可以是 Action 的属性或方法返回值。
实现 Action 类
基本实现方式
Action 类需要提供一个 getter 方法,用于获取要序列化为 JSON 的对象:
package com.example;
import com.opensymphony.xwork2.Action;
public class UserAction implements Action {
private User user;
private String message;
public String execute() throws Exception {
// 业务逻辑处理
user = new User("张三", 30);
message = "操作成功";
return SUCCESS;
}
// Getter 方法,用于 JSON 序列化
public User getUser() {
return user;
}
public String getMessage() {
return message;
}
}
使用注解方式(推荐)
Struts2 提供了注解方式,可以更简洁地配置 JSON 返回:
package com.example;
import com.opensymphony.xwork2.Action;
import org.apache.struts2.json.annotations.JSON;
public class UserAction implements Action {
private User user;
private String message;
@Override
public String execute() throws Exception {
user = new User("李四", 25);
message = "查询成功";
return SUCCESS;
}
// 使用 @JSON 注解可以配置序列化时的名称
@JSON(name = "userInfo")
public User getUser() {
return user;
}
public String getMessage() {
return message;
}
}
复杂对象序列化
如果需要返回复杂对象(如包含嵌套对象或集合),确保这些对象也有适当的 getter 方法:
public class User {
private String name;
private int age;
private List<String> hobbies;
// 构造方法、getter 和 setter
}
// Action 中返回复杂对象
public class ComplexUserAction {
private User user;
private List<User> userList;
public String execute() {
user = new User("王五", 28);
user.setHobbies(Arrays.asList("阅读", "旅行", "编程"));
userList = new ArrayList<>();
userList.add(new User("赵六", 32));
userList.add(new User("钱七", 27));
return SUCCESS;
}
// getter 方法
}
高级配置选项
排除属性
可以使用 excludeProperties 参数排除不需要序列化的属性:
<result type="json" name="success">
<param name="root">user</param>
<param name="excludeProperties">password,secretKey</param>
</result>
或者在 Action 类中使用注解:
@JSON(serialize=false) private String password;
包含属性
与排除相反,可以使用 includeProperties 只包含指定的属性:
<result type="json" name="success">
<param name="root">user</param>
<param name="includeProperties">name,age</param>
</result>
日期格式化
默认情况下,日期会被序列化为时间戳,可以自定义格式:
<result type="json" name="success">
<param name="root">user</param>
<param name="dateFormat">yyyy-MM-dd HH:mm:ss</param>
</result>
防止循环引用
对于可能存在循环引用的对象,可以使用 ignoreHierarchy 或 excludeProperties 来避免无限递归:
<result type="json" name="success">
<param name="root">user</param>
<param name="ignoreHierarchy">true</param>
</result>
前端调用示例
返回的 JSON 数据可以通过 AJAX 请求在前端获取:
$.ajax({
url: "userAction.action",
type: "GET",
dataType: "json",
success: function(response) {
console.log("用户名: " + response.user.name);
console.log("年龄: " + response.user.age);
console.log("消息: " + response.message);
},
error: function(error) {
console.error("请求失败: ", error);
}
});
常见问题与解决方案
JSON 数据不返回或返回格式错误
- 检查
struts.xml中是否正确配置了extends="json-default" - 确保 Action 有正确的 getter 方法
- 检查是否有异常被抛出但未被捕获
日期格式不正确
- 使用
dateFormat参数指定正确的日期格式 - 或者在 Action 中将日期转换为字符串
中文字符显示为乱码
- 确保 web.xml 中配置了正确的字符编码过滤器
- 或者在 struts.xml 中设置
struts.i18n.encoding=UTF-8
Struts2 返回 JSON 数据主要通过 struts2-json-plugin 实现,核心步骤包括:
- 添加必要的依赖
- 在
struts.xml中配置extends="json-default" - 在 Action 中提供 getter 方法返回要序列化的对象
- 配置 Action 的结果类型为
json - 根据需要使用高级配置选项(如排除属性、日期格式等)
通过以上步骤,你可以轻松地在 Struts2 应用中实现 JSON 数据的返回,为前后端分离或 RESTful API 开发提供支持,随着技术的发展,虽然 newer 框架如 Spring Boot 在 JSON 处理上更为简便,但 Struts2 仍然在一些遗留项目中广泛使用,这些技巧对于维护和开发这类项目仍然非常有价值。



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