Struts1 返回 JSON 数据的完整指南
在早期的 Java Web 开发中,Struts1 作为一款经典的 MVC 框架,虽然现在已较少使用,但在一些遗留系统中仍然存在,本文将详细介绍如何在 Struts1 框架中实现返回 JSON 数据的功能,帮助开发者维护或改造这类项目。
Struts1 返回 JSON 的基本原理
Struts1 本身并不直接支持 JSON 响应,但通过扩展和配置,我们可以实现这一功能,基本思路是:
- 创建一个自定义的 Action 或继承现有 Action
- 在 Action 中生成 JSON 格式的数据
- 配置 Struts1 使其能够正确处理和返回 JSON 响应
实现步骤
添加 JSON 处理依赖
需要在项目中添加 JSON 处理库,如 json-lib 或 org.json,以 Maven 为例:
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
创建返回 JSON 的 Action
import net.sf.json.JSONObject;
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 javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
public class JsonAction extends Action {
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
// 设置响应内容类型为 JSON
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
// 创建 JSON 对象
JSONObject jsonObject = new JSONObject();
jsonObject.put("name", "张三");
jsonObject.put("age", 30);
jsonObject.put("message", "Struts1 返回 JSON 示例");
// 获取输出流并写入 JSON 数据
PrintWriter out = response.getWriter();
out.print(jsonObject.toString());
out.flush();
out.close();
// 返回 null 表示已经处理完响应,不需要 Struts1 进行转发
return null;
}
}
配置 struts-config.xml
在 struts-config.xml 中配置 Action:
<action-mappings>
<action path="/jsonExample" type="com.example.JsonAction">
<!-- 不需要配置 forward,因为 Action 直接处理响应 -->
</action>
</action-mappings>
前端调用示例
$.ajax({
url: "jsonExample.do",
type: "GET",
dataType: "json",
success: function(data) {
console.log(data.name); // 输出: 张三
console.log(data.age); // 输出: 30
}
});
高级技巧
使用 Struts1 插件简化配置
可以使用 Struts1 的 JSON 插件(如 struts-json-plugin)来简化配置:
- 添加插件依赖
- 配置
struts-plugin.xml - 在 Action 中直接返回 POJO,插件会自动转换为 JSON
处理复杂数据结构
对于复杂的 Java 对象,可以递归转换为 JSON:
// 假设有一个 User 对象
User user = new User("李四", 25);
List<String> hobbies = Arrays.asList("阅读", "旅行");
user.setHobbies(hobbies);
JSONObject userJson = JSONObject.fromObject(user);
处理日期格式
日期需要特殊处理:
JSONUtils.getMorpherRegistry().registerMorpher(
new DateMorpher(new String[]{"yyyy-MM-dd"},
(JSONUtils.getMorpherRegistry().getMorpherRegistry())));
常见问题及解决方案
-
中文乱码问题:
- 确保
response.setCharacterEncoding("UTF-8")已设置 - 检查 web.xml 中是否有字符编码过滤器
- 确保
-
JSON 数据格式错误:
- 使用 JSON 验证工具检查生成的 JSON 字符串
- 确保没有多余的逗号或未闭合的括号
-
浏览器缓存问题:
- 在响应头中添加缓存控制:
response.setHeader("Cache-Control", "no-cache")
- 在响应头中添加缓存控制:
虽然 Struts1 已经不是现代 Web 开发的首选框架,但理解如何在 Struts1 中返回 JSON 数据对于维护遗留系统仍然很有价值,通过自定义 Action 和适当的配置,我们可以轻松实现 JSON 响应功能,在实际开发中,建议根据项目需求选择合适的 JSON 处理库,并注意处理可能出现的字符编码和性能问题。
随着技术的发展,新的框架如 Spring MVC、Struts2 等提供了更简洁的 JSON 支持,但在处理现有系统时,这些基础技术仍然非常必要。



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