2009-02-05 3 views
9

Tengo una lista de cadenas en mi servidor que estoy tratando de llegar al cliente en forma de una matriz. El código que estoy intentando utilizar es la siguiente:Cómo transferir una matriz Java a una matriz javaScript utilizando jsp?

Dentro de la JSP Tengo una columna List<String>

Estoy intentando el siguiente código:

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

Este código simplemente devuelve el primer elemento de la lista de columnas para cada elemento en el colArray.

también he intentado:

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

que no funciona bien. Siento que estoy cometiendo un pequeño error en alguna parte y no lo estoy viendo. ¿Es lo que estoy tratando de hacer posible en la forma en que estoy intentando?

Gracias.

Respuesta

13

Obtiene el código JSP que se ejecuta en el servidor mezclado con el código JavaScript que se ejecuta en el cliente. El fragmento <%=columns.get(j++)%> se ejecuta una vez, en el servidor, y el bucle de JavaScript a su alrededor es irrelevante en este momento. Cuando llega el cliente, el cuerpo del bucle solo dice colArray[i] = "first entry"; que, por supuesto, pone la misma cadena en cada elemento de la matriz.

Lo que hay que hacer en su lugar es tener un bucle ejecuta en el servidor, así:

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

habilidades Mi JSP están oxidadas, y la sintaxis pueden ser diferentes, pero espero que la idea .

Editar: Como se señaló en los comentarios, que tienen que ser muy cuidadosos acerca de escapar nada en esas cadenas que podrían causar que se pueden interpretar como código JavaScript (marcas más prominente cita) - especialmente si contienen usuario contenido generado De lo contrario, estás dejando tu aplicación abierta a los ataques Cross-site scripting y Cross-site request forgery.

+0

Esto no funcionará si las cadenas contienen caracteres tales como comillas dobles, barras invertidas o nueva línea. Tales personajes necesitarán ser escapados. –

+0

También agregaría un punto y coma al final de la segunda línea. –

5

Una vez que JavaScript llega al cliente, el código del servidor ha dejado de ejecutarse. El código del servidor no se ejecuta "en paralelo" con el código del cliente.

usted tiene que construir toda la inicialización JavaScript en Java y enviarlo, completa y ejecutable, para el cliente:

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

Eso es sólo una manera de hacerlo, también se puede construir la salida "en la la mosca "al incrustar el código del servidor dentro de [ y ]. Usé este ejemplo para tratar de demostrar la separación entre construir la cadena que comprende el JavaScript del lado del cliente y enviarlo al navegador.

3

Exp Idioma:

colArray = ${columns} 
2

Las soluciones publicadas anteriormente no funcionaron en mi caso, necesitaba una variable Javascript adicional para hacer la transferencia:

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

¿Cómo pasa la variable "i" de js a java? – serj

0

Para mí, esta solución ha funcionado. En primer lugar, debe crear un JSONArray y utilizarlo en el método J.SONString(). Este método convierte la lista en texto JSON. El resultado es una matriz JSON.

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

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

En su página JSP debe invocar el método toJSONString() de la lista, y aprobar el texto JSON a una matriz de JavaScript.

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

(Opcionalmente se puede hacer un método de obtención sencilla de la lista En caso de que sólo una instancia de la clase Java -. Que tiene el campo de lista -. Int la página JSP)

Cuestiones relacionadas