如何将 Struts 2 动作类中的 InputStream 值传递给 JSP 页面中的 Ajax 并将该值转换为 JSON 数组

Posted

技术标签:

【中文标题】如何将 Struts 2 动作类中的 InputStream 值传递给 JSP 页面中的 Ajax 并将该值转换为 JSON 数组【英文标题】:How to pass InputStream value in Struts 2 action class to Ajax in JSP page and convert the value into JSON Array 【发布时间】:2017-08-29 11:14:57 【问题描述】:

我想将 JEON 数组从 Struts 2 动作类传递到 JSP 页面。我正在尝试将数据集作为字符串发送。我想知道的是,如何在 javascript 中读取这些数据。

这是我在Action 类中的方法:

private InputStream inputStream;

/* getter and setter*/

public String getClientMilestone() throws DAOTransientException, DBConfigException
        PaymentScheduleDao paymentScheduleDao = new PaymentScheduleDao();
        List <PaymentMilestone> paymentScheduleInfo = paymentScheduleDao.getClientMilestoneInfo(projectId);
        String result = "[";

        for(int i=0; i<paymentScheduleInfo.size(); i++)
            
            result += ""+"'"+"item"+i+"' : "+ "'"+"milestoneName"+ "'"+":"+"'"+paymentScheduleInfo.get(i).getMilestone_name()+"'"+""+",";
            
        
        result += "]";
        System.out.println("result is "+result);
        inputStream = new StringBufferInputStream(result);
        return "success";
    

打印如下:

result is ['item0' : 'milestoneName':'milestone 1','item1' : 'milestoneName':'milestone 2']

struts.xml:

<package name="ClientMilestone" namespace="/" extends="struts-default">
        <action name="getClientMilestone" class="packageName.PaymentScheduleAction" method="getClientMilestone">
            <result name="success" type="stream">
            <param name="contentType">text/html</param>
            <param name="inputName">inputStream</param>
            </result>
            <result name="failure">./LandingPage.jsp</result>
            <result name="error">./Error.jsp</result>
        </action>
    </package>

JSP 中的 JavaScript 函数:

function createOrViewPs() 
    
    var projectId = document.getElementById("projectId").value;
    $.ajax( 
        method: "GET",
        url: "getClientMilestone",
        data: "projectId" : projectId,
        traditional: true, 
        success:
            function(result)
                var jsonArr = result;
            
                for (var i=0; i<jsonArr.length; i++)
                    for (var name in jsonArr[i]) 
                        alert("Item name: "+name);
                        alert("Source: "+jsonArr[i][name].milestoneName);
                
            ,
        error: 
            function()
                alert("fail");
            
    );         
 

【问题讨论】:

使用 Struts json 插件。 【参考方案1】:

因为您从服务器返回了具有stream 结果类型的字符串化版本的 JSON(注意,该流结果类型可能不合适,见下文),您需要使用 JSON.parse() 将其解析为 JSON,如果你在使用 jQuery 最好使用$.each

var jsonArr = JSON.parse(result);
$.each (jsonArr, function(index, value)
  $.each (value, function(key, value)
    console.log("Item name: "+key);
    console.log("Source: "+value.milestoneName);
  );
);

您做错的是手动构建 json。您应该使用将 Java 对象序列化为 JSON 的工具。 Struts2 在包中有json-lib 可用的jar,可用于序列化为json,或者如果您使用的是struts2-json-plugin,则它具有内置的序列化器。如果您使用的是struts2-rest-plugin,那么您可以使用其他序列化程序,例如Jackson。您选择库来序列化数据的方式超出了此答案的范围。您可以在 SO 和 Struts site 上找到许多示例。他们中的大多数使用返回浏览器支持的 JSON 对象的 json 插件,即不需要解析,但是解析 JSON 有助于避免错误和数据丢失。

【讨论】:

我正在使用 struts2-json-plugin。正如您所说,我创建了 json 对象,然后将这些对象放入 json 数组中。然后我将这些数组发送到 jQuery,如上所述。但在控制台中“项目名称”是可以的。来源是“未定义”。 我没有在问题中看到它。另外我没有告诉你创建 json 对象然后将这些对象放入 json 数组中。我说你应该使用将Java对象序列化为JSON的工具。 问题已解决。谢谢你。顺便问一下,有没有办法通过json数组传递日期 可能是this 或this。如果你问一个完整的问题会更好。

以上是关于如何将 Struts 2 动作类中的 InputStream 值传递给 JSP 页面中的 Ajax 并将该值转换为 JSON 数组的主要内容,如果未能解决你的问题,请参考以下文章

如何将参数从JSP传递给Struts 2动作

直接访问Struts 2动作类属性

将 json 发布到 struts 2 动作

ActionMapper类在struts 2中的作用是什么

如何在 Struts 2 中将 JSON 绑定到 bean

将字符串列表映射到动作类中定义的arraylist - Struts2