我用的dojo是1.9版本的,所以使用新的store。
创建一棵最简单的树需要如下几个环节:
1、创建一个store,并为其实现getChildren方法(获取指定节点的子节点,数据层面)。
2、使用创建的store创建一个Model,Model只能是ObjectStoreModel。创建Model的时候一定要指定一个query配置项,该配置项决定了树的根,根必须是唯一。
3、使用Model创建Tree。
4、调用Tree的startup方法, 这一步根据实际情况决定是否需要。
对应代码:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>测试用例</title>
<style type="text/css">
@import "dojo/dojo/resources/dojo.css";
@import "dojo/dijit/themes/tundra/tundra.css";
*{margin:0;padding:0;font-family:微软雅黑;font-size:10pt;}
.earth{border-right:4px solid #DFDFDF; border-bottom:4px solid #DFDFDF; height:100%;width:200px;}
</style>
<script type="text/javascript" djConfig=" isDebug: false" src="dojo/dojo/dojo.js"></script>
</head>
<script type="text/javascript">
require(["dijit/Tree","dojo/store/Memory","dijit/tree/ObjectStoreModel","dojo/dom","dojo/domReady!"],function(Tree,Memory,ObjectStoreModel,dom)
{
var treeData= [
{"id":"world","name":"地球","type":"planet","population":"6 billion"},
{"id":"AS","name":"亚洲","type":"continent","parent":"world"},
{"id":"OZ","name":"欧洲","type":"continent","parent":"world"},
{"id":"NA","name":"北美","type":"continent","parent":"world"},
{"id":"SA","name":"南美","type":"continent","parent":"world","checked":"true"},
{"id":"HG","name":"韩国","type":"country","parent":"AS"},
{"id":"JP","name":"日本","type":"country","parent":"AS"},
{"id":"CN","name":"中国","type":"country","parent":"AS"},
{"id":"YD","name":"印度","type":"country","parent":"AS"},
{"id":"JND","name":"俄罗斯","type":"country","parent":"AS"},
{"id":"HK","name":"香港","type":"city","parent":"CN"},
{"id":"BJ","name":"北京","type":"city","parent":"CN"},
{"id":"FR","name":"广州","type":"city","parent":"CN"},
{"id":"HN","name":"湖南","type":"city","parent":"CN"},
{"id":"CS","name":"长沙","type":"tour","parent":"HN"},
{"id":"YY","name":"岳阳","type":"tour","parent":"HN"}
];
var myStore = new Memory({ // 创建store
data : treeData,
getChildren: function(object){ // 实现getChildren方法
return this.query({parent: this.getIdentity(object)});
}
});
var treeModel = new ObjectStoreModel({ // 使用store创建model
store: myStore,
query: {id: 'world'}
});
var tree = new Tree({ // 创建树
id : "tree", // 树id,可以根据该id使用registry模块的byId方法获取组件对象。
model : treeModel,
showRoot : true, // 是否显示树根
openOnClick : true, // 单击展开
persist: true, // 持久化到cookie,记住上次打开树时候的状态
autoExpand : false, // 自动展开所有层次的节点
openOnDblClick : true // 双击展开
}, "countryData");
tree.startup();
});
</script>
<body class="tundra">
<div class="earth">
<div id="countryData" ></div>
</div>
</body>
</html>
本地文件目录显示:有点小bug,但是功能及泵实现了。最好利用Ajax,点击每一层目录的时候才去查询对应子目录,类似于城市级联。本程序没有使用。(dojo放在WebContent目录下)。
indexAction用于跳转index.jsp。
DirFile为领域模型层
package com.xuzengqiang.tree.domain;
public class DirFile
{
private String fileName; //文件名称,name:fileName
private String filepath; //文件路径, id:filePath
private String parentFileName; //父文件路径: parent:parentFileName
public String getFileName()
{
return fileName;
}
public void setFileName(String fileName)
{
this.fileName = fileName;
}
public String getParentFileName()
{
return parentFileName;
}
public void setParentFileName(String parentFileName)
{
this.parentFileName = parentFileName;
}
public String getFilepath()
{
return filepath;
}
public void setFilepath(String filepath)
{
this.filepath = filepath;
}
}
LoadAllFiles,用于读取某个文件下的所有文件。
package com.xuzengqiang.tree.utils;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import com.xuzengqiang.tree.domain.DirFile;
public class LoadAllFiles
{
//获取某个盘下面的所有目录
public static List<DirFile> getAllFiles(String dir)
{
List<DirFile> dirFile=new ArrayList<DirFile>();
File parentFile=new File(dir);
initFile(parentFile , dirFile );
return dirFile;
}
public static void initFile(File parentFile, List<DirFile> dirFile)
{
File[] subFiles=parentFile.listFiles();
if(subFiles!=null)
{
for (File subFile : subFiles)
{
DirFile file=new DirFile();
file.setFilepath(subFile.getAbsolutePath());
file.setFileName(subFile.getName());
file.setParentFileName(parentFile.getAbsolutePath());
dirFile.add(file);
if(subFile.isDirectory())
{
initFile(subFile,dirFile);
}
}
}
}
}
DirFileAction:用于Ajax
package com.xuzengqiang.tree.struts.action;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;
import com.xuzengqiang.tree.domain.DirFile;
import com.xuzengqiang.tree.utils.LoadAllFiles;
@SuppressWarnings("serial")
public class DirFileAction extends ActionSupport
{
private String pathName;
public String getPathName()
{
return pathName;
}
public void setPathName(String pathName)
{
this.pathName = pathName;
}
@Override
public String execute() throws Exception
{
HttpServletResponse response = ServletActionContext.getResponse();
response.setContentType("text/html;charset=UTF-8");
response.setHeader("Parma", "0");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expiress", 0);
PrintWriter out = response.getWriter();
List<DirFile> dirFile = LoadAllFiles.getAllFiles(pathName);
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < dirFile.size(); i++)
{
buffer.append("[");
buffer.append(dirFile.get(i).getFilepath());
buffer.append(",");
buffer.append(dirFile.get(i).getFileName());
buffer.append(",");
buffer.append(dirFile.get(i).getParentFileName());
buffer.append("]");
}
String dirFiles = buffer.toString();
out.print(dirFiles);
out.flush();
out.close();
return null;
}
}
index.jsp页面。主要是dojoAjax的实现,利用dojo.request,
参数:第一个、必需的参数是请求的URL。第二个参数是一个包含请求选项的对象(非必需)。常用的选项有下面几个:
method--代表HTTP方法的大写字符串。dojo提供了几个帮助函数来更方便的指定这个选项(request.get,request.post,request.put,request.del)。
sync--布尔值。true:同步请求方式,请求阻塞知道服务区返回响应或者超时;fasle:异步请求方式。
query--附加在URL后面的查询参数,可以是一个字符串或者键值对。
data--字符串或者键值对,或者FormData对象,它们包含要发送给服务器的数据。
handleAs--代表如何转化服务器响应中负载(或者叫响应数据)的字符串。经过转化的服务器响应数据才会传递给回调函数。可能的格式是“text"(默认值),"json","javascript"和”xml"。
headers--包含请求头的键值对。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head>
<title>测试用例</title>
<style type="text/css">
@import "dojo/dojo/resources/dojo.css";
@import "dojo/dijit/themes/tundra/tundra.css";
*{margin:0;padding:0;font-family:微软雅黑;font-size:10pt;}
.earth{border-right:4px solid #DFDFDF; border-bottom:4px solid #DFDFDF;width:900px;}
</style>
<script type="text/javascript" djConfig=" isDebug: false" src="dojo/dojo/dojo.js"></script>
</head>
<script type="text/javascript">
require([
"dijit/Tree",
"dojo/store/Memory",
"dijit/tree/ObjectStoreModel",
"dojo/request",
"dojo/domReady!"
],function(Tree,Memory,ObjectStoreModel,request)
{
var pathName="D:\\Maven"; //同样做为根路径
request.post("${pageContext.request.contextPath}/dirFileAction",
{
data:
{
pathName:pathName
},
handleAs:"text"
}).then(function(text)
{
var treeData= [
{"id":pathName,"name":pathName}
];
var myStore = new Memory(
{
data : treeData,
getChildren: function(object)
{
return this.query({parent: this.getIdentity(object)});
}
});
var dirFiles=text.split("]");
for(var i=0;i<dirFiles.length-1;i++)
{
var dirFile=dirFiles[i].split(",");
var filePath=dirFile[0].substr(1); //文件的绝对路径作为id
var fileName=dirFile[1]; //文件名作为显示
var parentFileName=dirFile[2]; //父文件名,同样为绝对路径
myStore.add({"id":filePath,"name":fileName,"parent":parentFileName});
}
var treeModel = new ObjectStoreModel(
{
store: myStore,
query: {id:pathName}
});
var tree = new Tree(
{
id : "tree",
model : treeModel,
showRoot : true,
openOnClick : true,
persist: true,
autoExpand : false,
openOnDblClick : true
}, "fileTree");
tree.startup();
});
});
</script>
<body class="tundra">
<div class="earth">
<div id="fileTree" ></div>
</div>
</body>
</html>
结果视图: