2009-02-05 5 views
9

J'ai une liste de chaînes sur mon serveur que j'essaye d'obtenir au client sous la forme d'un tableau. Le code Je cherche à utiliser est la suivante:Comment transférer un tableau Java en tableau javaScript en utilisant jsp?

Dans le jsp j'ai une colonne List<String>

Je tentais le code suivant:

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

Ce code renvoie simplement le premier élément de la liste des colonnes pour chaque élément du colArray.

J'ai aussi essayé:

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

qui ne fonctionne pas non plus. J'ai l'impression de faire une petite erreur quelque part et je ne la vois pas. Ce que j'essaie de faire est-il possible dans la façon dont j'essaye?

Merci.

Répondre

13

Vous obtenez le code JSP qui est exécuté sur le serveur mélangé avec le code JavaScript exécuté sur le client. L'extrait <%=columns.get(j++)%> est exécuté une fois, sur le serveur, et la boucle JavaScript qui l'entoure n'est pas pertinente à ce stade. Quand il arrive le client, le corps de la boucle dit simplement colArray[i] = "first entry"; qui met bien sûr la même chaîne dans chaque élément du tableau.

Ce que vous devez faire à la place est d'avoir une boucle d'exécuter sur le serveur, comme ceci:

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

Mes compétences JSP sont rouillés, et la syntaxe peuvent être différentes, mais j'espère que vous avez l'idée .

Edit: Comme il a été souligné dans les commentaires, vous devez faire très attention à échapper à quoi que ce soit dans les chaînes qui pourraient les amener à être interprétées comme code JavaScript (marques le plus en évidence citation) - surtout si elles contiennent l'utilisateur contenu généré Sinon, vous laissez votre application ouverte aux attaques Cross-site scripting et Cross-site request forgery.

+0

Cela ne fonctionnera pas si les chaînes contiennent des caractères tels que des guillemets doubles, des antislashs ou des retours à la ligne. De tels personnages devront être échappés. –

+0

J'ajouterais aussi un point-virgule à la fin de la deuxième ligne. –

5

Une fois que le JavaScript atteint le client, le code du serveur a cessé d'être exécuté. Le code du serveur ne s'exécute pas "en parallèle" avec le code client.

Vous devez construire l'ensemble de l'initialisation JavaScript en Java et l'envoyer, complet et exécutable, au 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> 

qui est juste une façon de le faire, vous pouvez également créer la sortie « sur la mouche "en intégrant le code du serveur à l'intérieur du [ et ]. J'ai utilisé cet exemple pour essayer de démontrer la séparation entre la construction de la chaîne qui comprend le JavaScript côté client et sa sortie au navigateur.

3

Exp Langue:

colArray = ${columns} 
2

Les solutions postées ci-dessus ne fonctionnaient pas dans mon cas, j'avais besoin d'une variable Javascript supplémentaire pour faire le transfert:

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

Comment la variable "i" passe-t-elle de js à java? – serj

0

Pour moi cette solution a fonctionné. Tout d'abord, vous devez créer un JSONArray et utiliser sa méthode toJSONString(). Cette méthode convertit la liste en texte JSON. Le résultat est un tableau JSON.

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

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

Dans votre page JSP, vous devez appeler la méthode toJSONString() de la liste, et de transmettre le texte JSON à un tableau JavaScript.

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

(en option Vous pouvez faire une méthode de lecture simple pour la liste Dans le cas si vous n'instancier la classe JAVA -. Qui a le champ de liste -. Int la page JSP)