最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

BootStrap Jstree 樹(shù)形菜單的增刪改查的實(shí)現(xiàn)源碼

 更新時(shí)間:2017年02月20日 09:51:43   作者:_PPB  
這篇文章主要介紹了BootStrap Jstree 樹(shù)形菜單的增刪改查的實(shí)現(xiàn)源碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下

1.首先需下載jstree的插件點(diǎn)擊打開(kāi)鏈接

2.在頁(yè)面引入插件js文件css文件

<link rel="stylesheet" href="plugins/jstree/themes/classic/style.css" rel="external nofollow" > 
<script type="text/javascript" src="plugins/jstree/_lib/jquery.js"></script> 
<script type="text/javascript" 
 src="plugins/jstree/_lib/jquery.cookie.js"></script> 
<script type="text/javascript" 
 src="plugins/jstree/_lib/jquery.hotkeys.js"></script> 
<script type="text/javascript" src="plugins/jstree/jquery.jstree.js"></script> 

3.初始化控件

 1)html

<div id="demo2" class="demo" style="height:100px;"></div> 

2)js 使用 demo2來(lái)初始化樹(shù)形控件

<script type="text/javascript" class="source below"> 
 $(function() { 
 $("#demo2").jstree( 
  { 
  "json_data" : { 
   "ajax" : { 
   "url" : "http://localhost:8080/MemberManager/DepartmentTreeJson", 
   "data" : function(n) { 
     // the result is fed to the AJAX request `data` option 
     return { 
     "operation" : "get_children", 
     "id" : n.attr ? n 
      .attr( 
      "id") 
      .replace( 
      "node_", 
      "") 
      : 1 
     }; 
    } 
    } 
   }, 
  "plugins" : [ 
    "themes", 
    "json_data", 
    "ui", 
    "crrm", 
    "contextmenu", 
    "search" ], 
   }) 
  .bind("loaded.jstree", 
   function(event, data) { 
   }) 
  .bind( 
   "select_node.jstree", 
   function(event, data) { 
   if (data.rslt.obj 
    .attr("id") != undefined) { 
   } 
   }) 
  .bind( 
   "remove.jstree", 
   function(e, data) { 
   data.rslt.obj.each(function() { 
    $.ajax({ 
     async : false, 
     type : 'POST', 
     url : "http://localhost:8080/MemberManager/CreateNodeForDepartment", 
     data : { 
      "operation" : "remove_node", 
      "id" : this.id.replace("node_", "") 
     }, 
     success : function(r) { 
      if (!r.status) { 
      data.inst.refresh(); 
      } 
     } 
     }); 
    }); 
   }) 
  .bind( 
   "remove.jstree", 
   function(e, data) { 
   data.rslt.obj.each(function() { 
    $.ajax({ 
     async : false, 
     type : 'POST', 
     url : "http://localhost:8080/MemberManager/CreateNodeForDepartment", 
     data : { 
      "operation" : "remove_node", 
      "id" : this.id 
      .replace( 
      "node_", 
      "") 
     }, 
     success : function( 
      r) { 
      if (!r.status) { 
      data.inst.refresh(); 
      } 
     } 
     }); 
    }); 
   }) 
  .bind( 
   "create.jstree", 
   function(e, data) { 
   $.post( 
    "http://localhost:8080/MemberManager/CreateNodeForDepartment", 
    { 
    "operation" : "create_node", 
    "id" : data.rslt.parent 
     .attr( 
     "id") 
     .replace( 
     "node_", 
     ""), 
    "position" : data.rslt.position, 
    "title" : data.rslt.name, 
    "type" : data.rslt.obj 
     .attr("rel") 
    }, 
    function(r) { 
    if (r.status) { 
     $(data.rslt.obj).attr("id", "node_" + r.id); 
    } else { 
     data.inst.refresh(); 
     $.jstree.rollback(data.rlbk); 
    } 
    }); 
   }) 
  .bind( 
   "rename.jstree", 
   function(e, data) { 
   $.post( 
    "http://localhost:8080/MemberManager/CreateNodeForDepartment", 
    { 
    "operation" : "rename_node", 
    "id" : data.rslt.obj 
     .attr( 
     "id") 
     .replace( 
     "node_", 
     ""), 
    "title" : data.rslt.new_name 
    }, 
    function(r) { 
    if (!r.status) { 
     data.inst.refresh(); 
     $.jstree.rollback(data.rlbk); 
    } 
    }); 
   }) 
   // 1) the loaded event fires as soon as data is parsed and inserted 
   // 2) but if you are using the cookie plugin or the core `initially_open` option: 
  .one("reopen.jstree", 
   function(event, data) { 
   }) 
   // 3) but if you are using the cookie plugin or the UI `initially_select` option: 
  .one("reselect.jstree", 
   function(event, data) { 
   }); 
  }); 
 </script> 
</pre>4.代碼解析<p></p><p><pre name="code" class="java"> 
import java.util.List; 
public class Department { 
 // 部門(mén)id 
 private String departmentid; 
 // 部門(mén)名稱 
 private String name; 
 // 父級(jí)部門(mén)ID 
 private String parentid; 
 //同級(jí)之間的排序。排序id 小的排前面 
 private String orders; 
 //子節(jié)點(diǎn) 
 private List<Department> childNode; 
 public List<Department> getChildNode() { 
 return childNode; 
 } 
 public void setChildNode(List<Department> childNode) { 
 this.childNode = childNode; 
 } 
 public String getDepartmentid() { 
 return departmentid; 
 } 
 public void setDepartmentid(String departmentid) { 
 this.departmentid = departmentid; 
 } 
 public String getName() { 
 return name; 
 } 
 public void setName(String name) { 
 this.name = name; 
 } 
 public String getParentid() { 
 return parentid; 
 } 
 public void setParentid(String parentid) { 
 this.parentid = parentid; 
 } 
 public String getOrders() { 
 return orders; 
 } 
 public void setOrders(String orders) { 
 this.orders = orders; 
 } 
 @Override 
 public String toString(){ 
 return "[departmentID:"+this.departmentid+ 
 "departmentName:"+this.name+ 
 "parentID:"+this.parentid+"orders:"+this.orders+"]"; 
 } 
} 

4.代碼解析

插件初始化我這里使用了插件的兩個(gè)參數(shù)json_data,以及plugins注意看代碼結(jié)構(gòu)

4.1上圖兩個(gè)部分即初始化部分重點(diǎn)解釋下plugins這個(gè)參數(shù)是jstree整合插件的地方theme表示主題,json_data將上文定義的json_data也就

是Ajax從后要獲取json數(shù)據(jù)返回到前臺(tái)頁(yè)面。contextmenu,是鼠標(biāo)右鍵在樹(shù)形節(jié)點(diǎn)上會(huì)彈出增刪改查的菜單。

4.2 json數(shù)據(jù)的格式

先看展示

這是一個(gè)可以無(wú)限極下分的菜單,我們可以根據(jù)上圖的目錄結(jié)構(gòu)對(duì)照下面的json數(shù)據(jù)結(jié)構(gòu)來(lái)看,這樣會(huì)更清晰。

{"data":"軟件及數(shù)據(jù)","attr":{"id":"e59365b9-7b2a-43a3-b10a-cfe03d5eb004"}, 
 "children":[ 
 {"data":"創(chuàng)新組","attr":{"id":"73919359-2a1b-4ee7-bcc2-56949e8560e8"}, 
  "children":[ 
   {"data":"大數(shù)據(jù)","attr":{"id":"a7ea6a0f-0b78-4064-803b-f2e0a95d914f"}, 
   "children":[ 
    {"data":"研發(fā)","attr":{"id":"fc20e438-e7b9-4cca-be6a-49965daab528"},"children":[]}]}]}, 
 {"data":"項(xiàng)目管理","attr":{"id":"e1bdae71-6cfb-4e8c-ab29-a3eb03b9961d"},"children":[]} 
 ] 
}, 

4.4組裝json數(shù)據(jù),我使用的是首先查找到所有的父節(jié)點(diǎn)即parentid=1的時(shí)候,然后遞歸將所有的子節(jié)點(diǎn)加到List<chiledren>對(duì)象里面,緊接著再通過(guò)循環(huán)遞歸組裝無(wú)限極菜單json數(shù)據(jù)下面看數(shù)據(jù)庫(kù)數(shù)據(jù)結(jié)構(gòu)

import java.util.List; 
public class Department { 
 // 部門(mén)id 
 private String departmentid; 
 // 部門(mén)名稱 
 private String name; 
 // 父級(jí)部門(mén)ID 
 private String parentid; 
 //同級(jí)之間的排序。排序id 小的排前面 
 private String orders; 
 //子節(jié)點(diǎn) 
 private List<Department> childNode; 
 public List<Department> getChildNode() { 
  return childNode; 
 } 
 public void setChildNode(List<Department> childNode) { 
  this.childNode = childNode; 
 } 
 public String getDepartmentid() { 
  return departmentid; 
 } 
 public void setDepartmentid(String departmentid) { 
  this.departmentid = departmentid; 
 } 
 public String getName() { 
  return name; 
 } 
 public void setName(String name) { 
  this.name = name; 
 } 
 public String getParentid() { 
  return parentid; 
 } 
 public void setParentid(String parentid) { 
  this.parentid = parentid; 
 } 
 public String getOrders() { 
  return orders; 
 } 
 public void setOrders(String orders) { 
  this.orders = orders; 
 } 
 @Override 
 public String toString(){ 
  return "[departmentID:"+this.departmentid+ 
  "departmentName:"+this.name+ 
  "parentID:"+this.parentid+"orders:"+this.orders+"]"; 
 } 
} 

4.5 此處servlet為客戶端提供jstree的json_data。就是在初始化控件時(shí)候有ajax調(diào)用這個(gè)servlet獲取json數(shù)據(jù)并返回給json_data

import java.io.IOException; 
import java.io.PrintWriter; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import cn.goldwind.www.service.DepartmentService; 
import cn.goldwind.www.serviceimpl.DepartmentServiceImpl; 
public class DepartmentTreeJson extends HttpServlet { 
 /** 
  * 
  */ 
 private static final long serialVersionUID = 1L; 
 public DepartmentTreeJson() { 
  super(); 
 } 
 @Override 
 public void destroy() { 
  super.destroy(); // Just puts "destroy" string in log 
  // Put your code here 
 } 
 @Override 
 public void doGet(HttpServletRequest request, HttpServletResponse response) 
   throws ServletException, IOException { 
  request.setCharacterEncoding("utf-8"); 
  response.setContentType("text/html;charset=UTF-8"); 
  PrintWriter out = response.getWriter(); 
  DepartmentService deptService=new DepartmentServiceImpl(); 
  //此處調(diào)用創(chuàng)建樹(shù)節(jié)點(diǎn)的方法 
  StringBuilder json=deptService.createTreeNode(); 
  json.deleteCharAt(json.length()-1); 
  System.out.println(json); 
  out.print("["+json+"]"); 
  out.flush(); 
  out.close(); 
 } 
 @Override 
 public void doPost(HttpServletRequest request, HttpServletResponse response) 
   throws ServletException, IOException { 
  doGet(request, response); 
 } 
 @Override 
 public void init() throws ServletException { 
  // Put your code here 
 } 
} 

4.6上面servlet我們看下createTreeNode方法

這里是創(chuàng)建json的核心。

1)首先獲取所有的(parent=1)根節(jié)點(diǎn)

@Override 
 public StringBuilder createTreeNode() { 
  //創(chuàng)建部門(mén)集合 
  List<Department> departments = new ArrayList<Department>(); 
  //放置所有的根節(jié)點(diǎn)部門(mén)實(shí)體 
  departments = queryByParentID("1"); 
  if (departments != null) { 
   return json(departments); 
  } 
  return null; 
 } 
 public StringBuilder json(List<Department> departments) { 
  for (int i = 0; i < departments.size(); i++) { 
   json.append('{'); 
   json.append("\"data\":\"").append(departments.get(i).getName()) 
     .append("\","); 
   json.append("\"attr\":{\"id\":\"").append(departments.get(i).getDepartmentid()).append("\"},"); 
   List<Department> deptchild = queryByParentID(departments.get(i) 
     .getDepartmentid()); 
   json.append("\"children\":"); 
   json.append('['); 
   if (deptchild != null) { 
    json(deptchild); 
    if("1".equals(departments.get(i).getParentid())){ 
     json.deleteCharAt(json.length()-1); 
     json.append(']'); 
     json.append('}'); 
     json.append(','); 
    }if(!"1".equals(departments.get(i).getParentid())&&deptchild!=null){ 
     json.deleteCharAt(json.length()-1); 
     json.append(']'); 
     json.append('}'); 
     json.append(','); 
    } 
   } else{ 
    json.append(']'); 
    json.append('}'); 
    json.append(','); 
   } 
  } 
  return json; 
 } 
 @Override 
 public List<Department> queryByParentID(String parentID) { 
  BaseDaoTemplate bd = new BaseDaoTemplate(); 
  List<Department> departments = new ArrayList<Department>(); 
  String sql = "select departmentid,name,parentid,orders from department where parentid=? "; 
  List<Object> params = new ArrayList<Object>(); 
  params.add(parentID); 
  departments = bd.findAllData(Department.class, sql, params); 
  if (departments.size() > 0) { 
   return departments; 
  } 
  return null; 
 } 

4.7

1.如何創(chuàng)建節(jié)點(diǎn)通過(guò)右鍵點(diǎn)擊樹(shù)形菜單彈出增加移除等操作(需在plugins里面加入contextmenu 這個(gè)例子就有)

2.綁定jstree的操作,此處以增加節(jié)點(diǎn)為例不一一例舉

原理;通過(guò)點(diǎn)擊創(chuàng)建按鈕(contextMenu)即選定樹(shù)節(jié)點(diǎn)右鍵彈出按鈕。調(diào)用上圖的方法,上圖方法post方法通過(guò)ajax請(qǐng)求后臺(tái)數(shù)據(jù)把創(chuàng)建的樹(shù)節(jié)點(diǎn)保存到數(shù)據(jù)庫(kù),

operation:操作的方式(創(chuàng)建,移除,修改。。);

id:當(dāng)前節(jié)點(diǎn)的id 即你創(chuàng)建下一個(gè)節(jié)點(diǎn)的parentID。

title:創(chuàng)建的新節(jié)點(diǎn)的名稱

有這些數(shù)據(jù)就可以字啊后臺(tái)獲取數(shù)據(jù)然后增加到數(shù)據(jù)庫(kù)。

4.8 創(chuàng)建 servlet處理所有的操作(創(chuàng)建,移除,修改。。)

import java.io.IOException; 
import java.io.PrintWriter; 
import java.util.UUID; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import cn.goldwind.www.pojo.Department; 
import cn.goldwind.www.service.DepartmentService; 
import cn.goldwind.www.serviceimpl.DepartmentServiceImpl; 
public class CreateNodeForDepartment extends HttpServlet { 
 private static final long serialVersionUID = 1L; 
 public CreateNodeForDepartment() { 
  super(); 
 } 
 @Override 
 public void destroy() { 
  super.destroy(); // Just puts "destroy" string in log 
  // Put your code here 
 } 
 @Override 
 public void doGet(HttpServletRequest request, HttpServletResponse response) 
   throws ServletException, IOException { 
  request.setCharacterEncoding("utf-8"); 
  response.setContentType("text/html;charset=UTF-8"); 
  PrintWriter out = response.getWriter(); 
  DepartmentService deptService=new DepartmentServiceImpl(); 
  if("rename_node".equals(request.getParameter("operation"))){ 
   String id=request.getParameter("id"); 
   String title=request.getParameter("title"); 
   Department dept=new Department(); 
   dept.setDepartmentid(id); 
   deptService.modifyDepartment(dept, title); 
  }else if("create_node".equals(request.getParameter("operation"))){ 
   String id=request.getParameter("id"); 
   String title=request.getParameter("title"); 
   Department dept=new Department(); 
   dept.setDepartmentid(UUID.randomUUID().toString()); 
   dept.setName(title); 
   dept.setParentid(id); 
   deptService.insertDepartment(dept); 
  }else if("remove_node".equals(request.getParameter("operation"))){ 
   String id=request.getParameter("id"); 
   Department dept=new Department(); 
   dept.setDepartmentid(id); 
   deptService.deleteDepartment(dept); 
  } 
  out.flush(); 
  out.close(); 
 } 
 /** 
  * The doPost method of the servlet. <br> 
  * 
  * This method is called when a form has its tag value method equals to 
  * post. 
  * 
  * @param request 
  *   the request send by the client to the server 
  * @param response 
  *   the response send by the server to the client 
  * @throws ServletException 
  *    if an error occurred 
  * @throws IOException 
  *    if an error occurred 
  */ 
 @Override 
 public void doPost(HttpServletRequest request, HttpServletResponse response) 
   throws ServletException, IOException { 
  doGet(request, response); 
 } 
 /** 
  * Initialization of the servlet. <br> 
  * 
  * @throws ServletException 
  *    if an error occurs 
  */ 
 @Override 
 public void init() throws ServletException { 
  // Put your code here 
 } 
} 

好了這就完成了,當(dāng)然這里面的樹(shù)也是可以自定義圖標(biāo),自定義按鈕等操作,具體可以自己去探究。

以上所述是小編給大家介紹的BootStrap Jstree 樹(shù)形菜單的增刪改查的實(shí)現(xiàn)源碼,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Spring動(dòng)態(tài)加載bean后調(diào)用實(shí)現(xiàn)方法解析

    Spring動(dòng)態(tài)加載bean后調(diào)用實(shí)現(xiàn)方法解析

    這篇文章主要介紹了Spring動(dòng)態(tài)加載bean后調(diào)用實(shí)現(xiàn)方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • Java語(yǔ)言----三種循環(huán)語(yǔ)句的區(qū)別介紹

    Java語(yǔ)言----三種循環(huán)語(yǔ)句的區(qū)別介紹

    下面小編就為大家?guī)?lái)一篇Java語(yǔ)言----三種循環(huán)語(yǔ)句的區(qū)別介紹。小編舉得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-07-07
  • Java讀取圖片EXIF信息的方法

    Java讀取圖片EXIF信息的方法

    這篇文章主要介紹了Java讀取圖片EXIF信息的方法,較為詳細(xì)的分析了圖片EXIF信息的概念、功能及java讀取EXIF信息的實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2015-07-07
  • Spring Boot 中啟用定時(shí)任務(wù)的操作方法

    Spring Boot 中啟用定時(shí)任務(wù)的操作方法

    文章主要介紹了如何在Spring Boot中啟用定時(shí)任務(wù),包括使用@EnableScheduling注解、配置項(xiàng)控制定時(shí)任務(wù)是否開(kāi)啟以及如何關(guān)閉cron定時(shí)任務(wù),感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • SpringMVC 單文件上傳與多文件上傳實(shí)例

    SpringMVC 單文件上傳與多文件上傳實(shí)例

    這篇文章主要介紹了SpringMVC 單文件上傳與多文件上傳實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • Idea調(diào)用WebService的關(guān)鍵步驟和注意事項(xiàng)

    Idea調(diào)用WebService的關(guān)鍵步驟和注意事項(xiàng)

    這篇文章主要介紹了如何在Idea中調(diào)用WebService,包括理解WebService的基本概念、獲取WSDL文件、閱讀和理解WSDL文件、選擇對(duì)接測(cè)試工具或方式、發(fā)送請(qǐng)求和接收響應(yīng)、處理響應(yīng)結(jié)果以及錯(cuò)誤處理,需要的朋友可以參考下
    2025-01-01
  • Mybatis 創(chuàng)建方法、全局配置教程詳解

    Mybatis 創(chuàng)建方法、全局配置教程詳解

    MyBatis是一個(gè)半自動(dòng)化的輕量級(jí)的持久化層框架。 MyBatis實(shí)際上是Ibatis3.0版本以后的持久化層框架,下面通過(guò)本文給大家分享Mybatis 創(chuàng)建方法、全局配置教程詳解,需要的朋友參考下吧
    2017-09-09
  • 利用java+mysql遞歸實(shí)現(xiàn)拼接樹(shù)形JSON列表的方法示例

    利用java+mysql遞歸實(shí)現(xiàn)拼接樹(shù)形JSON列表的方法示例

    這篇文章主要給大家介紹了關(guān)于利用java+mysql遞歸實(shí)現(xiàn)拼接樹(shù)形JSON列表的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來(lái)一起看看吧。
    2017-08-08
  • 手把手帶你用java搞定青蛙跳臺(tái)階

    手把手帶你用java搞定青蛙跳臺(tái)階

    這篇文章主要給大家介紹了關(guān)于Java青蛙跳臺(tái)階問(wèn)題的解決思路與代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08
  • 關(guān)于@EnableGlobalMethodSecurity注解的用法解讀

    關(guān)于@EnableGlobalMethodSecurity注解的用法解讀

    這篇文章主要介紹了關(guān)于@EnableGlobalMethodSecurity注解的用法解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03

最新評(píng)論

丹巴县| 绥阳县| 静乐县| 聊城市| 张家港市| 辽宁省| 新安县| 密云县| 益阳市| 靖江市| 汶川县| 武强县| 商南县| 丰城市| 临泽县| 彰化市| 新宁县| 嘉祥县| 吐鲁番市| 海盐县| 乌拉特后旗| 油尖旺区| 寿光市| 庐江县| 濮阳市| 咸阳市| 靖安县| 神木县| 汉源县| 特克斯县| 和田县| 临猗县| 五大连池市| 星子县| 聊城市| 玉山县| 崇州市| 桐柏县| 沧源| 林州市| 苏尼特左旗|