Struts2 接收 JSON 数据的完整指南**
在现代 Web 应用开发中,JSON(JavaScript Object Notation)因其轻量级、易读易写以及与 JavaScript 的良好兼容性,成为了前后端数据交换的主流格式之一,Struts2 作为一个成熟的 Java Web 框架,也提供了灵活的方式来接收和处理前端发送的 JSON 数据,本文将详细介绍在 Struts2 中接收 JSON 数据的几种常用方法、配置步骤及注意事项。
准备工作:引入必要的依赖
要在 Struts2 项目中处理 JSON 数据,首先需要确保项目中包含了处理 JSON 所需的库,最常用的是 struts2-json-plugin 插件,它简化了 Struts2 对 JSON 的支持。
如果你使用 Maven 进行项目管理,可以在 pom.xml 文件中添加以下依赖:
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-json-plugin</artifactId>
<version>2.5.30</version> <!-- 请根据你的 Struts2 版本选择合适的插件版本 -->
</dependency>
对于较新的 Struts2 版本(如 2.5+),该插件通常已经包含了必要的 JSON 处理库(如 json-lib 或 Jackson,具体取决于插件配置和依赖传递)。
配置 Struts2
-
在
struts.xml中配置 JSON Result 类型: 虽然 JSON Result 类型主要用于返回 JSON 数据,但配置它是启用 JSON 功能的一部分,尤其是在使用struts2-json-plugin时。<struts> <!-- 包含 JSON 插件支持 --> <package name="default" extends="json-default"> <!-- 你的 Action 配置将放在这里 --> </package> </struts>注意
extends="json-default",这会引入 JSON 插件定义的拦截器和 Result 类型。 -
配置 Action 以接收 JSON: Struts2 接收 JSON 数据主要有以下几种方式:
使用
JSONInterceptor(推荐,适用于简单对象或 Map)struts2-json-plugin提供了JSONInterceptor,它可以自动将请求体中的 JSON 数据转换成 Action 的属性。步骤:
-
创建 Action 类: Action 类需要提供一个无参构造函数,并为要接收 JSON 数据的属性提供 setter 方法,JSON 数据是一个对象,Action 中对应的属性类型可以是 JavaBean、Map 或 List 等。
假设前端发送如下 JSON 数据:
{ "username": "zhangsan", "age": 25, "email": "zhangsan@example.com" }对应的 Action 类可以这样写:
import com.opensymphony.xwork2.ActionSupport; public class UserAction extends ActionSupport { private String username; private Integer age; private String email; // 无参构造函数(通常由框架提供,但显式声明是好习惯) public UserAction() {} // 关键:为 JSON 属性提供 setter 方法 public void setUsername(String username) { this.username = username; } public void setAge(Integer age) { this.age = age; } public void setEmail(String email) { this.email = email; } // 可以提供 getter 方法用于后续处理或返回 JSON public String getUsername() { return username; } public Integer getAge() { return age; } public String getEmail() { return email; } // Action 的执行方法 public String execute() { // 在这里可以处理接收到的数据,例如保存到数据库等 System.out.println("Received User: " + this.username + ", " + this.age + ", " + this.email); return SUCCESS; } } -
配置
struts.xml: 在struts.xml中配置该 Action,并指定method(如果需要)和result。<struts> <package name="default" extends="json-default"> <action name="userAction" class="com.example.UserAction"> <result name="success">/success.jsp</result> <!-- 如果需要返回 JSON,可以配置 json result --> <!-- <result type="json" name="success"></result> --> </action> </package> </struts> -
前端发送 JSON 数据: 前端通常使用 AJAX(如 jQuery 的
$.ajax或 Fetch API)发送 POST 请求,并设置Content-Type为application/json。使用 jQuery 示例:
$(document).ready(function() { var userData = { username: "lisi", age: 30, email: "lisi@example.com" }; $.ajax({ url: "userAction.action", type: "POST", contentType: "application/json", data: JSON.stringify(userData), success: function(response) { console.log("Response from server:", response); }, error: function(error) { console.error("Error:", error); } }); });
使用
@JSON注解(适用于复杂对象或自定义绑定)如果需要对 JSON 数据的绑定进行更细粒度的控制,或者处理更复杂的 JSON 结构,可以使用
@JSON注解(需要struts2-json-plugin支持)。步骤:
-
创建 Action 类并使用注解: 接收一个包含地址信息的复杂 JSON 对象:
{ "name": "wangwu", "address": { "city": "Beijing", "street": "Chaoyang Road" } }Action 类可以这样写:
import com.opensymphony.xwork2.ActionSupport; import org.apache.struts2.json.annotations.JSON; public class ComplexUserAction extends ActionSupport { private String name; private Address address; // 内部类或单独的类 // Address 类 public static class Address { private String city; private String street; // setter 和 getter public void setCity(String city) { this.city = city; } public String getCity() { return city; } public void setStreet(String street) { this.street = street; } public String getStreet() { return street; } } // setter 和 getter public void setName(String name) { this.name = name; } public String getName() { return name; } public void setAddress(Address address) { this.address = address; } public Address getAddress() { return address; } public String execute() { System.out.println("Received Complex User: " + name + ", " + address.getCity() + ", " + address.getStreet()); return SUCCESS; } }这种方式下,
JSONInterceptor会尝试根据属性名递归地解析 JSON 对象。
使用
ModelDriven接口(适用于单个对象)如果你的 JSON 数据对应一个独立的 Java 对象,并且希望 Action 直接代表这个对象,可以实现
ModelDriven接口。步骤:
-
创建 Model 类:
public class User { private String username; private Integer age; private String email; // setter 和 getter public void setUsername(String username) { this.username = username; } public String getUsername() { return username; } public void setAge(Integer age) { this.age = age; } public Integer getAge() { return age; } public void setEmail(String email) { this.email = email; } public String getEmail() { return email; } } -
创建 Action 类实现
ModelDriven:import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven; public class UserModelDrivenAction extends ActionSupport implements ModelDriven<User> { private User user = new User(); // 初始化 model @Override public User getModel() { return user; } public String execute() { System.out.println("Received User (ModelDriven): " + user.getUsername() + ", " + user.getAge() + ", " + user.getEmail()); return SUCCESS; } } -
配置
struts.xml:<struts> <package name="default" extends="json-default"> <action name="userModelDrivenAction" class="com.example.UserModelDrivenAction"> <result name="success">/success.jsp</result> </action> </package> </struts>前端发送 JSON 数据的方式与方式一相同。
-
注意事项
- Content-Type 设置:前端发送 JSON 数据时,必须设置 `



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