如何使用 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 <%=columns.get(j++)%>
在服务器上执行一次,此时围绕它的 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 数组?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用java和jsp和extjs将java arraylist转换为json数组存储数据
提交 HTML 表单时如何将数据从 JSP 传输到 servlet