【问题标题】:How to copy multidimensional array from Java request variable to Javascript variable in a JSP page?如何将多维数组从 Java 请求变量复制到 JSP 页面中的 Javascript 变量?
【发布时间】:2013-09-26 19:03:33
【问题描述】:

我需要获取多维数组的内容,作为保存在请求变量中的 String [][] 传入,并将其内容放入 Javascript 变量中。

“String [][] dataArray”变量包含我期望的值。示例:

dataArray[0][0] = "乔"

dataArray[0][1] = "史密斯"

dataArray[0][2] = "901-555-1212"

dataArray[1][0] = "简"

dataArray[1][1] = "史密斯"

dataArray[1][2] = "901-555-9999"

这不起作用:

Java

request.setAttribute("passedInArray", dataArray);

Javascript(在 JSP 页面内)

var jsArray =

如何将passedInArray 的内容放入jsArray?提前致谢!

【问题讨论】:

  • 我会使用 JSON 库将其转换为字符串并将其分配给 jsArray,就像 var jsArray = [["Joe", "Smith", "901-555-1212"], ["Jane", "Smith", "901-555-9999"]] 一样,因为 JavaScript 可以本机读取它。 json.org 有一个可用库的列表。
  • 我不熟悉 JSON。取件需要很长时间吗?
  • 完全不需要,尤其是当您使用库时,您甚至不需要了解 JSON 本身。基本上,它是一种序列化具有嵌套哈希图/数组结构的数据的方法。因此,您在 Java 端对其进行序列化,而 JavaScript 对其进行反序列化。 JSON 代表 J ava S cript O bject N otation Javascript 可以原生读取序列化的字符串。

标签: javascript arrays jsp multidimensional-array


【解决方案1】:

如果您需要使用String[][],则需要在服务器端迭代passedInArray 中的行。

var dataArray = new Array();

<c:forEach var="row" items="${passedInArray}">
    dataArray.push(['${row[0]}', '${row[1]}', '${row[2]}']);
</c:forEach>

另一种方法是将您的数组序列化为 JSON 字符串。有像 JacksonGson 这样的优秀 Java 库可用于这项工作。基本上,它们将完成与您这样编写代码相同的操作:

    StringBuffer sb = new StringBuffer("[");
    for (int i = 0; i < dataArray.length; i++) {
        sb.append("[");
        for (int j = 0; j < dataArray[i].length; j++) {
            sb.append("'" + dataArray[i][j] + "'");
            if (j < dataArray[i].length-1)
                sb.append(',');
        }
        sb.append("]");
        if (i < dataArray.length-1)
            sb.append(',');
    }       
    sb.append("]");
    request.setAttribute("passedInArray", sb.toString());

然后在您的 jsp 中,您只需将其声明为 javascript 变量并使用它:

    var dataArray = ${passedInArray};
    console.log(dataArray.length);
    console.log(dataArray[0].length);

无论你怎么做,你都需要在服务器端做一些工作,将你的 java 数组转换成 javascript 可以直接使用的 String(s)。

【讨论】:

  • javax.el.PropertyNotFoundException:在 java.lang.String 类型上找不到属性“0”
  • 您确定您使用的passedInArrayString[][] 而不是String[]
  • 是的。但由于某种原因,这实际上不再发生了。但是,dataArray 现在只返回两个“行”。我输入了一些调试代码,如下所示: console.log("passedInArray rowSize = " +passedInArray.length); console.log("passedInArray colSize = " +passedInArray[0].length); rowSize 显示 1767,这是我所期待的。 colSize 显示为 2,这是不对的。
  • 我应该嵌套 标签吗?如果是这样,我该怎么做?我知道我真的很接近把这件事做对了……谢谢! :)
  • 我的错误 - 在我的示例中,我一直将行限制为 2 个元素。我将其编辑为使用 3 列,并添加了 JSON 序列化的示例。
猜你喜欢
  • 2015-05-02
  • 2011-07-19
  • 1970-01-01
  • 1970-01-01
  • 2012-05-16
  • 1970-01-01
  • 1970-01-01
  • 2011-08-08
  • 1970-01-01
相关资源
最近更新 更多