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 插件提供了最便捷的解决方案,而原生方式和注解方式则提供了更多的灵活性和控制力,在实际开发中,合理配置和使用这些方法,可以轻松实现前后端数据交互。
还没有评论,来说两句吧...