Struts2 中处理 JSON 数据的完整指南
在 Java Web 开发中,Struts2 作为经典的 MVC 框架,常需要与前端进行数据交互,而 JSON(JavaScript Object Notation)因其轻量级、易解析的特点,成为前后端数据交换的主流格式,本文将详细介绍如何在 Struts2 中处理 JSON 数据,包括配置依赖、接收 JSON 请求、返回 JSON 响应及常见问题解决。
准备工作:添加必要依赖
在 Struts2 中处理 JSON 数据,通常需要集成 Struts2 JSON 插件,该插件提供了 json 结果类型,方便将 Action 返回的对象序列化为 JSON 格式,需在项目中添加相关依赖(以 Maven 为例):
Struts2 核心依赖
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.5.33</version> <!-- 建议使用稳定版本 -->
</dependency>
Struts2 JSON 插件依赖
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-json-plugin</artifactId>
<version>2.5.33</version>
</dependency>
其他可选依赖
- 如果需处理 JSON 数据绑定(如将 JSON 请求体映射到 Java 对象),可添加 Jackson 或 Gson(JSON 插件默认支持 Jackson):
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.2</version> </dependency>
核心配置:启用 JSON 支持
配置 Struts2 拦截器栈
JSON 插件会自动注册 json 结果类型,但需确保 Action 的拦截器栈包含 json 拦截器,默认情况下,struts-default 拦截器栈已包含 json 拦截器,因此只需在 struts.xml 中继承 struts-default 即可:
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<!-- 设置开发模式,方便调试 -->
<constant name="struts.devMode" value="true" />
<!-- 包含默认配置,继承 json 拦截器 -->
<package name="default" extends="struts-default">
<!-- 后续配置 Action -->
</package>
</struts>
接收 JSON 请求:将 JSON 数据映射到 Action 属性
前端常通过 POST 请求发送 JSON 数据(如 { "name": "张三", "age": 25 }),后端需将其解析并绑定到 Action 的属性中,Struts2 JSON 插件支持通过 Content-Type: application/json 请求自动解析 JSON 数据。
定义 Action 类及属性
创建一个 Action 类,定义与 JSON 字段对应的属性,并提供 setter 方法:
package com.example.action;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport {
private String name;
private Integer age;
// 必须提供 setter 方法,用于接收 JSON 数据
public void setName(String name) {
this.name = name;
}
public void setAge(Integer age) {
this.age = age;
}
// getter 方法(可选,用于返回数据)
public String getName() {
return name;
}
public Integer getAge() {
return age;
}
// 业务方法
public String saveUser() {
System.out.println("接收到的用户数据:name=" + name + ", age=" + age);
// 业务逻辑(如保存到数据库)
return SUCCESS;
}
}
配置 Action 及拦截器
在 struts.xml 中配置 Action,并指定 json 拦截器以启用 JSON 请求解析:
<package name="user" extends="default" namespace="/user">
<action name="saveUser" class="com.example.action.UserAction" method="saveUser">
<!-- 配置 json 拦截器参数 -->
<interceptor-ref name="json">
<!-- 指定需要解析的 JSON 字段(可选,默认解析所有 setter 属性) -->
<param name="enableSMD">false</param>
<param name="ignoreHierarchy">false</param>
</interceptor-ref>
<!-- 其他拦截器(如 defaultStack,需在 json 拦截器之前) -->
<interceptor-ref name="defaultStack" />
<!-- 结果配置(非必须,纯请求处理时可省略) -->
<result name="success">/success.jsp</result>
</action>
</package>
前端发送 JSON 请求
前端通过 AJAX 发送 JSON 数据,需设置 Content-Type: application/json 和 dataType: json(jQuery 示例):
$.ajax({
url: "/user/saveUser.action",
type: "POST",
contentType: "application/json", // 关键:指定请求体为 JSON
data: JSON.stringify({ name: "李四", age: 30 }), // 将对象转为 JSON 字符串
success: function(response) {
console.log("响应数据:", response);
},
error: function(err) {
console.error("请求失败:", err);
}
});
高级场景:接收复杂 JSON 对象
JSON 数据是嵌套对象或数组,需在 Action 中定义对应的复杂类型属性,并确保 Jackson 能正确序列化/反序列化。
// 前端发送 JSON:{ "username": "admin", "roles": ["admin", "user"] }
public class UserAction extends ActionSupport {
private UserDTO user; // 复杂对象
// UserDTO 类需定义 username 和 roles 属性
public void setUser(UserDTO user) {
this.user = user;
}
public UserDTO getUser() {
return user;
}
public String saveUser() {
System.out.println("用户名:" + user.getUsername());
System.out.println("角色列表:" + user.getRoles());
return SUCCESS;
}
}
返回 JSON 响应:将 Action 结果序列化为 JSON
Struts2 最常用的 JSON 返回方式是通过 json 结果类型,将 Action 的属性或指定对象序列化为 JSON 响应给前端。
配置 json 结果类型
在 struts.xml 中为 Action 配置 json 结果类型,并指定需要序列化的属性:
<package name="user" extends="default" namespace="/user">
<action name="getUser" class="com.example.action.UserAction" method="getUser">
<!-- 配置 json 结果类型 -->
<result type="json">
<!-- 指定需要序列化的属性(默认序列化所有 getter 属性) -->
<param name="root">user</param> <!-- 序列化 user 属性 -->
<!-- 忽略某些属性(如密码等敏感信息) -->
<param name="excludeProperties">password</param>
<!-- 是否美化输出(缩进格式) -->
<param name="enableGZIP">false</param>
<!-- 是否将 null 值序列化为 null(默认为 true) -->
<param name="serializeNullProperties">false</param>
</result>
</action>
</package>
Action 中准备返回数据
在 Action 中定义需要返回的属性,并通过 getter 方法暴露给 json 结果类型:
public class UserAction extends ActionSupport {
private UserDTO user;
private List<String> roles;
private Map<String, Object> extraData;
public String getUser() {
// 模拟查询用户数据
user = new UserDTO();
user.setUsername("张三");
user.setAge(25);
// 模拟角色列表
roles = Arrays.asList("admin", "user");
// 模拟额外数据
extraData = new HashMap<>();
extraData.put("loginTime", new Date());
extraData.put("ip", "192.168.1.1");
return SUCCESS;
}
// getter 方法(json 结果类型通过 getter 获取属性值)
public UserDTO getUser() {
return user;
}
public List<String> getRoles() {
return roles;
}
public Map<String, Object> getExtraData() {
return extraData;
}
}
前端接收 JSON 响应
前端通过 AJAX 请求 Action,直接获取 JSON 数据:
$.ajax({
url: "/user/getUser.action",
type: "GET",
success: function(response


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