如何使用Struts2框架向Dojo树提供JSON数据

时间:2011-03-22 15:54:17

标签: json struts2 tree dojo

我目前正在使用Struts2框架开发Web应用程序。此应用程序需要根据从其他应用程序接收的数据动态更新屏幕上的对象。

目前,我想实现一个动态树视图,定期使用Action类提供的数据更新节点。我正在尝试使用dojo工具包中的dojo.dijit.tree对象。我知道我可以使用作为struts框架一部分的dojo标签来实现这一点,但是,它缺少我需要的大部分功能(持久性,动态打开和关闭分支等)因此,我选择使用而不是dojo工具包。

我对dojo.dijit.tree的问题是我不知道如何使用JSON结果类型提供其数据。我已经创建了一个类,它返回一个JSON结果类型,它具有dojo树组件所需的相同结构。我已经使用由类生成的文件“test.txt”测试了dojo树的生成,并且它按预期工作。但是,我想将JSON数据直接传递给dojo.dijit.tree组件,而不将文件保存在磁盘上。当我执行应用程序时,我得到一个“另存为”窗口来保存返回的JSON结果。

这是我的struts.xml文件:

<struts>
<constant name="struts.devMode" value="true" />

<package name="default" namespace="/" extends="struts-default">                     

    <action name="devResult" class="gui.JsonAction">                        
        <result name="success">/start1.jsp</result>                         
    </action>

</package>


<package name="example" namespace="/" extends="json-default">              

    <result-types>
        <result-type name="json" class="org.apache.struts2.json.JSONResult"></result-type>
    </result-types>  

    <action name="getJSONResult" class="gui.JsonAction">
        <result type="json"/>           
    </action>

</package>

这是显示树的jsp文件:

<head>
<title>Testing Tree</title>    

<style type="text/css">
  @import "js/dojo/dojo/resources/dojo.css";
  @import "js/dojo/dijit/themes/nihilo/nihilo.css";
</style>

<script src="http://ajax.googleapis.com/ajax/libs/dojo/1.6/dojo/dojo.xd.js"
        djConfig="isDebug: true,parseOnLoad: true">
</script>

<script type="text/javascript">
    dojo.require("dojo.data.ItemFileReadStore");
    dojo.require("dijit.Tree");
    dojo.require("dojo.parser");        
</script>

<body class="nihilo">
    The Tree:<br><br>

    <s:url id="devResult" action="jsonAction.action"></s:url>
    <div dojoType="dojo.data.ItemFileReadStore" href="%{devResult}" jsid="popStore" />
    <div dojoType="dijit.Tree" store="popStore" labelAttr="sname" label="Tree" />
</body>

这是产生JSON结果的Action类:

public class JsonAction extends ActionSupport {

private static final long serialVersionUID = 7392602552908646926L;
private String label = "name";
private String identifier = "name";
private List<ChildrenClass> items = new ArrayList<ChildrenClass>();

public JsonAction() {
    ChildrenClass item1 = new ChildrenClass("name1", "cat");
    ChildrenClass item2 = new ChildrenClass("name2", "cat");
    ChildrenClass item3 = new ChildrenClass("name3", "cat");
    ChildrenClass item4 = new ChildrenClass("name4", "cat");

    items.add(item1);
    items.add(item2);
    items.add(item3);
    items.add(item4);
}

public String execute() {       
    return SUCCESS;
}

public void setLabel(String label) {
    this.label = label;
}

public String getLabel() {
    return label;
}

public void setIdentifier(String identifier) {
    this.identifier = identifier;
}

public String getIdentifier() {
    return identifier;
}   

public void setItems(List<ChildrenClass> lists) {
    this.items = lists;
}

public List<ChildrenClass> getItems() {
    return items;
}

}

这是在上面的类中使用的ChildrenClass:

public class ChildrenClass {

private String name;
private String type;
private ChildrenClass[] children; 

public ChildrenClass() {
    name = "DefaultName";
    type = "DefaultType";
}

public ChildrenClass(String aName, String aType) {
    name = aName;
    type = aType;
}

public void setName(String name) {
    this.name = name;
}

public String getName() {
    return name;
}

public void setType(String type) {
    this.type = type;
}

public String getType() {
    return type;
}

public void setChildren(ChildrenClass[] children) {
    this.children = children;
}

public ChildrenClass[] getChildren() {
    return children;
}

}

我想请求stackoverflow读者请指示我如何读取jsp文件中的JSON数据以填充dojo树。另外,我想问一下如何定期刷新它的内容。

PS:如果有人有更好的方法来实现类似的东西,我很乐意收到你的意见。

提前致谢。

1 个答案:

答案 0 :(得分:0)

我找到了一种将数据直接从JSON结果传递到dojo.dijit.tree组件的方法。将“url”参数设置为返回json结果类型的操作名称。

这是我的.jsp文件的新主体:

Simple Tree:<br><br>
<div dojoType="dojo.data.ItemFileReadStore" url=getJSONResult handleAs="json" jsid="popStore" />
<div dojoType="dijit.Tree" store="popStore" labelAttr="sname" label="PID 512" />