0

0

Struts 2与AJAX集成:JSON响应解析失败的排查与解决

花韻仙語

花韻仙語

发布时间:2025-09-02 20:20:02

|

655人浏览过

|

来源于php中文网

原创

Struts 2与AJAX集成:JSON响应解析失败的排查与解决

本教程深入探讨Struts 2与AJAX集成时JSON响应解析失败的常见问题。核心在于Struts 2 JSON插件的序列化机制,它默认序列化Action的公共属性而非手动写入的流。通过在Action中定义可序列化的属性并正确配置Struts.xml,可以有效解决JSON解析错误,实现前后端数据流畅交互,确保AJAX请求成功接收和处理JSON数据。

问题背景与现象

在使用struts 2框架开发web应用时,我们经常需要通过ajax技术与后端进行异步数据交互,尤其是在前后端分离或部分数据动态加载的场景。当后端action处理完业务逻辑后,通常会返回json格式的数据给前端。然而,有时尽管后端看似输出了json字符串,前端ajax请求却可能进入error回调函数,并报告“parse error”或无法正确解析json数据。

最初的代码尝试通过ServletActionContext.getResponse().getWriter().write(obj.toJSONString());直接将JSON字符串写入HTTP响应流,并期望Struts 2的json结果类型能识别并处理。同时,struts.xml中配置了,且AJAX请求中设置了dataType:"json"。然而,这种组合导致了前端解析失败。

Struts 2 JSON插件的工作原理

Struts 2的JSON插件(struts2-json-plugin)提供了一种声明式的方式来生成JSON响应。当你在struts.xml中配置时,Struts 2并不会简单地将你手动写入响应流的内容作为JSON返回。相反,它的核心机制是:

  1. 序列化Action属性: JSON插件会检查当前Action实例中的公共(public)属性,特别是那些拥有公共getter方法的属性。
  2. 自动转换为JSON: 它会将这些属性的值自动序列化为JSON格式的字符串,并将其作为HTTP响应的主体发送回客户端。
  3. 内容类型设置: 插件还会自动设置HTTP响应的Content-Type为application/json。

因此,如果你在Action中直接使用ServletActionContext.getResponse().getWriter().write()来输出JSON,这会与JSON插件的自动序列化机制产生冲突。JSON插件在尝试序列化Action属性时,可能会发现没有需要序列化的内容(或者你手动写入的内容被覆盖/忽略),导致最终的响应不符合预期,或者前端在尝试解析一个并非由插件正确生成的JSON响应时出现错误。

解决方案:利用Action属性进行JSON序列化

要正确地通过Struts 2 JSON插件返回JSON数据,我们应该遵循其设计原则,即在Action中定义一个公共属性(通常是一个Map、List或自定义POJO),并通过其getter方法让JSON插件进行序列化。

以下是修改后的Action类示例:

import java.util.HashMap;
import java.util.Map;
import com.opensymphony.xwork2.ActionSupport;

public class PropertyTesting extends ActionSupport 
{
    // 定义一个Map类型的属性,用于存储需要返回的JSON数据
    // 必须有公共的getter方法,JSON插件才能访问并序列化它
    private Map jsonResponseData;

    // JSON插件会通过这个getter方法获取数据并序列化
    public Map getJsonResponseData() {
        return jsonResponseData;
    }

    public String execute() 
    {
        // 初始化Map并填充数据
        jsonResponseData = new HashMap<>();
        jsonResponseData.put("Name", "PersonName");
        jsonResponseData.put("ID", "PersonID");

        // 返回SUCCESS,让Struts 2根据struts.xml配置的json结果类型进行处理
        return SUCCESS;
    }
}

关键改动点:

PictoGraphic
PictoGraphic

AI驱动的矢量插图库和插图生成平台

下载
  1. 移除了JSONObject的使用以及手动写入响应流的代码。
  2. 定义了一个名为jsonResponseData的Map类型的私有属性。
  3. 为jsonResponseData属性提供了公共的getJsonResponseData()方法。JSON插件正是通过这个getter方法来获取Action中需要序列化的数据。
  4. 在execute()方法中,我们不再直接输出JSON,而是将数据填充到jsonResponseData这个属性中。

Struts.xml配置

struts.xml的配置保持不变,因为它已经正确地使用了JSON插件。确保你的package继承了json-default,并且action的result类型是json。


   
   
        
            
            
        
   
 

配置说明:

  • extends="json-default":这使得当前包能够使用JSON插件提供的各种功能,包括json结果类型。
  • :这指示Struts 2在Action成功执行后,使用JSON插件来处理响应。插件会查找Action中的公共getter方法,并将其返回值序列化为JSON。

前端AJAX请求

前端的AJAX请求代码无需修改,因为它已经正确地指定了dataType:"json",这告诉jQuery期望服务器返回JSON数据并尝试解析。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ taglib uri="/struts-tags" prefix="s"%>




Property Testing




    

现在,当invokeAjax()函数被调用时,jQuery会向PropertyTesting Action发送POST请求。Struts 2将执行PropertyTesting Action的execute()方法,填充jsonResponseData属性。随后,JSON插件会捕获jsonResponseData属性的值(通过getJsonResponseData()方法),将其序列化为JSON字符串,并以application/json的Content-Type返回给客户端。前端的jQuery AJAX请求就能成功解析这个JSON响应,并在success回调中处理数据。

注意事项与最佳实践

  1. Action属性的命名: JSON插件默认会序列化Action中所有带有公共getter方法的属性。如果你只想序列化特定属性,可以通过struts.xml中的yourPropertyName来指定根对象,或者使用@JSON(serialize=false)注解排除某些属性。
  2. 复杂对象序列化: 除了Map,你也可以使用自定义的POJO(Plain Old Java Object)作为Action的属性。JSON插件会自动递归序列化POJO的属性。
  3. 避免手动写入响应流: 一旦你决定使用Struts 2的JSON插件,就应避免在Action中直接操作HttpServletResponse.getWriter().write(),这会干扰插件的正常工作流程。
  4. 错误处理: 在AJAX的error回调中,errorResponse.responseText通常包含服务器返回的原始响应体,这对于调试非常有用。
  5. JSONObject库的使用: 在本例中,org.json.simple.JSONObject在Action中不再需要,因为Struts 2 JSON插件会处理Java对象到JSON的转换。
  6. Action非单例: Struts 2的Action是每次请求都会创建新的实例,因此在Action中定义实例变量来存储请求相关的数据是完全安全的,无需担心线程安全问题。

总结

解决Struts 2与AJAX集成时JSON响应解析失败的关键在于理解Struts 2 JSON插件的工作机制。它通过序列化Action中的公共属性来生成JSON响应,而不是依赖于Action手动写入响应流。通过在Action中定义一个带有公共getter方法的属性(如Map或自定义POJO)来承载需要返回的JSON数据,并配合正确的struts.xml配置,可以确保后端成功生成符合预期的JSON响应,前端AJAX也能顺利解析,从而实现高效可靠的前后端数据交互。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

418

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

535

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

311

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

77

2025.09.10

jquery插件有哪些
jquery插件有哪些

jquery插件有jQuery UI、jQuery Validate、jQuery DataTables、jQuery Slick、jQuery LazyLoad、jQuery Countdown、jQuery Lightbox、jQuery FullCalendar、jQuery Chosen和jQuery EasyUI等。本专题为大家提供jquery插件相关的文章、下载、课程内容,供大家免费下载体验。

150

2023.09.12

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

311

2023.10.13

jquery删除元素的方法
jquery删除元素的方法

jquery可以通过.remove() 方法、 .detach() 方法、.empty() 方法、.unwrap() 方法、.replaceWith() 方法、.html('') 方法和.hide() 方法来删除元素。更多关于jquery相关的问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

395

2023.11.10

jQuery hover()方法的使用
jQuery hover()方法的使用

hover()是jQuery中一个常用的方法,它用于绑定两个事件处理函数,这两个函数将在鼠标指针进入和离开匹配的元素时执行。想了解更多hover()的相关内容,可以阅读本专题下面的文章。

504

2023.12.04

俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

158

2026.01.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 4.2万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 2.5万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号