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

Posted

技术标签:

【中文标题】如何使用 Struts2 框架向 Dojo 树提供 JSON 数据【英文标题】:How to provide JSON data to Dojo tree using Struts2 framework 【发布时间】:2011-03-22 15:54:17 【问题描述】:

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

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

我对 dojo.dijit.tree 的问题是我不知道如何使用 JSON 结果类型提供它的数据。我已经创建了一个类,它返回一个 JSON 结果类型,其结构与 dojo 树组件所需的结构相同。我已经使用类生成的文件“test.txt”测试了道场树的生成,它按预期工作。但是,我想将 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;

我想请 *** 阅读器告诉我如何读取 jsp 文件中的 JSON 数据以填充 dojo 树。另外,想问一下如何定期刷新它的内容。

PS:如果有人有更好的方法来实现类似的东西,我会很高兴收到你的 cmets。

提前致谢。

【问题讨论】:

如果您已验证 Struts2 (S2) 操作正在生成格式正确的 JSON 结果,则省略所有 S2 详细信息并简单地说某某 URL 提供了所需的 JSON,使用您的显示一个工作示例文本文件,但想要替换 URL 中的数据,我相信 DOJO 专家会发现它更清楚。 BTW +1 直接使用工具包。 感谢您的回答四元数。这是生成的 JSON 结果数据: "identifier":"name","label":"name","items":[ "children": null,"name":"name1","type":" cat","children":null,"name":"name2","type":"cat","children":null,"name":"name3","type":"cat" ,"children":null,"name":"name4","type":"cat"] 如果我将其保存为文件“test.txt”,然后以下列方式声明 ItemFileReadStore 它的工作原理:。问题是我不知道如何读取 JSON 结果而不先将其保存为文件。 【参考方案1】:

我找到了一种将数据直接从 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" />                        

【讨论】:

以上是关于如何使用 Struts2 框架向 Dojo 树提供 JSON 数据的主要内容,如果未能解决你的问题,请参考以下文章

struts2 和 dojo 网格

使用 Struts 2 + Dojo 框架进行表单验证

如何使用 dojo 和 struts2 在对话框中显示异步获取的信息?

(二十三)Struts2 Ajax标签

Struts2 插件 - Dojo 或 jQuery 还是...?

Struts 2常用的Ajax标签