5

JSONデータを作成するこのサーブレットを取得しました。このデータを、InfoVisツールキットを介してデータを表示することになっているjspページに渡したいです。

サーブレット.java

JSONObject json = new JSONObject();
    JSONArray toplevel = new JSONArray();
    JSONObject sublevel;

    try{

        json.put("id", "node" + 0);
        json.put("name", "name" + 0);

        int count = 5;
        for(int i=1; i < count; i++){
            sublevel = new JSONObject();
            sublevel.put("id", "node" + i);
            sublevel.put("name", "name" + i);
            toplevel.put(sublevel);
        }
        json.put("children", toplevel);
    } catch (JSONException jse) {

    }

    request.setAttribute("jsonString", json.toString());
    RequestDispatcher dispatcher = request.getRequestDispatcher("graph.jsp");
    dispatcher.forward(request, response);

次のコードは InfoVis Toolkit によって提供されていますが、変更できるかどうかはわかりません。または、少なくとも私はそれを変更するのに十分な JS の経験がありません。

グラフ.jsp

<body onload="init('${jsonString}');">

spacetree.js

function init(jsonString){

    var json = jsonString;

本来は関数呼び出しのみ

<body onload="init()">

しかし、init() 関数にはハードコードされた JSON 変数があり、もちろんまったく役に立ちません。だから私はそれを動的にする方法を探しています。しかし、文字列内に引用符があるため、onload=init() 関数呼び出しが完全に台無しになります..

4

2 に答える 2

7

安価で簡単な方法は、JSP を変更して、次のように出力することです。

<script>
var theData = ${jsonString};
</script>
<body onload="init(theData);">

それの欠点は、グローバル変数を作成することですがinit、その方法で呼び出している場合initは、すでにグローバルであるため、その船は航行しています。:-)

于 2013-01-29T19:26:04.070 に答える
3

JSON を文字列としてドロップする必要はありません。有効な JavaScript 構文です。

<body onload='init(${jsonString})'>

それが JSP によってレンダリングされると、最終結果 (ブラウザーに送信される HTML) は次のようになります。

<body onload='init({"something": "some value", "whatever": "your data looks like"})'>

JSON を HTML 属性値としてドロップするため、JSON を HTML エンコードするだけで済みます。

<body onload='init(${fn:escapeXml(jsonString)})'>

次に、「init」関数はすぐに使用できる JavaScript オブジェクトを期待でき、JSON パーサーを呼び出す必要はまったくありません。

于 2013-01-29T19:25:39.153 に答える