2009-02-05 128 views
9

我有我的服务器上的字符串列表,我试图以数组的形式到达客户端。我试图使用的代码如下:如何使用jsp将java数组传递给javaScript数组?

在jsp中我有一个List<String>

我试图下面的代码:

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

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

我也曾尝试:

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

这也不起作用。 我觉得我在某个地方犯了一个小错误,而只是没有看到它。我试图以我尝试的方式做什么?

谢谢。

回答

13

您将在服务器上执行的JSP代码与在客户端上执行的JavaScript代码混合在一起。代码片段<%=columns.get(j++)%>在服务器上执行一次,其中的JavaScript循环在此处无关紧要。当它到达客户端时,循环体正好说colArray[i] = "first entry";这当然会将相同的字符串放入数组的每个元素中。

你需要做的,而不是什么是有一个循环在服务器上执行,就像这样:

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

我的JSP技术是生锈,和语法可能会有所不同,但我希望你的想法。

编辑:正如在评论中指出的,你必须要非常小心逃避那些字符串任何可能导致它们被解释为JavaScript代码(最突出引号) - 特别是如果它们包含用户生成的内容。否则,您会将您的应用全部打开为Cross-site scriptingCross-site request forgery攻击。

+0

这不会,如果工作这些字符串包含诸如双引号,反斜线或换行符等字符。这些角色将需要逃脱。 – 2009-02-05 16:42:11

+0

我还会在第二行的末尾添加一个分号。 – 2009-02-05 16:43:16

5

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

你必须建立整个的JavaScript初始化在Java和发送,完整的可执行文件,到客户端:

<% 
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

精通语言:

colArray = ${columns} 
2

上面提到的解决方案在我的情况下不起作用,我需要一个额外的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; 
    <%} 
}%> 
0

对我来说,这个解决方案已经工作。首先,你应该制作一个JSONArray,并将其用于JSONString()方法。此方法将列表转换为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方法的情况下,如果你只实例化的Java类 - 它具有列表字段 - INT JSP页面)