Struts1 返回 JSON 数据的完整指南
在早期的 Java Web 开发中,Struts1 作为一款成熟的 MVC 框架,曾被广泛应用于企业级项目中,虽然如今 Struts1 已逐渐被 Struts2、Spring MVC 等框架取代,但在一些遗留系统维护或特定场景下,仍需要其核心功能。如何让 Struts1 Action 返回 JSON 数据是一个常见需求,特别是在前后端分离架构或 AJAX 交互中,本文将详细介绍 Struts1 返回 JSON 的多种实现方式,包括依赖配置、代码编写及常见问题解决。
Struts1 返回 JSON 的核心思路
Struts1 的核心设计是基于 ActionForm 和 JSP 视图,默认返回的是 HTML 页面,要返回 JSON 数据,需要打破默认流程,通过以下两种主要思路实现:
- 手动拼接 JSON 字符串:在 Action 中手动构建 JSON 格式的字符串,然后通过
HttpServletResponse直接输出到客户端。 - 使用 JSON 转换工具:借助第三方 JSON 库(如
json-lib、Gson、FastJSON)将 Java 对象转换为 JSON 字符串,再通过HttpServletResponse输出。
无论哪种方式,关键点在于:
- 绕过 Struts1 的视图解析:不使用
struts-config.xml中配置的forward或redirect,而是直接操作HttpServletResponse的输出流。 - 设置正确的响应头:明确告知客户端返回的是 JSON 数据,通常需要设置
Content-Type: application/json或application/javascript。
环境准备:添加 JSON 依赖
如果使用 JSON 转换工具,需要先在项目中添加对应的 JAR 包,以常用的 json-lib 为例(需依赖 commons-beanutils、commons-collections、commons-lang、ezmorph),pom.xml 依赖配置如下(如果是 Maven 项目):
<dependencies>
<!-- Struts1 核心依赖 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts-core</artifactId>
<version>1.3.10</version>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts-taglib</artifactId>
<version>1.3.10</version>
</dependency>
<!-- JSON 转换工具:json-lib -->
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier> <!-- 根据 JDK 版本选择 -->
</dependency>
<!-- json-lib 依赖的第三方库 -->
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.4</version>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.2</version>
</dependency>
</dependencies>
如果是传统 Java 项目,直接下载对应的 JAR 包并添加到 WEB-INF/lib 目录下即可。
实现方式一:手动拼接 JSON 字符串
对于简单的 JSON 结构(如纯键值对、数组),可以直接在 Action 中手动拼接 JSON 字符串,然后通过 HttpServletResponse 输出。
编写 Action 类
Action 是 Struts1 的核心控制器,需要继承 org.apache.struts.action.Action,并重写 execute 方法,在 execute 方法中,手动构建 JSON 字符串并输出。
package com.example.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
public class UserAction extends Action {
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) throws Exception {
// 1. 准备数据(模拟从数据库查询)
String username = "张三";
int age = 25;
String email = "zhangsan@example.com";
// 2. 手动拼接 JSON 字符串
// 注意:JSON 中字符串需要用双引号,且需要对特殊字符(如双引号)进行转义
String jsonString = "{\"username\": \"" + username + "\", \"age\": " + age + ", \"email\": \"" + email + "\"}";
// 3. 设置响应头(关键:告知客户端返回 JSON 数据)
response.setContentType("application/json"); // 或 application/javascript
response.setCharacterEncoding("UTF-8"); // 避免中文乱码
// 4. 输出 JSON 字符串到客户端
response.getWriter().write(jsonString);
// 5. 返回 null,表示已手动处理响应,无需 Struts1 进行后续转发
return null;
}
}
配置 struts-config.xml
在 struts-config.xml 中配置 Action 的映射,无需配置 forward,因为响应是手动输出的。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
"http://struts.apache.org/dtds/struts-config_1_3.dtd">
<struts-config>
<form-beans>
<!-- 此示例未使用 ActionForm,可省略或配置 dummy form -->
</form-beans>
<action-mappings>
<!-- 配置 UserAction,path 为访问路径,type 为 Action 全限定类名 -->
<action path="/user/getUserInfo"
type="com.example.action.UserAction"
name="userForm"
scope="request"
validate="false">
<!-- 不配置 forward,因为响应是手动输出的 -->
</action>
</action-mappings>
<!-- 其他配置(如数据源、插件等) -->
</struts-config>
测试
启动项目后,通过浏览器或 API 工具(如 Postman)访问 http://localhost:8080/项目名/user/getUserInfo,将返回以下 JSON 数据:
{"username": "张三", "age": 25, "email": "zhangsan@example.com"}
优缺点分析
- 优点:无需额外依赖,适合极简 JSON 场景。
- 缺点:手动拼接 JSON 容易出错(如特殊字符转义、嵌套结构处理复杂),代码可维护性差。
实现方式二:使用 JSON 转换工具(推荐)
对于复杂的 Java 对象(如嵌套对象、集合),手动拼接 JSON 十分繁琐,推荐使用第三方 JSON 库(如 json-lib、Gson、FastJSON)进行自动转换。
使用 json-lib 转换 Java 对象
json-lib 是早期常用的 JSON 工具,支持将 Java 对象(如 Map、List、JavaBean)转换为 JSON 字符串。
(1)定义 JavaBean
首先定义一个需要转换为 JSON 的 JavaBean(如 User):
package com.example.model;
public class User {
private String username;
private int age;
private String email;
// 无参构造器(json-lib 需要)
public User() {}
// 有参构造器
public User(String username, int age, String email) {
this.username = username;
this.age = age;
this.email = email;
}
// Getter 和 Setter(必须提供,json-lib 通过反射调用)
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
(2)修改 Action 类
在 Action 中创建 User 对象,使用 json-lib 的 JSONObject 或 JSONArray 进行转换:
package com.example.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import net.sf.json.JSONObject; // 引入 json-lib 的 JSONObject
import com.example.model.User;
public class UserJsonAction extends Action {
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) throws Exception {
// 1.


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