Struts2 返回 JSON 数据的完整指南
Struts2 返回 JSON 数据的完整指南
在 Web 开发中,前后端分离架构越来越流行,Struts2 作为经典的 Java Web 框架,也提供了灵活的方式来返回 JSON 数据,本文将详细介绍在 Struts2 中如何配置和实现返回 JSON 数据的多种方法。
使用 Struts2 的 JSON 插件
Struts2 官方提供了 JSON 插件(struts2-json-plugin),这是最常用也是最简单的方式返回 JSON 数据。
添加依赖
在项目中添加 JSON 插件的依赖(以 Maven 为例):
<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" extends="json-default">
<action name="userAction" class="com.example.UserAction">
<result type="json" name="success">
<param name="root">user</param>
</result>
</action>
</package>
编写 Action 类
Action 类中定义需要返回的属性,并提供 getter 方法:
public class UserAction extends ActionSupport {
private User user;
public String execute() {
user = new User("张三", 25);
return SUCCESS;
}
public User getUser() {
return user;
}
}
高级配置
JSON 插件还支持更多配置选项:
<result type="json">
<param name="root">user</param>
<param name="excludeProperties">password,secretKey</param> <!-- 排除某些属性 -->
<param name="includeProperties">name,age</param> <!-- 只包含某些属性 -->
<param name="noCache">true</param> <!-- 禁用缓存 -->
<param name="enableGZIP">true</param> <!-- 启用 GZIP 压缩 -->
<param name="contentType">application/json</param> <!-- 设置内容类型 -->
</result>
使用 Struts2 的原生结果类型
如果不使用 JSON 插件,也可以通过 Struts2 的原生结果类型实现 JSON 返回。
配置 struts.xml
<package name="default" extends="struts-default">
<action name="userAction" class="com.example.UserAction">
<result type="stream">
<param name="contentType">application/json</param>
<param name="inputName">jsonInputStream</param>
</result>
</action>
</package>
编写 Action 类
public class UserAction extends ActionSupport {
private InputStream jsonInputStream;
public String execute() {
User user = new User("李四", 30);
String json = new ObjectMapper().writeValueAsString(user);
jsonInputStream = new ByteArrayInputStream(json.getBytes());
return SUCCESS;
}
public InputStream getJsonInputStream() {
return jsonInputStream;
}
}
使用注解方式(Struts2 2.5+)
Struts2 2.5 版本开始支持更简洁的注解方式:
启用注解
在 struts.xml 中添加常量:
<constant name="struts.enable.DynamicMethodInvocation" value="false" /> <constant name="struts.devMode" value="true" /> <constant name="struts.convention.action.includeJars" value=".*jar" /> <constant name="struts.convention.package.locators" value="action" />
使用 @Action 和 @Result 注解
@Namespace("/user")
@ParentPackage("json-default")
public class UserAction {
@Action(value = "getUser",
results = {
@Result(name = "success", type = "json", params = {
"root", "user",
"excludeProperties", "password,secretKey"
})
})
public String getUser() {
user = new User("王五", 28);
return SUCCESS;
}
}
处理复杂对象集合
当需要返回 List 或 Map 等复杂对象时:
返回 List
public class UserAction extends ActionSupport {
private List<User> users;
public String execute() {
users = Arrays.asList(
new User("张三", 25),
new User("李四", 30)
);
return SUCCESS;
}
public List<User> getUsers() {
return users;
}
}
返回 Map
public class UserAction extends ActionSupport {
private Map<String, Object> result;
public String execute() {
result = new HashMap<>();
result.put("success", true);
result.put("message", "操作成功");
result.put("data", new User("赵六", 35));
return SUCCESS;
}
public Map<String, Object> getResult() {
return result;
}
}
常见问题与解决方案
- 404 错误:确保 struts.xml 中配置了
extends="json-default" - 中文乱码:在 struts.xml 中添加
<constant name="struts.i18n.encoding" value="UTF-8" /> - 日期格式问题:自定义日期转换器或使用 @JSON 注解:
@JSON(format = "yyyy-MM-dd") private Date birthday;
Struts2 返回 JSON 数据主要有三种方式:
- 使用 JSON 插件(最简单推荐)
- 使用原生 stream 结果类型(更灵活)
- 使用注解方式(更简洁,适合 Struts2 2.5+)
根据项目需求和个人偏好选择合适的方式,JSON 插件提供了最便捷的解决方案,而原生方式和注解方式则提供了更多的灵活性和控制力,在实际开发中,合理配置和使用这些方法,可以轻松实现前后端数据交互。



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