web-dev-qa-db-ja.com

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()%>;

これも機能しません。どこかでちょっとしたミスをしていて、見ていません。私がしようとしていることは、私が試みている方法で可能ですか?

ありがとう。

9
kgrad

サーバーで実行されるJSPコードが、クライアントで実行されるJavaScriptコードと混同されています。スニペット<%=columns.get(j++)%>はサーバー上で1回実行され、その周りのJavaScriptループはこの時点では関係ありません。クライアントに到着すると、ループの本体はcolArray[i] = "first entry";とだけ表示されます。これはもちろん、配列のすべての要素に同じ文字列を挿入します。

代わりに行う必要があるのは、次のようにサーバーでループを実行することです。

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

私のJSPスキルは錆びていて、構文が異なる場合がありますが、理解していただければ幸いです。

編集:コメントで指摘されているように、JavaScriptコードとして解釈される可能性のある文字列内のすべてをエスケープすることに非常に注意する必要があります(最も目立つ引用符)-特にユーザー生成コンテンツが含まれている場合。それ以外の場合は、アプリを クロスサイトスクリプティング および クロスサイトリクエストフォージェリ 攻撃に対して広く開いたままにします。

14

JSON(Javascriptオブジェクト表記)を使用してみてください。配列をエンコードしてjavascriptでデコードするのは非常に簡単です。

こちらでチェックしてください

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

6
perrohunter

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>

これは1つの方法にすぎません。サーバーコードを[]に埋め込むことで、「オンザフライ」で出力を作成することもできます。この例を使用して、クライアント側のJavaScriptを構成する文字列を作成することと、それをブラウザーに出力することの分離を示しました。

5
Grant Wagner

Exp言語:

colArray = ${columns}
3
fmanna

私にとって、このソリューションは機能しました。まず、JSONArrayを作成し、それをtoJSONString()メソッドで使用する必要があります。このメソッドは、リストを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>

(オプションで、リストの単純なゲッターメソッドを作成できます。Javaクラス-リストフィールドがあります-JSPページにインスタンス化するだけの場合。)

3
F3R1

上記の解決策は私の場合は機能しませんでした。転送を行うために追加の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; 
    <%}
}%>
2
José Almeida