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
还没有评论,来说两句吧...