0

0

Struts 2 AJAX JSON响应处理指南

DDD

DDD

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

|

573人浏览过

|

来源于php中文网

原创

Struts 2 AJAX JSON响应处理指南

本教程详细阐述了在Struts 2中处理AJAX JSON响应的正确方法。针对常见的问题,即AJAX请求收到解析错误或进入错误回调,本文指出直接通过HttpServletResponse写入JSON并同时使用json结果类型是错误的。核心解决方案是利用Struts 2 JSON插件的特性,将待序列化的数据封装为Action的属性(如Map),并通过公共Getter方法暴露,让插件自动完成JSON序列化,从而确保AJAX请求成功接收并解析JSON数据。

理解Struts 2 JSON插件的工作机制

在使用struts 2处理ajax请求并返回json数据时,开发者常会遇到json解析错误或ajax请求进入错误回调函数的问题。这通常源于对struts 2 json插件工作原理的误解。

最初的尝试可能是在Action中手动获取HttpServletResponse的Writer,然后将JSON字符串直接写入响应流,同时在struts.xml中配置result type="json"。例如:

初始Action代码片段(错误示范):

public class PropertyTesting extends ActionSupport {
    public String execute() {
        JSONObject obj  = new JSONObject();
        obj.put("Name", "PersonName");
        obj.put("ID", "PersonID");
        try {
            ServletActionContext.getResponse().getWriter().write(obj.toJSONString());
        } catch (IOException e) {
            e.printStackTrace();
        }
        return SUCCESS;
    }
}

对应的Struts.xml配置:


   
   
        
            
        
   

这种做法的问题在于:当struts.xml中配置了时,Struts 2的JSON插件会尝试自动序列化Action类中的属性(通常是那些带有公共getter方法的属性)为JSON格式。如果Action中同时手动写入了响应流,就会导致输出冲突或数据格式不符合预期,从而引发前端AJAX的解析错误。JSON插件预期由它自己来控制响应的输出,而不是由Action手动写入。

正确使用Struts 2 JSON插件

要正确地从Struts 2 Action返回JSON数据给AJAX请求,关键在于让Struts 2 JSON插件接管JSON的序列化过程。这意味着Action类不应该手动写入响应流,而是应该将需要转换为JSON的数据封装为Action的属性,并通过公共的Getter方法暴露出来。JSON插件会自动检测这些属性并将其序列化。

核心思想:

  1. 定义可序列化属性: 在Action类中定义一个属性(例如Map、List、自定义Java Bean等),用于存储要返回的JSON数据。
  2. 提供公共Getter方法: 为这个属性提供一个公共的Getter方法。JSON插件会通过反射调用这个Getter方法来获取数据并进行序列化。
  3. 移除手动写入代码: 从Action的execute方法中移除所有手动写入HttpServletResponse的代码。
  4. 配置json结果类型: 确保struts.xml中Action的结果类型为json,并且所在的包继承了json-default。

示例代码与实现

以下是基于上述原则修正后的Action类和相关配置:

VIVA
VIVA

一个免费的AI创意视觉设计平台

下载

1. Action类 (PropertyTesting.java)

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

public class PropertyTesting extends ActionSupport {

    // 定义一个Map属性,用于存储需要序列化的数据
    private Map jsonData; 

    // 提供公共的Getter方法,JSON插件会通过此方法获取数据
    // 注意:方法名通常是 "get" + 属性名首字母大写
    public Map getJsonData() {
        return jsonData;
    }

    @Override
    public String execute() {
        // 在execute方法中初始化并填充Map
        jsonData = new HashMap<>();
        jsonData.put("Name", "PersonName");
        jsonData.put("ID", "PersonID");

        // 返回SUCCESS,让Struts 2的JSON结果类型处理响应
        return SUCCESS;
    }
}

说明:

  • 我们定义了一个Map jsonData作为Action的私有属性。
  • 提供了公共的getJsonData()方法。JSON插件会查找Action中所有具有公共Getter方法的属性,并尝试将其序列化。通常,插件会序列化Action自身的所有属性,但可以通过root参数或excludeProperties等配置进行更精细的控制。在此简单场景下,插件会序列化jsonData。
  • execute()方法现在只负责准备数据并设置到jsonData属性中,不再手动写入响应。

2. JSP页面 (PropertyTesting.jsp)

前端AJAX代码保持不变,因为它已经正确地设置了dataType:"json",期望接收JSON数据。

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




Property Testing




    

3. Struts.xml 配置 (struts.xml)

Struts配置也保持不变,因为json-default包和result type="json"是正确使用JSON插件的基础。


   
   
        
            
        
   

重要提示:

  • extends="json-default":确保你的包继承了json-default,这样才能使用json结果类型。
  • result type="json":告诉Struts 2,这个Action的结果应该通过JSON插件进行序列化。
  • struts.devMode:在开发模式下设置为true有助于调试,会提供更详细的错误信息。

总结与注意事项

  • 让插件来做: Struts 2 JSON插件设计用于自动序列化Action的属性。避免在Action中手动写入响应流,这会与插件的功能冲突。
  • 属性与Getter: 任何你希望序列化为JSON的数据都应该作为Action的私有属性,并提供公共的Getter方法。这是JSON插件发现并序列化数据的机制。
  • Action非单例: Struts 2的Action是每次请求都会创建新的实例,因此不必担心在Action中定义属性会导致线程安全问题。你可以放心地在Action中创建和操作实例变量。
  • 数据类型: JSON插件可以序列化各种Java对象,包括Map、List、自定义的Java Bean等。对于简单的键值对,Map是一个非常方便的选择。
  • 调试: 如果仍然遇到问题,请检查浏览器的网络请求,查看服务器返回的原始响应内容。同时,确保struts.devMode为true以获取更详细的Struts 2日志。

通过遵循这些指导原则,你将能够更高效、更稳定地在Struts 2应用中处理AJAX JSON响应。

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

825

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

725

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

731

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

396

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

398

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

445

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

429

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

16881

2023.08.03

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

74

2025.12.31

热门下载

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

精品课程

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

共58课时 | 3.2万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 1.9万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 2.7万人学习

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

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