树(Tree)可以在一个空的 <ul> 元素中定义,可使用 javascript 加载数据。

在body中添加ul标签

1
<ul id="tt"></ul>

然后在使用javascript代码加载数据

使用JSON加载数据

1
$('#tt').tree({ url:'treedata.json'});

树的数据格式(Tree Data Format)

每个节点可以包括下列属性:

  • id:节点的 id,它对于加载远程数据很重要。

  • text:要显示的节点文本。

  • state:节点状态,'open' 或 'closed',默认是 'open'。当设置为 'closed' 时,该节点有子节点,并且将从远程站点加载它们。

  • checked:指示节点是否被选中。

  • attributes:给一个节点添加的自定义属性。

  • children:定义了一些子节点的节点数组。

数据格式示例:

1
2
3
4
5
6
7
8
9
[{
   "id":1,
   "text":"Folder1",
   "iconCls":"icon-save",
   "children":[{
"text":"File1",
"checked":true
   }]
  }]

事件

很多事件的回调函数需要 'node' 参数,它包括下列属性:

  • id:绑定到节点的标识值。

  • text:要显示的文本。

  • iconCls:用来显示图标的 css class。

  • checked:节点是否被选中。

  • state:节点状态,'open' 或 'closed'。

  • attributes:绑定到节点的自定义属性。

  • target:目标的 DOM 对象。




JSP+Servlet+JSON树形菜单示例:

数据库表:

wKiom1SNw7vSB2EMAADuXhLI24Q958.jpg

数据库表SQL:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
CREATE TABLE `menu_info` (
  `menu_id` int(11) NOT NULL auto_increment,
  `men_menu_id` int(11) default NULL,
  `menu_name` varchar(100) default NULL,
  `menu_url` varchar(500) default NULL,
  `menu_seq` int(11) default NULL,
  `menu_desc` varchar(1000) default NULL,
  `role_mark` varchar(10) default NULL,
  PRIMARY KEY  (`menu_id`),
  KEY `FK_Reference_2` (`men_menu_id`),
  CONSTRAINT `FK_Reference_2` FOREIGN KEY (`men_menu_id`) REFERENCES `menu_info` (`menu_id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records 
-- ----------------------------
INSERT INTO `menu_info` VALUES ('1'null'系统管理'nullnullnullnull);
INSERT INTO `menu_info` VALUES ('2''1''部门管理'nullnullnullnull);
INSERT INTO `menu_info` VALUES ('3''4''车辆管理'nullnullnullnull);
INSERT INTO `menu_info` VALUES ('4''1''驾驶员管理'nullnullnullnull);
INSERT INTO `menu_info` VALUES ('6''1''人员管理'nullnullnullnull);

数据库DAO查询数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package com.car.system.dao.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import com.car.po.MenuInfo;
import com.car.po.UserInfo;
import com.car.system.dao.MenuInfoDAO;
import com.car.utils.DB;
public class MenuInfoDAOImpl implements MenuInfoDAO{
    @Override
    public List<MenuInfo> getList() {
        Connection con = null;
        PreparedStatement pre = null;
        ResultSet res = null;
        try {
            String sql = "select * from menu_info";
            con = DB.getDB();
            pre = con.prepareStatement(sql);
     
            res = pre.executeQuery();
            List<MenuInfo> list = new ArrayList<MenuInfo>();
            while (res.next()) {
                MenuInfo menu = new MenuInfo();
                menu.setMenuId(res.getInt("menu_id"));
                menu.setMenuName(res.getString("menu_name"));
                menu.setPmenuId(res.getInt("men_menu_id"));
                list.add(menu);
            }
            return list;
        catch (Exception e) {
            e.printStackTrace();
        finally {
            DB.close(con, pre, res);
        }
        return null;
    }
}

编写TreeNode类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package com.car.po;
import java.util.List;
public class TreeNode {
    private int id;
    private String text;
    private String url;
    private int pid;
    private List<TreeNode> children;
    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getText() {
        return text;
    }
    public void setText(String text) {
        this.text = text;
    }
    public int getPid() {
        return pid;
    }
    public void setPid(int pid) {
        this.pid = pid;
    }
    public List<TreeNode> getChildren() {
        return children;
    }
    public void setChildren(List<TreeNode> children) {
        this.children = children;
    }
}

编写JSON公共转换类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package com.car.utils;
import java.util.ArrayList;
import java.util.List;
import com.car.po.TreeNode;
public class JSON {
     
    public static List<TreeNode> buildtree(List<TreeNode> nodes, int id) {
        List<TreeNode> treeNodes = new ArrayList<TreeNode>();
        for (TreeNode treeNode : nodes) {
            TreeNode node = new TreeNode();
            node.setId(treeNode.getId());
            node.setText(treeNode.getText());
            node.setUrl(treeNode.getUrl());
            if (id == treeNode.getPid()) {
                node.setChildren(buildtree(nodes, node.getId()));
                treeNodes.add(node);
            }
        }
        return treeNodes;
    }
}


编写Servlet类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package com.car.system.servlet.menuinfo;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sf.json.JSONArray;
import com.car.po.MenuInfo;
import com.car.po.TreeNode;
import com.car.system.dao.MenuInfoDAO;
import com.car.system.dao.impl.MenuInfoDAOImpl;
import com.car.utils.JSON;
/**
 * Servlet implementation class MenuInfoServlet
 */
@WebServlet("/menuInfolist")
public class MenuInfoServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
        
    /**
     * @see HttpServlet#HttpServlet()
     */
    public MenuInfoServlet() {
        super();
        // TODO Auto-generated constructor stub
    }
    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("--------------");
        this.doPost(request, response);
    }
    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         
        MenuInfoDAO dao = new MenuInfoDAOImpl();
        List<MenuInfo> list = dao.getList();
         
        List<TreeNode> nodes=new ArrayList<TreeNode>();
            for(MenuInfo menu:list){
                TreeNode treeNode = new TreeNode();
                if(menu.getMenuId()==null){
                    treeNode.setId(0);
                }else{
                    treeNode.setId(menu.getMenuId());
                }
                treeNode.setUrl("http://www.baidu.com");
                treeNode.setPid(menu.getPmenuId());
                treeNode.setText(menu.getMenuName());
                nodes.add(treeNode);
            }
            List<TreeNode> treeNodes=JSON.buildtree(nodes,0);
             
            JSONArray jsonArray = JSONArray.fromObject(treeNodes);
             
             
            response.setContentType("text/json");
            response.setCharacterEncoding("utf-8");
            PrintWriter out = response.getWriter();
            out.print(jsonArray);
            out.flush();
            out.close();
             
    }
}


编写Tree.jsp页面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
    String path = request.getContextPath();
    String basePath = request.getScheme() + "://"
            + request.getServerName() + ":" + request.getServerPort()
            + path + "/";
%>        
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<base href="<%=basePath%>">
<title>首页</title>
<link rel="stylesheet" type="text/css"
    href="resource/easyui/themes/default/easyui.css">
<link rel="stylesheet" type="text/css" href="resource/easyui/themes/icon.css">
<script type="text/javascript" src="resource/easyui/jquery.min.js"></script>
<script type="text/javascript" src="resource/easyui/jquery.easyui.min.js"></script>
<script type="text/javascript">
$().ready(function(){
     $('#tt').tree({
        url:'menuInfolist',
        onContextMenu: function(e, node){
            e.preventDefault();
            $('#tt').tree('select', node.target);
         
            $('#mm').menu('show', {
                left: e.pageX,
                top: e.pageY,
                onClick:function(item){
                    var text = item.text;
                    if(item.text=='添加'){
                        alert(node.url);
                        window.mainframe.location="add";
                    }else if(item.text=='修改'){
                        window.mainframe.location="update";
                    }else if(item.text=='删除'){
                        window.mainframe.location="delete";
                    }
                }
            });
        }
     });
});
</script>
</head>
<body>
    <ul id="tt">
    </ul>
    <div id="mm" class="easyui-menu" style="width:120px;">
    <div  data-options="iconCls:'icon-add'" >添加</div>
    <div  data-options="iconCls:'icon-edit'">修改</div>
    <div  data-options="iconCls:'icon-remove'">删除</div>
    </div>
    <iframe name="mainframe"></iframe>
</body>
</html>

效果图:

wKiom1SNxeLAXHtTAAB-bSHh7Uo685.jpg


参考API地址:

tree:http://www.jeasyui.net/plugins/185.html

menu: http://www.jeasyui.net/plugins/163.html