如何使用 jsp 将 java 数组传输到 javaScript 数组?

Posted

技术标签:

【中文标题】如何使用 jsp 将 java 数组传输到 javaScript 数组?【英文标题】:How to transfer java array to javaScript array using jsp? 【发布时间】: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()%>;

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

谢谢。

【问题讨论】:

【参考方案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 scripting 和Cross-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 类。)

【讨论】:

以上是关于如何使用 jsp 将 java 数组传输到 javaScript 数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 servlet 将文本响应流式传输到 jsp?

如何使用java和jsp和extjs将java arraylist转换为json数组存储数据

什么是java序列化,如何实现java序列化?

提交 HTML 表单时如何将数据从 JSP 传输到 servlet

如何以单选按钮格式显示问题和答案的数组列表?使用 JSP 和 servlet

如何使用 struts、JSP 和 Java 从控制器获取数组