- var Tree = Ext.tree;
- var tree = new Tree.TreePanel({
- el:'tree',
- autoScroll:true,
- animate:true,
- enableDD:true,
- containerScroll: true,
- loader: new Tree.TreeLoader({
- dataUrl:'moduletree.do'
- })
- });
- // set the root node
- var root = new Tree.AsyncTreeNode({
- text: '管辖单位',
- draggable:false,
- id:'source'
- });
- tree.setRootNode(root);
- // render the tree
- tree.render();
- root.expand();
el决定了树的显示位置,一般是个div例如
dataUrl决定了树的json数据来源,我这里是一个struts的action,这个action会输出json数据
在服务层要提供一个可以生成json格式数据的service,struts的任务是获取传来的参数调用service方法输出json
我在服务层生成json数据用的是jsonlib包,论坛有详细介绍的帖子,就不多说了
数据库有两个表来构建树,一个是树的节点表,至少包括树的id name 我这里还有一个haschild,代表有没有子节点。
另一个是节点关系表,两列分别是父节点和他对应的子节点。
service层调用dao的方法将结果集组装成List或者Map,再用jsonlib包提供的api将list转化成json,例如
- //根据用户的角色和id生成用户的管辖单位树
- public List getsubdept(String userid,Long roleid){
- try{
- //调用dao的方法查找到结果集
- List list=roledeptdao.findRoledept(userid, roleid);
- //生成json所使用的单位list
- List deptlist=new ArrayList();
- Iterator it=list.iterator();
- while(it.hasNext()){
- Ruledept rd=(Ruledept) it.next();
- Map tree = new HashMap();
- //节点显示单位名
- tree.put("text", rd.getId().getTYwxtDept().getDeptName());
- //节点的id
- tree.put("id", rd.getId().getTYwxtDept().getDeptId());
- Object value = new Object();
- value = Boolean.TRUE;
- tree.put("cls", "file");
- //是否是叶子节点,我这里只有一层所以直接写的TRUE
- tree.put("leaf", value);
- //将这个生成叶子节点对应的MAP加到单位list里
- deptlist.add(tree);
- }
- return deptlist;
- }catch(Exception e){
- log.error("获取单位列表失败"+e.getMessage());
- return null;
- }
- }
- public JSONArray getmoduletree(String userid, String roleid) {
- List list=this.getsubdept(userid, new Long(roleid));
- if(list==null){
- return null;
- }
- //转换这个list让他变成json格式
- JSONArray jsonArray = JSONArray.fromObject(list);
- return jsonArray;
- }
在action里面调用这个service方法:
- public ActionForward execute(ActionMapping mapping, ActionForm form,
- HttpServletRequest request, HttpServletResponse response) {
- HttpSession httpsession=request.getSession();
- String roleid=(String) httpsession.getAttribute("role");
- UserInfo userinfo=(UserInfo)httpsession.getAttribute("userinfo");
- String userid=userinfo.getUserID();
- JSONArray jsonArray=this.getRoledeptservice().getmoduletree(userid, roleid);
- response.setContentType("text/json; charset=GBK");
- try {
- response.getWriter().print(jsonArray);
- } catch (IOException e) {
- log.error("输出json失败"+e.getMessage());
- return null;
- }
- return null;
- }
这样一个完整的树就生成了,现在这个树是只有两层,如果是多层的就需要修改service方法来递归构造一个树的list再转化成json。
异步读取节点:首先,底层的service方法要做到每次生成的是传入参数的下一级节点的list,然后在js的 tree.setRootNode(root);下面加上这句:js 代码
- tree.on('beforeload', function(node){
- tree.loader.dataUrl = 'createTree.do?id='+node.id;
- });
tree.loader.dataUrl 的值需要返回的就是该节点id的下一级的json数据
数据量大的时候异步加载要好的多,服务层也代码比起一次性全部加载的反复递归调用省不少。