项目中要用到树控件,在网上找了好多,但是和后台数据交互,就有点为难了。
现在是在jsp页面上使用Ajax请求一个action,然后该action返回一个类型为Json的对象,由JStree将数据加载为树控件。
jsp页面代码:
<div id="demo1" class="demo"></div>
<script type="text/javascript" class="source">
 $(function () {  
     $("#demo1").jstree({   
         "json_data" : {   
             "ajax" : {  
                 "url" : "../example/loadAction.action?parentId = -1",  
                 "data" : function (n) {   
                     return { id : n.attr ? n.attr("id") : 0 };   
                 }  
             }  
         },
         "plugins" : [ "themes", "json_data", "checkbox" ]  
     });
 });
</script>
XML配置文件:
    <package name="treeData" extends="json-default">
<action name="loadAction" method="load" class="example.ModelAction" >
         <result type="json">
         <param name="root">
         res
         </param>
         </result>
        </action>
    </package>
后台JAVA代码:
public String load()
{
res = "[";
res += this.getJson(parentId);
res += "]";
System.out.println(res);
return SUCCESS;
} public String getJson(String parentId)
{
// 把顶层的查出来
List<Model> list = this.modelService.findModels(parentId);
for (int i = 0; i < list.size(); i++)
{
Model model = list.get(i);
// 有子节点
if (model.getHasChild().equals("0"))
{
tempRes += "{\"attr\":{\"id\":\"" + model.getModelId()
+ "\"},\"state\":\"open\",\"data\":\"" + model.getModelId()
+ "\" ,";
tempRes += "\"children\":[";
// 遍历它的子节点
List<Model> sonList = this.modelService.findModels(model
.getModelId());
// 遍历它的子节点
for (int j = 0; j < sonList.size(); j++)
{
Model mo = sonList.get(j);
// 还有子节点(递归调用)
if (mo.getHasChild().equals("0"))
{
//this.getJson(mo.getModelId());
}
else
{
tempRes += "{\"attr\":{\"id\":\"" + mo.getModelId()
+ "\"},\"state\":\"open\",\"data\":\"" + mo.getModelId()
+ "\" " + "}";
if (j < sonList.size() - 1)
{
tempRes += ",";
}
}
}
tempRes += "]";
tempRes += "}";
if (i < list.size() - 1)
{
tempRes += ",";
}
}
}
return tempRes;
}
现在是可以请求到action,也可以将请求到数据并打印到控制台上,数据格式是:[{"attr":{"id":"1"},"state":"open","data":"1" ,"children":[{"attr":{"id":"1187"},"state":"open","data":"1187" }]},但不知道为什么就是加载不到页面上,不过我将该字符串粘贴到一个test.json文件中,然后再url参数中引用该文件,却可以加载到页面上。load方法中的res变量是经过序列化的,在该变量的get方法上加了一个@JSON的注解。在项目中应用过这个树控件的高手请帮我看看这个问题,不胜感激。我研究这个控件已经多天没有进展了。

解决方案 »

  1.   

    方法有2:
    1、用request.getWriter().print("输出json");
    public String load()
    {
        res = "[";
        res += this.getJson(parentId);
        res += "]";
        System.out.println(res);    HttpServletResponse response = ServletActionContext.getResponse();
        response.setCharacterEncoding("UTF-8");
        PrintWriter out = response.getWriter();
        out.print(res);
        out.flush();
        out.close();
        return null;//不需要跳转,用流输出字符串即可;此方法屡试不爽
    }2、定义一个属性,让struts为我们传递数据
    private String data;//提供setter、getter方法;必须
    public String load()
    {
        res = "[";
        res += this.getJson(parentId);
        res += "]";
        System.out.println(res);
        this.setData(res);//设置值
        return SUCCESS;//在返回的result页面,显示data值;返回页面就2句话,其他html代码统统不要。切记!!
    }   
    success jsp:
    <%@ page language="java" pageEncoding="UTF-8"%>
    ${data }