Struts2 响应 JSON 的完整指南
在现代 Web 开发中,JSON(JavaScript Object Notation)因其轻量级、易解析的特性,成为前后端数据交互的主流格式,Struts2 作为经典的 Java Web 框架,提供了多种方式支持 JSON 响应,满足 RESTful API、Ajax 请求等场景需求,本文将详细介绍 Struts2 响应 JSON 的核心方法、配置步骤及最佳实践,帮助开发者快速这一技能。
Struts2 响应 JSON 的核心原理
Struts2 响应 JSON 的核心在于将 Action 的处理结果(对象、集合或 Map)转换为 JSON 格式,并输出到 HTTP 响应体中,其实现主要依赖两个关键组件:
- JSON 插件:通过集成
struts2-json-plugin,将 Action 结果序列化为 JSON; - 结果类型(Result Type):使用
json结果类型,指定响应数据的格式和属性。
准备工作:添加 JSON 插件依赖
Struts2 默认不包含 JSON 处理功能,需手动添加 struts2-json-plugin 插件依赖,以 Maven 为例,在 pom.xml 中添加以下依赖:
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-json-plugin</artifactId>
<version>2.5.30</version> <!-- 建议与 Struts2 核心版本保持一致 -->
</dependency>
若使用 Gradle,则在 build.gradle 中添加:
implementation 'org.apache.struts:struts2-json-plugin:2.5.30'
实现 JSON 响应的详细步骤
配置 Struts2 拦截器
在 struts.xml 中,确保 Struts2 默认的拦截器栈包含 json 结果类型支持,Struts2 已默认配置,无需额外修改,但需检查 struts-default.xml 是否被正确引入(一般通过 struts.xml 中的 <package> 继承 struts-default)。
<struts>
<package name="default" extends="struts-default">
<!-- 后续配置 Action 和结果 -->
</package>
</struts>
创建 Action 并封装返回数据
Action 是 Struts2 的核心控制器,需定义要返回的 JSON 数据对象(POJO、List、Map 等),通过 getter/setter 方法暴露数据,Struts2 会自动将这些数据转换为 JSON。
示例:返回用户信息的 Action
package com.example.action;
import com.example.entity.User;
import java.util.ArrayList;
import java.util.List;
public class UserAction {
// 1. 简单对象:返回单个用户
private User user;
// 2. 集合:返回用户列表
private List<User> userList;
// 3. 状态信息:操作结果反馈
private String message;
private boolean success;
// 初始化数据(实际开发中可能来自 Service 层)
public String execute() {
// 示例1:返回单个用户
user = new User(1, "张三", "zhangsan@example.com");
// 示例2:返回用户列表
userList = new ArrayList<>();
userList.add(new User(1, "张三", "zhangsan@example.com"));
userList.add(new User(2, "李四", "lisi@example.com"));
// 示例3:返回操作状态
message = "查询成功";
success = true;
return "success";
}
// Getter 和 Setter 方法(必须提供,Struts2 通过反射访问)
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public List<User> getUserList() {
return userList;
}
public void setUserList(List<User> userList) {
this.userList = userList;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public boolean isSuccess() {
return success;
}
public void setSuccess(boolean success) {
this.success = success;
}
}
说明:
- Action 的返回值(如
execute()方法的success)对应struts.xml中定义的结果名称; - 数据对象需符合 JavaBean 规范(提供无参构造器、getter/setter)。
配置 Action 和 JSON 结果类型
在 struts.xml 中配置 Action,并指定 json 结果类型,通过参数控制 JSON 输出的行为。
<struts>
<package name="user" extends="struts-default" namespace="/api">
<!-- 示例1:返回单个用户 -->
<action name="getUser" class="com.example.action.UserAction" method="execute">
<!-- result name="success" 指定 execute() 方法返回 "success" 时生效 -->
<result name="success" type="json">
<!-- 配置 JSON 输出参数 -->
<param name="root">user</param> <!-- 指定输出的属性名,对应 Action 中的 getUser() -->
<param name="excludeProperties">user.password</param> <!-- 排除敏感字段(如密码) -->
<param name="includeProperties">user.id,user.name</param> <!-- 仅包含指定字段(优先级高于 exclude) -->
<param name="contentType">application/json;charset=UTF-8</param> <!-- 指定响应 Content-Type -->
<param name="enableGZIP">true</param> <!-- 启用 GZIP 压缩(大数据量时推荐) -->
</result>
</action>
<!-- 示例2:返回用户列表 -->
<action name="listUsers" class="com.example.action.UserAction" method="execute">
<result name="success" type="json">
<param name="root">userList</param> <!-- 输出 userList 属性 -->
<param name="contentType">application/json;charset=UTF-8</param>
</result>
</action>
<!-- 示例3:返回操作状态(无特定数据对象) -->
<action name="updateUser" class="com.example.action.UserAction" method="execute">
<result name="success" type="json">
<!-- 不指定 root,默认输出所有非空属性(message、success) -->
<param name="contentType">application/json;charset=UTF-8</param>
</result>
</action>
</package>
</struts>
json 结果类型常用参数说明:
| 参数名 | 说明 |
|----------------------|----------------------------------------------------------------------|
| root | 指定 Action 中要输出的属性名(如 user、userList),若不指定,默认输出所有非空属性。 |
| excludeProperties | 排除的属性名(支持通配符,如 user.*.password),多个属性用逗号分隔。 |
| includeProperties | 仅包含的属性名(优先级高于excludeProperties),多个属性用逗号分隔。 | |contentType| 响应的Content-Type,推荐设置为application/json;charset=UTF-8避免中文乱码。 | |enableGZIP| 是否启用 GZIP 压缩(true/false),减少网络传输量,适合大数据响应。 | |ignoreHierarchy| 是否忽略继承层次(true/false),默认false`,输出父类属性。 |
测试 JSON 响应
启动项目后,通过浏览器或 API 工具(如 Postman、curl)访问 Action 的 URL,观察响应结果。
示例1:访问 /api/getUser
响应结果(排除 password 字段后):
{
"id": 1,
"name": "张三",
"email": "zhangsan@example.com"
}
示例2:访问 /api/listUsers
响应结果:
[
{
"id": 1,
"name": "张三",
"email": "zhangsan@example.com"
},
{
"id": 2,
"name": "李四",
"email": "lisi@example.com"
}
]
示例3:访问 /api/updateUser
响应结果(输出所有非空属性):
{
"message": "查询成功",
"success": true
}
高级配置与最佳实践
处理日期格式(默认为时间戳)
默认情况下,Date 类型字段会被转换为时间戳(如 1678886400000),若需自定义格式(如 yyyy-MM-dd),可通过以下方式实现:



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