Struts 2 框架接收与处理JSON数据详解**
在Java Web开发中,Struts 2曾是一款非常流行的MVC框架,随着前后端分离架构的普及,后端服务接收JSON格式的请求数据已成为常态,本文将详细介绍如何在Struts 2框架中接收和处理来自客户端(通常是前端浏览器或移动端)的JSON数据。
准备工作:依赖引入
要让Struts 2支持JSON的接收和处理,首先需要在项目中添加必要的依赖,核心依赖是struts2-json-plugin,这个插件提供了将请求体中的JSON数据自动转换成Action对象属性的能力。
如果你使用Maven管理项目,需要在pom.xml中添加以下依赖:
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-json-plugin</artifactId>
<version>你的struts2版本号</version> <!-- 2.5.30 -->
</dependency>
确保这个依赖的版本与你项目中Struts 2核心库的版本兼容。
配置Struts 2
-
web.xml配置: 确保你的
web.xml中已经配置了Struts 2的核心过滤器FilterDispatcher(对于较新版本可能是StrutsPrepareAndExecuteFilter)。<filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> -
Struts.xml配置: 在
struts.xml配置文件中,你需要为接收JSON数据的Action进行特殊配置,关键点如下:- 指定Action的类。
- 设置
method属性(如果Action有多个处理方法)。 - 最重要的是,为该Action配置一个
result类型为json的结果映射。 - (可选)可以通过
params参数配置JSON插件的行为,例如排除某些属性、指定日期格式等。
示例配置:
<package name="default" namespace="/" extends="json-default"> <!-- 注意:这里要继承 json-default,而不是 struts-default --> <action name="userAction" class="com.example.action.UserAction"> <!-- method 属性可以指定调用的方法,默认是 execute --> <result type="json"> <!-- 这里可以配置json插件的参数 --> <!-- <param name="root">data</param> --> <!-- <param name="excludeProperties">password</param> --> </result> </action> </package>extends="json-default":这是关键!它告诉Struts 2使用JSON插件提供的拦截器和结果类型,如果你不继承json-default,JSON相关的拦截器不会执行,也就无法正确解析JSON数据。
编写接收JSON数据的Action
Action类的设计是接收JSON数据的核心,客户端发送的JSON数据中的键(key)需要与Action类中对应的属性(property)名相匹配,JSON插件会自动将JSON值注入到这些属性中。
-
Action类示例:
package com.example.action; import com.opensymphony.xwork2.ActionSupport; // 假设前端发送的JSON格式为:{"username":"张三", "age":25, "email":"zhangsan@example.com"} public class UserAction extends ActionSupport { private String username; private Integer age; private String email; // 也可以是一个对象,例如前端发送 {"user": {"username":"李四", "age":30}} // private User user; // 需要提供User的getter和setter // 处理请求的方法,可以自定义方法名,然后在struts.xml中指定 public String saveUser() { // username, age, email已经被自动注入了值 System.out.println("接收到的用户名: " + username); System.out.println("接收到的年龄: " + age); System.out.println("接收到的邮箱: " + email); // 可以在这里进行业务逻辑处理,比如保存到数据库 // userService.saveUser(this); // 返回结果,struts.xml中配置的json类型的result会处理这个返回值 return SUCCESS; // SUCCESS通常对应配置中的<result>,这里会以JSON形式返回 } // Getter 和 Setter 方法必须提供! public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } // 如果返回JSON数据,可以提供getter方法 // public String getSuccessMessage() { // return "用户保存成功!"; // } } -
关键点说明:
- 属性名与JSON键名一致:JSON插件会通过反射机制,查找Action中与JSON键名相同的属性,并调用其setter方法进行赋值,JSON中的
"username"会调用setUsername(String username)。 - 提供Getter和Setter:对于需要被注入的属性,必须提供public的getter和setter方法。
- 方法返回值:Action的处理方法(如上面的
saveUser())可以返回任意字符串,这个字符串会对应struts.xml中配置的result的name,如果配置了type="json",那么Struts 2会将Action中某些属性序列化为JSON作为响应返回给客户端(默认情况下,会排除null值和以"_"开头的属性)。
- 属性名与JSON键名一致:JSON插件会通过反射机制,查找Action中与JSON键名相同的属性,并调用其setter方法进行赋值,JSON中的
客户端如何发送JSON数据
客户端(如JavaScript的Fetch API、Axios,或jQuery的$.ajax)需要发送POST请求,并设置正确的Content-Type头为application/json,并且请求体(request body)为JSON字符串。
使用JavaScript Fetch API示例:
const userData = {
username: "王五",
age: 28,
email: "wangwu@example.com"
};
fetch('/userAction!saveUser', { // 对应struts.xml中的action name和method
method: 'POST',
headers: {
'Content-Type': 'application/json',
// 如果需要CSRF token,可以在这里添加
// 'X-CSRF-TOKEN': 'your-csrf-token'
},
body: JSON.stringify(userData)
})
.then(response => response.json()) // 响应通常是JSON格式
.then(data => {
console.log('服务器响应:', data);
// 处理服务器返回的JSON数据
})
.catch(error => {
console.error('Error:', error);
});
注意:
- 请求的URL要对应你在
struts.xml中配置的Action的name和namespace。 !saveUser部分是可选的,如果你的Action有默认的execute方法处理,或者通过method属性指定了默认方法,则可以省略。Content-Type: application/json是告诉服务器请求体是JSON格式,这对于Struts 2的JSON插件正确解析至关重要。
高级配置与注意事项
-
自定义响应JSON: 默认情况下,JSON插件会序列化Action的所有属性(除了
null和_开头),你可以通过在struts.xml的result配置中使用param来控制:root:指定哪个属性作为根节点返回,例如<param name="root">successMessage</param>,则只会返回getSuccessMessage()方法的值。excludeProperties:排除某些属性,例如<param name="excludeProperties">password,innerObject</param>。includeProperties:只包含某些属性。
-
处理复杂对象: 如果JSON中包含嵌套对象,例如
{"user":{"name":"Tom", "age":20}},那么你的Action中需要有一个User类型的属性user,并且User类也要有对应的name和age属性的getter和setter。 -
日期格式处理: 默认情况下,日期可能会被序列化为时间戳,你可以通过配置
java-date-format来指定格式:<result type="json"> <param name="java-date-format">yyyy-MM-dd HH:mm:ss</param> </result> -
拦截器:
json-default包已经包含了一系列拦截器,如json拦截器(负责解析JSON请求)、params拦截器(负责普通参数注入)等,确保这些拦截器在你的Action执行链中



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