Struts2 返回 JSON 数据的完整指南
在 Web 开发中,将服务器端数据以 JSON 格式返回给前端是一种常见的需求,Struts2 作为经典的 Java Web 框架,提供了多种方式来实现 JSON 数据的返回,本文将详细介绍如何在 Struts2 中配置和实现 JSON 数据的返回,包括基本配置、注解方式以及常见问题的解决方法。
准备工作
在开始之前,确保你的项目中已经包含了以下必要的依赖:
- Struts2 核心库
- Struts2 JSON 插件(struts2-json-plugin.jar)
可以通过 Maven 添加以下依赖:
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.5.30</version>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-json-plugin</artifactId>
<version>2.5.30</version>
</dependency>
基本配置方式
配置 struts.xml
在 struts.xml 中,需要配置 Action 的返回类型为 json:
<package name="default" namespace="/" extends="json-default">
<action name="userJson" class="com.example.action.UserAction">
<result type="json"></result>
</action>
</package>
注意:这里需要继承 json-default 包,而不是默认的 struts-default。
编写 Action 类
Action 类可以是一个普通的 POJO,不需要实现任何接口:
package com.example.action;
import com.opensymphony.xwork2.Action;
public class UserAction {
private String name;
private int age;
private String email;
// getters and setters
public String execute() {
// 模拟业务逻辑
this.name = "张三";
this.age = 25;
this.email = "zhangsan@example.com";
return Action.SUCCESS;
}
}
前端调用
当前端请求这个 Action 时,Struts2 会自动将 Action 的属性序列化为 JSON 格式返回,使用 jQuery 调用:
$.ajax({
url: "userJson.action",
type: "GET",
dataType: "json",
success: function(data) {
console.log(data.name); // 输出: 张三
console.log(data.age); // 输出: 25
console.log(data.email); // 输出: zhangsan@example.com
}
});
使用注解方式
从 Struts2 2.5 开始,推荐使用注解来配置 Action,这样可以减少 XML 配置的繁琐。
启用注解支持
在 struts.xml 中添加:
<constant name="struts.enable.DynamicMethodInvocation" value="false" /> <constant name="struts.devMode" value="true" /> <constant name="struts.convention.action.includeJars" value=".*struts2-json-.*\.jar" />
使用 @Namespace 和 @Action 注解
package com.example.action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import com.opensymphony.xwork2.Action;
@Namespace("/")
@Results({
@Result(name = Action.SUCCESS, type = "json")
})
public class UserAction {
private String name;
private int age;
private String email;
// getters and setters
@Action("userJson")
public String execute() {
this.name = "李四";
this.age = 30;
this.email = "lisi@example.com";
return Action.SUCCESS;
}
}
高级配置
指定返回的属性
默认情况下,所有 getter 方法对应的属性都会被序列化为 JSON,如果只想返回部分属性,可以使用 @JSON 注解:
public class UserAction {
private String name;
private int age;
private String email;
@JSON(name = "userName") // 自定义 JSON 中 key 的名称
public String getName() {
return name;
}
// 其他 getters and setters
}
或者在 struts.xml 中配置:
<action name="userJson" class="com.example.action.UserAction">
<result type="json">
<param name="ignoreHierarchy">false</param>
<param name="includeProperties">name,age</param> <!-- 只包含 name 和 age 属性 -->
</result>
</action>
处理日期格式
默认情况下,日期会被序列化为时间戳,可以通过配置自定义日期格式:
<action name="userJson" class="com.example.action.UserAction">
<result type="json">
<param name="excludeProperties">password</param>
<param name="dateFormat">yyyy-MM-dd</param>
</result>
</action>
或者在 Action 类中使用 @JSON 注解:
@JSON(format = "yyyy-MM-dd") private Date birthday;
处理集合和复杂对象
Struts2 的 JSON 插件会自动处理集合和复杂对象的序列化:
public class UserAction {
private List<String> hobbies;
private Map<String, Object> userInfo;
// getters and setters
public String execute() {
hobbies = Arrays.asList("阅读", "旅行", "摄影");
userInfo = new HashMap<>();
userInfo.put("address", "北京市朝阳区");
userInfo.put("phone", "13800138000");
return Action.SUCCESS;
}
}
常见问题及解决方案
报错 "No result defined for action ... and result input"
确保在 struts.xml 中正确配置了 json-default 包的继承,Action 的返回类型设置为 json。
返回的 JSON 中包含不需要的属性
使用 excludeProperties 参数排除不需要的属性:
<result type="json">
<param name="excludeProperties">password,innerObject</param>
</result>
处理循环引用问题
当对象之间存在循环引用时,序列化会出错,可以通过以下方式解决:
- 使用
@JSON(serialize = false)注解标记不需要序列化的属性 - 在
struts.xml中配置:
<result type="json">
<param name="excludeProperties">user.password</param>
<param name="ignoreHierarchy">true</param>
</result>
处理中文乱码问题
如果返回的 JSON 中出现中文乱码,可以在 struts.xml 中添加:
<constant name="struts.i18n.encoding" value="UTF-8" />
或者在 Action 方法中设置响应编码:
public String execute() throws Exception {
HttpServletResponse response = ServletActionContext.getResponse();
response.setContentType("application/json;charset=UTF-8");
return Action.SUCCESS;
}
Struts2 返回 JSON 数据主要有以下几种方式:
- 基本配置方式:在
struts.xml中配置 Action 的返回类型为json,适合简单的需求。 - 注解方式:使用
@Namespace、@Action等注解,减少 XML 配置,代码更简洁。 - 高级配置:通过参数控制返回的属性、日期格式等,满足复杂需求。
在实际开发中,建议根据项目规模和团队习惯选择合适的方式,对于新项目,推荐使用注解方式,因为它更符合现代开发的趋势,并且代码可读性更高。
通过以上配置和方法,你可以在 Struts2 应用中轻松实现 JSON 数据的返回,为前后端分离的架构提供良好的支持。



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