将json数据从servlet传递到jsp到js文件

时间:2013-01-29 19:22:07

标签: javascript json jsp servlets

我得到了这个创建JSON数据的servlet,我希望将这些数据传递给jsp页面,该页面应该通过InfoVis工具包显示数据。

servlet.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经验来改变它。

graph.jsp

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

spacetree.js

function init(jsonString){

    var json = jsonString;

最初函数调用只是

<body onload="init()">

但是init()函数的JSON变量是硬编码的,当然这根本没用。所以我正在寻找一种方法来实现这种动态。但是由于字符串中的引用它现在完全混淆了onload = init()函数调用..

2 个答案:

答案 0 :(得分:6)

便宜而简单的方法是修改JSP,以便输出:

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

它的缺点是它创建了一个全局变量,但如果你以这种方式调用initinit已经是全局变量,那么这艘船已经航行了。 : - )

答案 1 :(得分:2)

您不必将JSON作为字符串删除 - 它是有效的JavaScript语法:

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

当由JSP呈现时,最终结果 - 发送到浏览器的HTML - 将类似于:

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

现在你唯一想做的就是对JSON进行HTML编码,因为你把它作为HTML属性值删除了:

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

然后你的“init”函数可以期待一个可以使用的JavaScript对象,而根本不需要调用JSON解析器。