2009-02-05 40 views
9

Tôi có một danh sách các chuỗi trên máy chủ của mình mà tôi đang cố gắng truy cập ứng dụng khách dưới dạng một mảng. Mã Tôi đang cố gắng sử dụng như sau:Làm thế nào để chuyển mảng java sang mảng javaScript bằng cách sử dụng jsp?

Trong jsp Tôi có một cột List<String>

Tôi đang cố gắng đoạn mã sau:

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

Mã này chỉ đơn giản là trả về phần tử đầu tiên trong danh sách cột cho mọi phần tử trong colArray.

Tôi cũng đã cố gắng:

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

mà không làm việc một trong hai. Tôi cảm thấy như tôi đang phạm một sai lầm nhỏ ở đâu đó và tôi không thấy nó. Là những gì tôi đang cố gắng làm theo cách mà tôi đang cố gắng?

Cảm ơn.

Trả lời

13

Bạn đang nhận mã JSP được thực thi trên máy chủ được trộn lẫn với mã JavaScript được thực thi trên máy khách. Đoạn mã <%=columns.get(j++)%> được thực hiện một lần, trên máy chủ và vòng lặp JavaScript xung quanh nó không liên quan tại thời điểm này. Khi nó đến khách hàng, cơ thể của vòng lặp chỉ nói colArray[i] = "first entry"; mà tất nhiên đặt cùng một chuỗi vào mọi phần tử của mảng.

Những gì bạn cần làm là thay vì để có một vòng lặp thực thi trên máy chủ, như thế này:

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

kỹ năng của tôi JSP là gỉ, và cú pháp có thể khác nhau, nhưng tôi hy vọng bạn sẽ có được ý tưởng .

Chỉnh sửa: Như đã được chỉ ra trong các nhận xét, bạn cần phải hết sức cẩn thận về việc thoát bất kỳ thứ gì trong các chuỗi đó có thể khiến chúng được hiểu là mã JavaScript (dấu ngoặc kép nổi bật nhất) - đặc biệt nếu chúng chứa người dùng nội dung tổng hợp. Nếu không, bạn sẽ để ứng dụng của mình mở rộng cho các cuộc tấn công Cross-site scriptingCross-site request forgery.

+0

này sẽ không hoạt động nếu các chuỗi chứa các ký tự như dấu ngoặc kép, dấu gạch chéo ngược hoặc dòng mới. Các ký tự như vậy sẽ cần phải được thoát. –

+0

Tôi cũng sẽ thêm dấu chấm phẩy vào cuối dòng thứ hai. –

5

Khi JavaScript tiếp cận khách hàng, mã máy chủ đã ngừng thực thi. Mã máy chủ không thực thi "song song" với mã máy khách.

Bạn phải xây dựng toàn bộ khởi JavaScript trong Java và gửi nó, đầy đủ và thực thi, cho khách hàng:

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

Đó chỉ là một cách để làm điều đó, bạn cũng có thể xây dựng đầu ra "trên bay "bằng cách nhúng mã máy chủ bên trong []. Tôi đã sử dụng ví dụ này để cố gắng thể hiện sự tách biệt giữa việc xây dựng chuỗi bao gồm JavaScript phía máy khách và xuất ra trình duyệt đó.

6

Hãy thử sử dụng JSON (ký hiệu đối tượng Javascript) nó muốn được khá đơn giản để mã hóa các mảng và giải mã nó trên javascript

check it out đây

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

3

Exp Ngôn Ngữ:

colArray = ${columns} 
2

Các giải pháp được đăng ở trên không có tác dụng trong trường hợp của tôi, tôi cần thêm biến Javascript để thực hiện chuyển đổi:

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

Biến "i" chuyển từ js sang java như thế nào? – serj

0

Đối với tôi giải pháp này đã hiệu quả. Trước hết, bạn nên tạo một JSONArray và sử dụng phương thức toJSONString() của nó. Phương thức này chuyển đổi danh sách thành văn bản JSON. Kết quả của nó là một mảng JSON.

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

JSONArray fruitList = new JSONArray(); 
fruitList.addAll(exampleList); 
%> 

Trong trang JSP, bạn nên gọi phương thức toJSONString() của danh sách và chuyển văn bản JSON vào một mảng JavaScript.

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

(Tùy chọn Bạn có thể làm cho một phương thức getter đơn giản cho danh sách Trong trường hợp nếu bạn chỉ nhanh chóng lớp JAVA -. Trong đó có các trường danh sách -. Int trang JSP)

Các vấn đề liên quan