【问题标题】:How to transfer java array to javaScript array using jsp?如何使用 jsp 将 java 数组传输到 javaScript 数组?
【发布时间】:2010-10-05 17:14:49
【问题描述】:

我的服务器上有一个字符串列表,我试图以数组的形式访问客户端。我尝试使用的代码如下:

在 jsp 中我有一个 List<String>

我正在尝试以下代码:

<%int j = 0; %>
for(var i = 0; i < <%=columns.size()%>; i++)
{
  colArray[i] = "<%=columns.get(j++)%>";
}

此代码只是为 colArray 中的每个元素返回列列表中的第一个元素。

我也试过了:

colArray = <%=columns.toArray()%>;

这也不起作用。 我觉得我在某个地方犯了一个小错误,只是没有看到它。我正在尝试做的事情是否可能以我正在尝试的方式进行?

谢谢。

【问题讨论】:

    标签: java javascript arrays jsp


    【解决方案1】:

    您将在服务器上执行的 JSP 代码与在客户端上执行的 JavaScript 代码混合在一起。 sn-p &lt;%=columns.get(j++)%&gt; 在服务器上执行一次,此时围绕它的 JavaScript 循环无关紧要。当它到达客户端时,循环的主体只是说colArray[i] = "first entry";,这当然会将相同的字符串放入数组的每个元素中。

    您需要做的是在服务器上执行一个循环,如下所示:

    <% for (int i=0; i<columns.size(); i++) { %>
    colArray[<%= i %>] = "<%= columns.get(i) %>"; 
    <% } %>
    

    我的 JSP 技能生疏,语法可能有所不同,但我希望你能明白。

    编辑: 正如 cmets 中所指出的,您需要非常小心地转义这些字符串中可能导致它们被解释为 JavaScript 代码(最显着的引号)的任何内容 - 特别是如果它们包含用户生成的内容。否则,您的应用就会受到Cross-site scriptingCross-site request forgery 的攻击。

    【讨论】:

    • 如果字符串包含双引号、反斜杠或换行符等字符,这将不起作用。这些字符需要转义。
    • 我还要在第二行的末尾添加一个分号。
    【解决方案2】:

    一旦 JavaScript 到达客户端,服务器代码就停止执行。服务器代码不会与客户端代码“并行”执行。

    您必须在 Java 中构建整个 JavaScript 初始化并将其完整且可执行地发送到客户端:

    <%
    StringBuffer values = new StringBuffer();
    for (int i = 0; i < columns.size(); ++i) {
        if (values.length() > 0) {
            values.append(',');
        }
        values.append('"').append(columns.get(i)).append('"');
    }
    %>
    <script type="text/javascript">
    var colArray = [ <%= values.toString() %> ];
    </script>
    

    这只是一种方法,您还可以通过在[] 中嵌入服务器代码来“即时”构建输出。我使用此示例尝试演示构建包含客户端 JavaScript 的字符串与将其输出到浏览器之间的分离。

    【讨论】:

      【解决方案3】:

      尝试使用 JSON(Javascript 对象表示法)对数组进行编码并在 javascript 上对其进行解码会非常简单

      在这里查看

      http://www.json.org/java/index.html

      【讨论】:

      • 这个链接现在好像不可用了。
      【解决方案4】:

      扩展语言:

      colArray = ${columns}
      

      【讨论】:

      • 对数字列表很有用,字符串不被""包围
      【解决方案5】:

      上面发布的解决方案在我的情况下不起作用,我需要一个额外的 Javascript 变量来进行转移:

      var codesJS=new Array();
      <% String[] codes=(String[])request.getAttribute("codes");
      if(codes!=null){
          for(int i=0; i<codes.length; i++){ %>
              var code='<%= codes[i] %>';           //--> without this doesnt work
              codesJS[<%= i %>]=code; 
          <%}
      }%>
      

      【讨论】:

      • “i”变量如何从js传递到java?
      【解决方案6】:

      对我来说,这个解决方案很有效。首先,您应该制作一个 JSONArray 并使用它的 toJSONString() 方法。此方法将列表转换为 JSON 文本。它的结果是一个 JSON 数组。

      <% 
      List<String> exampleList = new ArrayList<>();
      exampleList.add("Apple");
      exampleList.add("Orange");
      exampleList.add("Lemon");
      
      JSONArray fruitList = new JSONArray();
      fruitList.addAll(exampleList);
      %>
      

      在您的 JSP 页面中,您应该调用列表的 toJSONString() 方法,并将 JSON 文本传递给 JavaScript 数组。

      <script type="text/javascript"> var fruitArray = <%= fruitList.toJSONString() %>;</script>
      

      (可选地,您可以为列表创建一个简单的 getter 方法。如果您只在 JSP 页面中实例化具有列表字段的 JAVA 类。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-09-12
        • 2011-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多