2009-02-05 7 views
9

Ho un elenco di stringhe sul mio server che sto cercando di ottenere sul client sotto forma di array. Il codice Sto tentando di utilizzare è il seguente:Come trasferire l'array java all'array javaScript usando jsp?

All'interno del jsp ho una colonna di List<String>

Sto tentando il seguente codice:

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

Questo codice restituisce semplicemente il primo elemento della elenco di colonne per ogni elemento nel colArray.

Ho anche provato:

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

che non funziona neanche. Mi sento come se stessi facendo un piccolo errore da qualche parte e sto solo non vedendolo. È ciò che sto cercando di fare nel modo in cui sto tentando?

Grazie.

risposta

13

Stai ottenendo il codice JSP che viene eseguito sul server mescolato con il codice JavaScript che viene eseguito sul client. Lo snippet <%=columns.get(j++)%> viene eseguito una volta, sul server, e il ciclo di JavaScript attorno ad esso è irrilevante a questo punto. Quando arriva il client, il corpo del loop dice semplicemente colArray[i] = "first entry"; che ovviamente inserisce la stessa stringa in ogni elemento dell'array.

Quello che dovete fare, invece è quello di avere un ciclo di esecuzione sul server, in questo modo:

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

abilità Il mio JSP sono arrugginite, e la sintassi possono essere diversi, ma spero che si ottiene l'idea .

Edit: Come ricordato nei commenti, è necessario essere molto attenti a sfuggire nulla in quelle corde che potrebbe causare loro di essere interpretati come codice JavaScript (marchi più visibile citazione) - soprattutto se contengono utente -generazione di contenuti. In caso contrario, la tua app sarà aperta agli attacchi Cross-site scripting e Cross-site request forgery.

+0

Questo non funziona se le stringhe contengono caratteri come virgolette, backslash o newline. Questi personaggi dovranno essere sfuggiti. –

+0

Aggiungerei anche un punto e virgola alla fine della seconda riga. –

5

Una volta che il codice JavaScript raggiunge il client, il codice del server ha smesso di essere eseguito. Il codice server non viene eseguito "in parallelo" con il codice client.

si deve costruire l'intera inizializzazione del JavaScript in Java e inviarlo, completo ed eseguibile, al client:

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

Questo è solo un modo per farlo, si può anche costruire l'uscita "a al volo "incorporando il codice del server all'interno di [ e ]. Ho usato questo esempio per provare a dimostrare la separazione tra la costruzione della stringa che comprende il codice JavaScript del client e l'output del browser.

3

Exp Lingua:

colArray = ${columns} 
2

Le soluzioni postate sopra non funzionavano nel mio caso, avevo bisogno di una variabile Javascript aggiuntiva per effettuare il trasferimento:

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

Come passa la variabile "i" da js a java? – serj

0

Per me questa soluzione ha funzionato. Prima di tutto Dovresti creare un JSONArray e usarlo come metodo toJSONString(). Questo metodo converte l'elenco in testo JSON. Il risultato è un array JSON.

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

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

Nella pagina JSP è necessario richiamare il metodo toJSONString() della lista, e passare il testo JSON ad un array JavaScript.

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

(Opzionalmente si potrebbe fare un metodo getter semplice per la lista Nel caso in cui si crea un'istanza solo la classe JAVA -. Che ha il campo della lista -. Int pagina JSP)

Problemi correlati