1. Tree的初始化
由页面静态加载的,大家都知道了,easyui API也有,我就不再赘述了,这里主要是怎么通过ajax后台请求数据,并生成tree。
我们一般都是会配合一个登录系统来实现,用户登录之后会出现tree的页面,在页面初始化的时候加载tree,就需要onload时间来实现,或者使用jQuery的$(function (){});也能实现。
代码如下:
- $(function () {
- // 登录成功提示
- $.messager.show({
- title : '提示',
- msg : "登录成功"
- });
- // 一下添加tree代码
- });
这样当页面元素加载完成就会调用function,这时在里面加上tree的加载就行。
- // 实例化树菜单
- $("#tree").tree({
- url:'getNodesById.do?id=1',// 请求路径
- onLoadSuccess:function(node,data){// 成功加载树之后的操作
- var tree = $(this);
- if(data){
- $(data).each(function(index,d) {// 遍历生成节点
- if (this.state=='closed') {
- tree.tree('expandAll');
- }
- });
- }
- }
- });
上面的代码就是简单的加载tree的方法,其中url就是请求路径,在这里会根据url去同后台进行交互,后台只要组装好数据,response后前天就行。
- /**
- * 初始化所有的树形节点
- * @throws UnsupportedEncodingException
- */
- "/getNodesById")(value=
- public void getNodesById(@RequestParam int id ,HttpServletRequest request,HttpServletResponse response) throws UnsupportedEncodingException{
- request.setCharacterEncoding("utf-8");
- response.setCharacterEncoding("utf-8");
- System.out.println("kaishi");
- String str ="";
- StringBuilder json = new StringBuilder();
- // 获得根节点
- Tree treeRoot = treeService.getNodeById(id);
- // 拼接根节点
- json.append("[");
- json.append("{\"id\":" +String.valueOf(treeRoot.getId()));
- json.append(",\"text\":\"" +treeRoot.getText() + "\"");
- json.append(",\"state\":\"open\"");
- // 获取根节点下的所有子节点
- List<Tree> treeList = treeService.getNodesById(id);
- // 遍历子节点下的子节点
- if(treeList!=null && treeList.size()!=0){
- json.append(",\"children\":[");
- for (Tree t : treeList) {
- json.append("{\"id\":" +String.valueOf(t.getId()));
- json.append(",\"text\":\"" +t.getText() + "\"");
- json.append(",\"state\":\"open\"");
- // 该节点有子节点
- // 设置为关闭状态,而从构造异步加载tree
- List<Tree> tList = treeService.getNodesById(t.getId());
- if(tList!=null && tList.size()!=0){// 存在子节点
- json.append(",\"children\":[");
- json.append(dealJsonFormat(tList));// 存在子节点的都放在一个工具类里面处理了
- json.append("]");
- }
- json.append("},");
- }
- str = json.toString();
- str = str.substring(0, str.length()-1);
- str+="]}]";
- }
- try {
- System.out.println("输出json数据"+str);
- response.getWriter().print(str);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- /**
- * 处理数据集合,将数据集合转为符合格式的json
- * @param tList 参数
- * @return json字符串
- */
- public String dealJsonFormat(List<Tree> tList){
- StringBuilder json = new StringBuilder();
- for (Tree tree : tList) {
- json.append("{\"id\":" +String.valueOf(tree.getId()));
- json.append(",\"text\":\"" +tree.getText() + "\"");
- json.append(",\"attributes\":\""+tree.getAttributes()+"\"");
- json.append("},");
- }
- String str = json.toString();
- str = str.substring(0, str.length()-1);
- System.out.println("---------"+str);
- return str;
- }
- // 输出的json格式
- [
- {
- "id": 1,
- "text": "功能菜单",
- "state": "open",
- "children": [
- {
- "id": 2,
- "text": "北京",
- "state": "open",
- "children": [
- {
- "id": 4,
- "text": "北京IOP数据",
- "attributes": "showAreaList.do?"
- },
- {
- "id": 5,
- "text": "北京虚拟机数据",
- "attributes": "showAreaList.do?"
- }
- ]
- },
- {
- "id": 3,
- "text": "上海",
- "state": "open",
- "children": [
- {
- "id": 6,
- "text": "上海IOP数据",
- "attributes": "showAreaList.do?"
- },
- {
- "id": 7,
- "text": "上海虚拟机数据",
- "attributes": "showAreaList.do?"
- }
- ]
- }
- ]
- }
- ]
2. 节点的增删改
这个我没有研究出来直接在添加修改时,焦点聚焦到选中的节点,使用了另外一种方法,使用easyui的dialog弹出窗来实现的,这个不要见笑了。
这样实现,就能轻易的获取节点的内容了,之后就是提交事件触发ajax请求后台数据了。
(1) 右键菜单功能
就是简单的创建一个div,这个菜单引入easyui的样式就行。这里定义id是为了方便判断选中的是添加,修改,删除中的哪一个。
html:
- <div id="tabsMenu" class="easyui-menu" style="width:120px;">
- <div name="close" id="1">添加</div>
- <div name="Other" id="2">修改</div>
- <div name="All" id="3">删除</div>
- </div>
- // 实例化树菜单
- $("#tree").tree({
- url:'getNodesById.do?id=1',
- onLoadSuccess:function(node,data){// 加载树
- var tree = $(this);
- if(data){
- $(data).each(function(index,d) {
- if (this.state=='closed') {
- tree.tree('expandAll');
- }
- });
- }
- }
- onContextMenu: function(e,node){// 生成右键菜单
- e.preventDefault();
- $(this).tree('select',node.target);
- $('#tabsMenu').menu('show',{
- left: e.pageX,
- top: e.pageY
- });
- $('#tabsMenu').menu({
- onClick:function(item){ // 根据选择的id判断选中的是添加,修改,还是删除
- if(item.id==1){// 添加
- document.getElementById("mydialog").title = "添加节点";
- var node = $("#tree").tree('getSelected');
- document.getElementById("txRolename").value = "";
- alert(node.text);
- $('#mydialog').show(); // 弹出框显示
- $('#mydialog').dialog({
- collapsible: true,
- minimizable: true,
- maximizable: true,
- buttons: [{
- text: '提交',
- iconCls: 'icon-ok',
- handler: function() {
- $.ajax({
- url : "addTreeNode.do",
- type : "post",
- async : false,
- data : "area="+$("#txRolename").val()+"&pid="+node.id,
- dataType:"json",
- success : function(data) {
- loadTree();
- $('#mydialog').dialog('close');
- }
- });
- }
- }, {
- text: '取消',
- handler: function() {
- $('#mydialog').dialog('close');
- }
- }]
- });
- }else if(item.id==2){// 修改
- var node = $("#tree").tree('getSelected');
- document.getElementById("mydialog").title = "修改节点";
- document.getElementById("txRolename").value = node.text;
- $('#mydialog').show();
- $('#mydialog').dialog({
- collapsible: true,
- minimizable: true,
- maximizable: true,
- buttons: [{
- text: '提交',
- iconCls: 'icon-ok',
- handler: function() {
- $.ajax({
- url : "updTreeNode.do",
- type : "post",
- async : false,
- data : "area="+$("#txRolename").val()+"&id="+node.id,
- dataType:"json",
- success : function(data) {
- loadTree();
- $('#mydialog').dialog('close');
- }
- });
- }
- }, {
- text: '取消',
- handler: function() {
- $('#mydialog').dialog('close');
- }
- }]
- });
- }else if(item.id==3){// 删除
- var node = $("#tree").tree('getSelected');
- $('#mydialogtemp').show();
- $('#mydialogtemp').dialog({
- collapsible: true,
- minimizable: true,
- maximizable: true,
- buttons: [{
- text: '提交',
- iconCls: 'icon-ok',
- handler: function() {
- alert('提交数据');
- $.ajax({
- url : "delTreeNode.do",
- type : "post",
- async : false,
- data :"id="+node.id,
- dataType:"json",
- success : function(data) {
- loadTree();
- $('#mydialogtemp').dialog('close');
- }
- });
- }
- }, {
- text: '取消',
- handler: function() {
- $('#mydialog').dialog('close');
- }
- }]
- });
- }
- }
- });
- }
- });
这样就可以实现右键功能了,我这里顺便把增删改写上了。这点简单相信大家都能看懂,接下来的事情就是与后台交互了,这里就不在赘述了。添加,修改,删除之后,别忘记重新加载一下树。
- // 加载树
- function loadTree(){
- $("#tree").tree({
- url:'getNodesById.do?id=1',
- onLoadSuccess:function(node,data){
- var tree = $(this);
- if(data){
- $(data).each(function(index,d) {
- if (this.state=='closed') {
- tree.tree('expandAll');
- }
- });
- }
- }});
- }
3. 叶子节点点击事件
主要是使用ifream来加载一个新的页面
- // 实例化树菜单
- $("#tree").tree({
- url:'getNodesById.do?id=1',
- onLoadSuccess:function(node,data){// 加载树
- var tree = $(this);
- if(data){
- $(data).each(function(index,d) {
- if (this.state=='closed') {
- tree.tree('expandAll');
- }
- });
- }
- },
- onClick:function(node){// 添加tab
- if(node.attributes){
- node1=$("#tree").tree('getParent',node.target);
- openTab(node.text,node.attributes,node1.text);
- }
- }
- });
- // 新增Tab
- function openTab(text,url,text1){
- if($("#tabs").tabs('exists',text)){
- $("#tabs").tabs('select',text);
- }else{
- url = url+"area="+text1;
- alert(url);
- var content="<iframe frameborder='0' scrolling='auto' style='width:100%;height:100%' src="+url+"></iframe>";
- $("#tabs").tabs('add',{
- title:text,
- closable:true,
- content:content
- });
- }
- }
- });
然后后台代码指向新页面,这样就会加载进去了。
前端HTML代码
- <%@ page language="java" pageEncoding="UTF-8"%>
- <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
- <%
- String path = request.getContextPath();
- %>
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <script src="js/jquery-easyui-1.4.1/jquery.min.js"></script>
- <script src="js/jquery-easyui-1.4.1/jquery.easyui.min.js"></script>
- <link href="js/jquery-easyui-1.4.1/themes/default/easyui.css" rel="stylesheet"/>
- <link href="js/jquery-easyui-1.4.1/themes/icon.css" rel="stylesheet" />
- <script src="js/jquery-easyui-1.4.1/locale/easyui-lang-zh_CN.js"></script>
- <script >
- var node1;
- $(function () {
- // 登录成功提示
- $.messager.show({
- title : '提示',
- msg : "登录成功"
- });
- // 实例化树菜单
- $("#tree").tree({
- url:'getNodesById.do?id=1',
- onLoadSuccess:function(node,data){// 加载树
- var tree = $(this);
- if(data){
- $(data).each(function(index,d) {
- if (this.state=='closed') {
- tree.tree('expandAll');
- }
- });
- }
- },
- onClick:function(node){// 添加tab
- if(node.attributes){
- node1=$("#tree").tree('getParent',node.target);
- openTab(node.text,node.attributes,node1.text);
- }
- },
- onContextMenu: function(e,node){// 生成右键菜单
- e.preventDefault();
- $(this).tree('select',node.target);
- $('#tabsMenu').menu('show',{
- left: e.pageX,
- top: e.pageY
- });
- $('#tabsMenu').menu({
- onClick:function(item){
- if(item.id==1){// 添加
- document.getElementById("mydialog").title = "添加节点";
- var node = $("#tree").tree('getSelected');
- document.getElementById("txRolename").value = "";
- alert(node.text);
- $('#mydialog').show();
- $('#mydialog').dialog({
- collapsible: true,
- minimizable: true,
- maximizable: true,
- buttons: [{
- text: '提交',
- iconCls: 'icon-ok',
- handler: function() {
- $.ajax({
- url : "addTreeNode.do",
- type : "post",
- async : false,
- data : "area="+$("#txRolename").val()+"&pid="+node.id,
- dataType:"json",
- success : function(data) {
- loadTree();
- $('#mydialog').dialog('close');
- }
- });
- }
- }, {
- text: '取消',
- handler: function() {
- $('#mydialog').dialog('close');
- }
- }]
- });
- }else if(item.id==2){// 修改
- var node = $("#tree").tree('getSelected');
- document.getElementById("mydialog").title = "修改节点";
- document.getElementById("txRolename").value = node.text;
- $('#mydialog').show();
- $('#mydialog').dialog({
- collapsible: true,
- minimizable: true,
- maximizable: true,
- buttons: [{
- text: '提交',
- iconCls: 'icon-ok',
- handler: function() {
- $.ajax({
- url : "updTreeNode.do",
- type : "post",
- async : false,
- data : "area="+$("#txRolename").val()+"&id="+node.id,
- dataType:"json",
- success : function(data) {
- loadTree();
- $('#mydialog').dialog('close');
- }
- });
- }
- }, {
- text: '取消',
- handler: function() {
- $('#mydialog').dialog('close');
- }
- }]
- });
- }else if(item.id==3){// 删除
- var node = $("#tree").tree('getSelected');
- $('#mydialogtemp').show();
- $('#mydialogtemp').dialog({
- collapsible: true,
- minimizable: true,
- maximizable: true,
- buttons: [{
- text: '提交',
- iconCls: 'icon-ok',
- handler: function() {
- alert('提交数据');
- $.ajax({
- url : "delTreeNode.do",
- type : "post",
- async : false,
- data :"id="+node.id,
- dataType:"json",
- success : function(data) {
- loadTree();
- $('#mydialogtemp').dialog('close');
- }
- });
- }
- }, {
- text: '取消',
- handler: function() {
- $('#mydialog').dialog('close');
- }
- }]
- });
- }
- }
- });
- }
- });
- // 加载树
- function loadTree(){
- $("#tree").tree({
- url:'getNodesById.do?id=1',
- onLoadSuccess:function(node,data){
- var tree = $(this);
- if(data){
- $(data).each(function(index,d) {
- if (this.state=='closed') {
- tree.tree('expandAll');
- }
- });
- }
- }});
- }
- // 新增Tab
- function openTab(text,url,text1){
- if($("#tabs").tabs('exists',text)){
- $("#tabs").tabs('select',text);
- }else{
- url = url+"area="+text1;
- alert(url);
- var content="<iframe frameborder='0' scrolling='auto' style='width:100%;height:100%' src="+url+"></iframe>";
- $("#tabs").tabs('add',{
- title:text,
- closable:true,
- content:content
- });
- }
- }
- });
- // 注销系统
- function getOut(){
- window.location.href ="<%=path%>/getOut.do";
- }
- </script>
- <style>
- article, aside, figure, footer, header, hgroup,
- menu, nav, section { display: block; }
- .west{
- width:200px;
- padding:10px;
- }
- .north{
- height:75px;
- }
- .south{
- height:50px;
- }
- </style>
- </head>
- <body class="easyui-layout">
- <div region="north" class="north" style="background:url('image/autelan.png') no-repeat;">
- <div style="float:right;font-size: 15px;height:60px;text-align: center;padding-right: 20px;padding-bottom: 10px;">
- 欢迎<span style="color:red">${sessionScope.user.username}</span>登陆
- <a href="#" onclick="getOut()">
- <img src="image/exit.png"/>注销</a>
- <a href="javascript:history.go(-1);">
- <img src="image/nav_back.gif" />后退</a>
- <a href="javascript:history.go(1);">
- <img src="image/nav_forward.gif" />前进
- </a>
- </div>
- </div>
- <div region="center" title="数据管理">
- <div class="easyui-tabs" fit="true" border="false" id="tabs">
- </div>
- </div>
- <div region="west" class="west" title="导航菜单">
- <ul id="tree"></ul>
- </div>
- <div region="south" class="south" style="text-align: center">
- 版权所有@-----------------------翻版必究
- </div>
- <div id="tabsMenu" class="easyui-menu" style="width:120px;">
- <div name="close" id="1">添加</div>
- <div name="Other" id="2">修改</div>
- <div name="All" id="3">删除</div>
- </div>
- <div id="mydialog" style="display:none;padding:5px;width:400px;height:100px;">
- <label class="lbInfo">节点名称:</label>
- <input id="txRolename" type="text" class="easyui-validatebox" required="true" /><br />
- </div>
- <div id="mydialogtemp" style="display:none;padding:5px;width:400px;height:100px;" title="删除节点">
- 你确定要删除该节点?删除的同时会将该节点下的所有子节点删除!
- </div>
- </body>
- </html>
后台Java代码
- package com.chenqk.springmvc.controller;
- import java.io.IOException;
- import java.io.UnsupportedEncodingException;
- import java.util.List;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import org.apache.log4j.Logger;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.beans.factory.annotation.Qualifier;
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RequestParam;
- import com.chenqk.springmvc.service.TreeService;
- import com.chenqk.springmvc.entity.Tree;
- /**
- * 控制类
- * @author chenqk
- *
- */
- "/")(
- public class TreeController{
- "TreeService")(
- private TreeService treeService;
- private static Logger logger = Logger.getLogger(TreeController.class);
- /**
- * 初始化所有的树形节点
- * @throws UnsupportedEncodingException
- */
- "/getNodesById")(value=
- public void getNodesById(@RequestParam int id ,HttpServletRequest request,HttpServletResponse response) throws UnsupportedEncodingException{
- request.setCharacterEncoding("utf-8");
- response.setCharacterEncoding("utf-8");
- System.out.println("kaishi");
- String str ="";
- StringBuilder json = new StringBuilder();
- // 获得根节点
- Tree treeRoot = treeService.getNodeById(id);
- // 拼接根节点
- json.append("[");
- json.append("{\"id\":" +String.valueOf(treeRoot.getId()));
- json.append(",\"text\":\"" +treeRoot.getText() + "\"");
- json.append(",\"state\":\"open\"");
- // 获取根节点下的所有子节点
- List<Tree> treeList = treeService.getNodesById(id);
- // 遍历子节点下的子节点
- if(treeList!=null && treeList.size()!=0){
- json.append(",\"children\":[");
- for (Tree t : treeList) {
- json.append("{\"id\":" +String.valueOf(t.getId()));
- json.append(",\"text\":\"" +t.getText() + "\"");
- json.append(",\"state\":\"open\"");
- // 该节点有子节点
- // 设置为关闭状态,而从构造异步加载tree
- List<Tree> tList = treeService.getNodesById(t.getId());
- if(tList!=null && tList.size()!=0){// 存在子节点
- json.append(",\"children\":[");
- json.append(dealJsonFormat(tList));// 存在子节点的都放在一个工具类里面处理了
- json.append("]");
- }
- json.append("},");
- }
- str = json.toString();
- str = str.substring(0, str.length()-1);
- str+="]}]";
- }
- try {
- System.out.println("输出json数据"+str);
- response.getWriter().print(str);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- /**
- * 添加新节点
- * @param area 节点名称
- * @param pid 父节点id
- * @param request
- * @param response
- */
- "/addTreeNode")(value=
- public void addTreeNode(@RequestParam String area,String pid,HttpServletRequest request,HttpServletResponse response){
- System.out.println("area="+area+",pid="+pid);
- Tree tree = new Tree();
- tree.setPid(Integer.parseInt(pid));
- tree.setText(area);
- tree.setAttributes("showAreaList.do?");
- treeService.addTreeNode(tree);
- try {
- this.getNodesById(1, request, response);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- /**
- * 修改节点名称
- * @param area 节点名称
- * @param id 节点id
- * @param request
- * @param response
- */
- "/updTreeNode")(value=
- public void updTreeNode(@RequestParam String area,String id,HttpServletRequest request,HttpServletResponse response){
- Tree tree = new Tree();
- tree.setId(Integer.parseInt(id));
- tree.setText(area);
- treeService.updTreeNode(tree);
- try {
- this.getNodesById(1, request, response);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- /**
- * 删除节点
- * @param id 节点id
- * @param pid
- * @param request
- * @param response
- */
- "/delTreeNode")(value=
- public void delTreeNode(@RequestParam String id,HttpServletRequest request,HttpServletResponse response){
- treeService.delTreeNode(Integer.parseInt(id));
- try {
- this.getNodesById(1, request, response);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- /**
- * 处理数据集合,将数据集合转为符合格式的json
- * @param tList 参数
- * @return json字符串
- */
- public String dealJsonFormat(List<Tree> tList){
- StringBuilder json = new StringBuilder();
- for (Tree tree : tList) {
- json.append("{\"id\":" +String.valueOf(tree.getId()));
- json.append(",\"text\":\"" +tree.getText() + "\"");
- json.append(",\"attributes\":\""+tree.getAttributes()+"\"");
- json.append("},");
- }
- String str = json.toString();
- str = str.substring(0, str.length()-1);
- System.out.println("---------"+str);
- return str;
- }
- public TreeService getTreeService() {
- return treeService;
- }
- public void setTreeService(TreeService treeService) {
- this.treeService = treeService;
- }
- }