5

我得到了这个创建 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 经验来改变它。

图.jsp

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

空间树.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 编码,因为您将其作为 HTML 属性值删除:

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

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

于 2013-01-29T19:25:39.153 回答