一尘不染

如何将Struts2动作类中的InputStream值传递给jsp页面中的ajax并将其转换为Json Array

ajax

我想将Struts2动作类的json数组传递给jsp页面。我正在尝试将数据集作为字符串发送。我想知道的是,如何读取javascript中的数据。

这是我在动作课中的方法

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");
            }
    });         
}

阅读 229

收藏
2020-07-26

共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网站上找到许多示例。它们中的大多数使用JSON插件返回浏览器支持的JSON对象,即不需要解析,但是对JSON进行解析对于避免错误和数据丢失很有用。

2020-07-26