2009-02-05 68 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頁面)