1、后台action代码
public String depTree(){
if("getChildren".equals(action)) {
try {
Object obj = JSONUtil.deserialize(data);
Map map= (Map) ((Map)obj).get("node");
id= Integer.parseInt(map.get("widgetId").toString());
list=new ArrayList();
list=(ArrayList) depService.getChildren(id);
} catch (JSONException e) {
e.printStackTrace();
}
return "ajax";
}
else{
dep=depService.getRoot();
return SUCCESS;
}
}
2、struts.xml
<action name="depTree" class="depAction" method="depTree">
<result name="ajax" type="freemarker">DepTree.ftl</result>
</action>
3、DepTree.ftl
[
<#list list as r>
{ "title": "${r.depName}", "isFolder": <#if r.children?size gt 0>true<#else>false</#if>, "id": "${r.id}"}<#if r_has_next>,</#if>
</#list>
]
4、页面,访问该页面会跳转action加载节点
<script language="JavaScript">
function treeNodeSelected(arg) {
window.open('nodeInfo.action?nodeID='+arg.source.widgetId+'','center');
}
dojo.addOnLoad(function() {
var t = dojo.widget.byId('DepTree');
var s = t.selector;
dojo.event.connect(s, 'select', 'treeNodeSelected');
});
</script>
<script type="text/javascript">
dojo.require("dojo.lang.*");
dojo.require("dojo.widget.*");
dojo.require("dojo.widget.Tree");
dojo.require("dojo.widget.TreeRPCController");
// dojo.require("dojo.widget.TreeContextMenu");
</script>
<div dojoType="TreeRPCController" widgetId="treeController" DNDcontroller="create" RPCUrl="department/depTree.action"></div>
<%--右键菜单 --%>
<%--
<div dojoType="TreeContextMenu" toggle="explode" contextMenuForWindow="false" widgetId="treeContextMenu">
<div dojoType="TreeMenuItem" treeActions="addChild" caption="新建" widgetId="treeContextMenuCreate"></div>
<div dojoType="TreeMenuItem" treeActions="edit" caption="编辑" widgetId="treeContextMenuEdit"></div>
<div dojoType="TreeMenuItem" treeActions="remove" caption="删除" widgetId="treeContextMenuRemove"></div>
</div>
--%>
<div dojoType="Tree" widgetId="DepTree" toggle="fade" controller="treeController" >
<div dojoType="TreeNode" title='<s:property value="dep.depName" />'
widgetId='<s:property value="dep.id" />'
isFolder='<s:property value="dep.children.size> 0" />'
expandLevel="1">
</div>
Dojo 通过名为“TreeRPCController”的控件实现 AJAX 树,它会监听被控制树的事件。当发生展开节点的事件时,TreeRPCController就会向URL发送XHR请求,该URL由TreeRPCController的RPCUrl 属性定义。XHR请求格式类似如下格式:
http://localhost:8080/HRM/department/depTree.action?action=getChildren&data={"node":{...},"tree":{...}}&dojo.preventCache=1182913465392
其中action为“getChildren”(固定值),data一个包含当前节点与树信息的JSON串和dojo.preventCache随机串
5、参考
http://shirlly.iteye.com/blog/231467
http://www.ajaxtree.com/
http://www.blogjava.net/max/archive/2007/06/27/126648.html
右键菜单 http://www.iteye.com/topic/141972