Ztree树形插件使用
一. ztree.js 的使用
Ztree 是一个依靠 jQuery 实现的多功能 "树插件". 开源免费的插件
适合项目开发, 尤其是树状菜单, 树状数据的 Web 显示, 权限管理等等
优点:
优异的性能, 灵活的配置,, 多种功能的组合
步骤:
1.准备需要的资源拷贝得到项目中
2.定义 jsp 和 js
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <base href="/MvcPro/"> 7 <meta charset="utf-8"> 8 <title>异步上传</title> 9 <!--表示样式可以根据设备的大小自适应--> 10 <meta name="viewport" content="width=divce-width,initial-scale=1"> 11 <!--导入jq的js文件--> 12 <script type="text/javascript" src="js/jquery.min.js"></script> 13 <!--导入bootstrap的js--> 14 <script type="text/javascript" src="bootstrap/js/bootstrap.min.js"></script> 15 <!--导入bootstrap的css文件--> 16 <link rel="stylesheet" type="text/css" href="bootstrap/css/bootstrap.min.css"> 17 <link rel="stylesheet" type="text/css" href="webuploader/webuploader.css"> 18 <script src="webuploader/webuploader.js"></script> 19 </head> 20 <body> 21 <div class="container"> 22 <div class="row"> 23 <div id="div1" class="col-md-8"> 24 <form id="tenantForm" method="post" action="tenant/add" class="form-horizontal" name="tenantaddform"> 25 <!-- strut2 spring mvc --> 26 <input name="formbean" value="cn.gzsxt.po.T_Tenant" type="hidden"> 27 <div class="form-group" id="companynameDiv"> 28 <label class="col-sm-2 control-label">公司名称</label> 29 <div class="col-md-5"> 30 <input id="companyname" type="text" placeholder="公司名称" name="companyname" class="form-control"> 31 </div> 32 <div class="col-md-4" id="companynameMsg"></div> 33 </div> 34 <div class="hr-line-dashed"></div> 35 <div class="form-group" id="managernameDiv"> 36 <label class="col-sm-2 control-label">法人姓名</label> 37 <div class="col-md-5"> 38 <input placeholder="法人姓名" class="form-control" id="managername" name="managername"> 39 </div> 40 <div class="col-md-4" id="managernameMsg"></div> 41 </div> 42 <div class="hr-line-dashed"></div> 43 <div class="form-group" id="phoneDiv"> 44 <label class="col-sm-2 control-label">手机号</label> 45 <div class="col-md-5"> 46 <input type="text" placeholder="手机号" name="phone" id="phone" maxlength="11" class="form-control"> 47 </div> 48 <div class="col-md-4" id="phoneMsg"></div> 49 </div> 50 <div class="hr-line-dashed"></div> 51 <div class="form-group" id="identityDiv"> 52 <label class="col-sm-2 control-label">身份证号</label> 53 <div class="col-md-5"> 54 <input type="text" placeholder="身份证号" name="identity" id="identity" class="form-control"> 55 </div> 56 <div class="col-md-4" id="identityMsg"></div> 57 </div> 58 <div class="hr-line-dashed"></div> 59 <div class="form-group"> 60 <!-- div id; inp ty --------> 61 <label class="col-sm-2 control-label">身份证正面</label> 62 <div class="col-sm-10"> 63 <div id="uploader" class="wu-example"> 64 <!--用来存放文件信息--> 65 <div id="thelist1" class="uploader-list"> 66 </div> 67 <div class="btns" id="idcard_id1"> 68 <div id="picker1">选择文件</div> 69 <!-- button如果不指定 type 为button 默认是submit --> 70 <button id="ctlBtn1" type="button" class="btn btn-default">开始上传</button> 71 </div> 72 </div> 73 <!-- 身份证正面隐藏域表单,value是图片上传成功以后的 地址 --> 74 <input type="hidden" id="identitypositive" name="identitypositive" /> 75 </div> 76 </div> 77 <div class="hr-line-dashed"></div> 78 <div class="form-group"> 79 <!-- div id; inp ty id na --------> 80 <label class="col-sm-2 control-label">身份证反面</label> 81 <div class="col-sm-10"> 82 <div id="uploader" class="wu-example"> 83 <!--用来存放文件信息--> 84 <div id="thelist2" class="uploader-list"></div> 85 <div class="btns" id="idcard_id2"> 86 <div id="picker2">选择文件</div> 87 <div> 88 <!-- 89 button如果不指定 type 为button 默认是submit 90 <button id="ctlBtn" class="btn btn-default">开始上传</button> --> 91 <button id="ctlBtn2" type="button" class="btn btn-default">开始上传</button> 92 </div> 93 <!-- 身份证反面隐藏域表单,value是图片上传成功以后的 地址 --> 94 <input type="hidden" id="identitynegative" name="identitynegative" /> 95 </div> 96 </div> 97 </div> 98 </div> 99 <div class="hr-line-dashed"></div> 100 <div class="form-group"> 101 <label class="col-sm-2 control-label">营业执照照片</label> 102 <div class="col-sm-10"> 103 <!-- div id; inp ty id na --------> 104 </div> 105 </div> 106 107 <div class="form-group"> 108 <div class="col-sm-4 col-sm-offset-2"> 109 <button class="btn btn-primary" type="submit">保存内容</button> 110 <button class="btn btn-white" type="submit">取消</button> 111 </div> 112 </div> 113 </form> 114 </div> 115 </div> 116 </div> 117 <script> 118 //身份证正面 119 jQuery(function() { 120 var list = $('#thelist1'), // thelist节点中添加文本 身份证正面 div添加 121 btn = $('#ctlBtn1'), // 文件上传按钮 身份证正面 文件上传按钮 122 state = 'pending',//当前文件的状态是等待上传状态 123 uploader; 124 //初始化 125 uploader = WebUploader.create({ //对上传的基本要求配置 126 // 不压缩image 127 resize: false, 128 // 文件接收服务端,上传该文件的服务器路径 129 server: "emp/upload", 130 // 选择文件的按钮。可选。 131 //需要上传的文件所在的div 132 pick: '#picker1' , 133 //只允许选择图片文件。 134 accept: { 135 title: 'Images', 136 extensions: 'jpg,jpeg,bmp,png,gif',//允许上传的文件的格式 137 mimeTypes: 'image/*' 138 }, 139 //允许上传的文件个数 140 fileNumLimit:2, 141 //单个文件最大的上传限制 1M 142 fileSingleSizeLimit : 1024 * 1024*5 // 5M 143 }); 144 // 当有文件添加进来的时候触发的函数 145 uploader.on( 'fileQueued', function(file) { 146 console.log(file.id) 147 //file.id表示添加进来的文件的编号(上传组件生成的) 148 //file.name 表示上传文件的原名称 149 list.append('<div id="' + file.id + '" class="item">' + 150 '<h4 class="info">' + file.name + '</h4>' + 151 '<p class="state">等待上传...</p>' + 152 '</div>' ); 153 }); 154 // 'uploadProgress':文件上传过程中创建进度条实时显示。这是结合Bootstrap控制的样式 155 // percentage 文件上传的百分比 156 //file 上传的文件对象,是上传组件创建的 157 uploader.on( 'uploadProgress', function( file,percentage){ 158 var li = $( '#'+file.id ), 159 //在$li 代表的节点查找 是否有 进度条的样式,如果有则$percent的长度大于0 否则等于0 160 percent=li.find('.progress .progress-bar'); 161 // 避免重复创建 162 if (!percent.length ) { 163 //追加一个进度条样式 164 percent = $('<div class="progress progress-striped active">' + 165 '<div class="progress-bar" role="progressbar" style=" 0%">' + 166 '</div>' + 167 '</div>').appendTo(li).find('.progress-bar'); 168 // $('<div class="progress progress-striped active">' + 169 // '<div class="progress-bar" role="progressbar" style=" 0%">' + 170 // '</div>' + 171 // '</div>').appendTo($li); 172 // $percent=$li.find('.progress-bar'); 173 } 174 li.find('p.state').text('上传中'); 175 percent.css( 'width', percentage * 100 + '%' ); 176 }); 177 //'uploadSuccess':文件上传成功后 触发的事件 触发一个回调函数 178 //response 表示服务器端返回的数据 179 //response:该对象封装了服务器端返回的数据,要取得返回的数据需要用到该对象的“_raw”属性 180 //writer.print(this.getDir() + newFileName); 181 uploader.on( 'uploadSuccess', function(file,response){ 182 // 上传的图片保存的相对位置(文件上传到服务器端之后保存的路径信息) 183 var idcard_url = response._raw; 184 $("#idcard_id1").append("<br><img src='"+idcard_url+"' style=' 150px;height: 150px' />"); 185 //将url 添加到 form表单的隐藏域中,方便最后提交信息的时候将文件的名称保存到数据库 186 $("#identitypositive").val(idcard_url); 187 $('#'+file.id ).find('p.state').text('已上传'); 188 }); 189 uploader.on( 'uploadError', function( file ) { 190 $( '#'+file.id ).find('p.state').text('上传出错'); 191 }); 192 uploader.on( 'uploadComplete', function( file ) { 193 $( '#'+file.id ).find('.progress').fadeOut(); 194 }); 195 uploader.on( 'all', function( type ) { 196 if ( type === 'startUpload' ) { 197 state = 'uploading'; 198 } else if ( type === 'stopUpload' ) { 199 state = 'paused'; 200 } else if ( type === 'uploadFinished' ) { 201 state = 'done'; 202 } 203 if ( state === 'uploading' ) { 204 btn.text('暂停上传'); 205 } else { 206 btn.text('开始上传'); 207 } 208 }); 209 //出错以后回调的函数 210 uploader.on("error",function(type){ 211 alert(type); 212 if(type == "F_EXCEED_SIZE"){ 213 layer.alert('最大只能上传1M文件', { 214 skin: 'layui-layer-molv' //样式类名 215 }); 216 } 217 }); 218 btn.on( 'click', function() { 219 if (state === 'uploading' ) { 220 uploader.stop(); 221 } else { 222 uploader.upload(); 223 } 224 }); 225 }); 226 //身份证反面 227 jQuery(function() { 228 var list = $('#thelist2'), // thelist节点中添加文本 身份证正面 div添加 229 btn = $('#ctlBtn2'), // 文件上传按钮 身份证正面 文件上传按钮 230 state = 'pending', 231 uploader; 232 //初始化 233 uploader = WebUploader.create({ 234 // 不压缩image 235 resize: false, 236 // 文件接收服务端路径。 237 server: "emp/upload", 238 // 选择文件的按钮。可选。 239 // 内部根据当前运行是创建,可能是input元素,也可能是flash. 240 //开始上传 按钮的id 241 pick: '#picker2', 242 // 只允许选择图片文件。 243 accept: { 244 title: 'Images', 245 extensions: 'jpg,jpeg,bmp,png', 246 mimeTypes: 'image/*' 247 }, 248 //允许上传的文件个数 249 fileNumLimit:2, 250 //单个文件最大的上传限制 1M 251 fileSingleSizeLimit : 5*1024 * 1024 // 1M 252 }); 253 // 当有文件添加进来的时候 254 uploader.on( 'fileQueued', function(file) { 255 list.append( '<div id="' + file.id + '" class="item">' + 256 '<h4 class="info">' + file.name + '</h4>' + 257 '<p class="state">等待上传...</p>' + 258 '</div>' ); 259 }); 260 // 文件上传过程中创建进度条实时显示。 261 uploader.on( 'uploadProgress', function( file, percentage ) { 262 var li = $( '#'+file.id ), 263 percent =li.find('.progress .progress-bar'); 264 // 避免重复创建 265 if (!percent.length ) { 266 percent = $('<div class="progress progress-striped active">' + 267 '<div class="progress-bar" role="progressbar" style=" 0%">' + 268 '</div>' + 269 '</div>').appendTo(li).find('.progress-bar'); 270 } 271 li.find('p.state').text('上传中'); 272 percent.css( 'width', percentage * 100 + '%' ); 273 }); 274 //文件上传成功后 触发的事件 触发一个回调函数 275 uploader.on( 'uploadSuccess', function( file,response) { 276 // 上传的图片保存的相对位置 277 var idcard_url = response._raw; 278 $("#idcard_id2").append("<img src='"+idcard_url+"' style=' 150px;height: 150px' />"); 279 //将url 添加到 form表单的隐藏域中 280 $("#identitynegative").val(idcard_url); 281 $( '#'+file.id ).find('p.state').text('已上传'); 282 }); 283 uploader.on( 'uploadError', function( file ) { 284 $( '#'+file.id ).find('p.state').text('上传出错'); 285 }); 286 uploader.on( 'uploading', function( file ) { 287 $( '#'+file.id ).find('p.state').text('上传中...'); 288 }); 289 uploader.on( 'uploadComplete', function( file ) { 290 $( '#'+file.id ).find('.progress').fadeOut(); 291 }); 292 uploader.on( 'all', function( type ) { 293 if ( type === 'startUpload' ) { 294 state = 'uploading'; 295 } else if ( type === 'stopUpload' ) { 296 state = 'paused'; 297 } else if ( type === 'uploadFinished' ) { 298 state = 'done'; 299 } 300 if ( state === 'uploading' ) { 301 btn.text('暂停上传'); 302 } else { 303 btn.text('开始上传'); 304 } 305 }); 306 //出错以后回调的函数 307 uploader.on("error",function(type){ 308 if(type == "F_EXCEED_SIZE"){ 309 layer.alert('最大只能上传1M文件', { 310 skin: 'layui-layer-molv' //样式类名 311 }); 312 } 313 }); 314 btn.on( 'click', function() { 315 if ( state === 'uploading' ) { 316 uploader.stop(); 317 } else { 318 uploader.upload(); 319 } 320 }); 321 }); 322 </script> 323 </body> 324 </html>
3.定义出对应需要使用到的 vo 类
public class Dept implements Serializable { private Integer id; private String name; public Dept(Integer id, String name) { this.id = id; this.name = name; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
public class Group { private Integer id;// 小组编号 private String name;// 小组名称 public Group(Integer id, String name) { super(); this.id = id; this.name = name; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
public class Member { private Integer id; private String name; private String sex; private String job; private Double sal; public Member(Integer id, String name, String sex, String job, Double sal) { this.id = id; this.name = name; this.sex = sex; this.job = job; this.sal = sal; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getJob() { return job; } public void setJob(String job) { this.job = job; } public Double getSal() { return sal; } public void setSal(Double sal) { this.sal = sal; } }
4.定义对应的服务端程序
1 @WebServlet("/ztree/*") 2 public class ZtreeServlet extends HttpServlet { 3 @Override 4 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 5 resp.setContentType("text/html;charset=utf-8"); 6 String pathInfo = req.getPathInfo(); 7 if ("/dept".equals(pathInfo)) { 8 this.getDeptList(req, resp); 9 } else if ("/group".equals(pathInfo)) { 10 this.getGroupByDid(req, resp); 11 } else if("/member".equals(pathInfo)) { 12 this.getMemberList(req, resp); 13 } 14 } 15 /** 16 * 取得部门列表信息 17 */ 18 public void getDeptList(HttpServletRequest req, HttpServletResponse resp) throws IOException { 19 List<Dept> list = new ArrayList<Dept>(); 20 list.add(new Dept(10, "市场部门")); 21 list.add(new Dept(20, "研发部门")); 22 list.add(new Dept(30, "运营部门")); 23 list.add(new Dept(40, "财务部门")); 24 resp.getWriter().println(JSON.toJSONString(list)); 25 } 26 /** 27 * 根据部门编号取得小组信息 28 */ 29 public void getGroupByDid(HttpServletRequest req, HttpServletResponse resp) throws IOException { 30 // 取得部门编号 31 Integer did = Integer.parseInt(req.getParameter("id")); 32 List<Group> list = new ArrayList<Group>(); 33 if (did == 10) { 34 list.add(new Group(1, "市场部第一组")); 35 list.add(new Group(2, "市场部第二组")); 36 } else if (did == 20) { 37 list.add(new Group(3, "研发部A组")); 38 list.add(new Group(4, "研发部B组")); 39 list.add(new Group(5, "研发部D组")); 40 } else if (did == 30) { 41 list.add(new Group(6, "运营部策划组")); 42 } 43 resp.getWriter().println(JSON.toJSONString(list)); 44 } 45 /** 46 * 根据小组编号取得成员列表 47 */ 48 public void getMemberList(HttpServletRequest req, HttpServletResponse resp) throws IOException { 49 Integer mid = Integer.parseInt(req.getParameter("id")); 50 List<Member> list=new ArrayList<>(); 51 switch (mid) { 52 case 1: 53 list.add(new Member(1001, "张三","男","总裁",5000.00)); 54 list.add(new Member(1002, "李四","女","总裁",5000.00)); 55 break; 56 case 2: 57 list.add(new Member(1003, "二蛋狗","男","总裁",5000.00)); 58 list.add(new Member(1004, "熊大","男","总裁",5000.00)); 59 list.add(new Member(1005, "熊二","女","总裁",5000.00)); 60 break; 61 case 3: 62 list.add(new Member(1006, "二蛋狗","男","总裁",5000.00)); 63 list.add(new Member(1007, "熊大","女","总裁",5000.00)); 64 break; 65 case 4: 66 list.add(new Member(1008, "王五","女","总裁",5000.00)); 67 list.add(new Member(1009, "赵六","女","总裁",5000.00)); 68 break; 69 case 5: 70 list.add(new Member(1010, "smith","女","总裁",5000.00)); 71 list.add(new Member(1011, "scott","男","总裁",5000.00)); 72 break; 73 case 6: 74 list.add(new Member(1010, "allen","女","总裁",5000.00)); 75 list.add(new Member(1011, "forwd","女","总裁",5000.00)); 76 break; 77 default: 78 break; 79 } 80 resp.getWriter().println(JSON.toJSONString(list)); 81 } 82 83 @Override 84 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 85 this.doGet(req, resp); 86 } 87 }