15-EasyUI尚硅谷 - tree(增删改查和后台同步,实际开发中要修改一下细节)

在前一节的基础上操作:

效果:

 

新增

 

修改

 

删除

     

代码:

ResourceServlet.java:

package sxt.easyui.servlet;

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.json.JSONArray;
import sxt.easyui.model.Resource;
import sxt.easyui.model.TreeDTO;
import sxt.easyui.util.DBHelper;

// 资源Servlet
@SuppressWarnings("serial")
public class ResourceServlet extends HttpServlet {
	
	private Connection conn = null;
	private PreparedStatement ps = null;
	private ResultSet rs = null;

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		this.doPost(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		String method = req.getParameter("method");
		if ("loadTree".equals(method)) {
			this.loadTree(req, resp);
		} else if ("changeNode".equals(method)) {
			this.changeNode(req, resp);
		} else if ("addResource".equals(method)) {
			this.addResource(req, resp);
		} else if ("editResource".equals(method)) {
			this.editResource(req, resp);
		} else if ("deleteResource".equals(method)) {
			try {
				this.deleteResourcesById(req, resp);
			} catch (Exception e) {
				e.printStackTrace();
			}
		} else {
			try {
				throw new Exception("请求失败!");
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	// 根据id删除node
	private void deleteResourcesById(HttpServletRequest req, HttpServletResponse resp) throws Exception {
		// 要删除的节点id
		String id = req.getParameter("id");
		int nodeId = id==null ? -1 : Integer.parseInt(id);
		
		if (nodeId > 0) {
			deleteResourceById(req, resp, nodeId);
			// 输出
			String result = "{\"status\":\"操作成功!\"}";		
			resp.setContentType("text/html;charset=utf-8");
			resp.getWriter().write(result);
		} else {
			// 删除失败
			String result = "{\"status\":\"操作失败!\"}";			
			resp.setContentType("text/html;charset=utf-8");
			resp.getWriter().write(result);
		}
	}
	
	// 递归删除所有子节点
	public void deleteResourceById(HttpServletRequest req, HttpServletResponse resp, int id) throws Exception {
		List<Resource> resources = this.getChildrenByParentId(id);
		for (Resource cNode : resources) {
			int cid = cNode.getId();
			this.delete(cid);	// 删了当前的孩子
			// 继续查看当前被删的孩子还有没有孩子,有就继续删除
			deleteResourceById(req, resp, cid);
		}
		this.delete(id);		// 没有孩子,就把它自己删了
	}
	
	// 执行删除操作
	public void delete(int id) throws Exception {
		String sql = "DELETE FROM resource WHERE id=?";
		conn = DBHelper.getConn();
		ps = DBHelper.prepare(conn, sql);
		ps.setInt(1, id);
		ps.executeUpdate();
	}

	// 编辑权限
	private void editResource(HttpServletRequest req, HttpServletResponse resp) {
		String id = req.getParameter("id");
		String name = req.getParameter("name");
		String url = req.getParameter("url");
		
		String result = "{\"status\":\"提示信息\", \"message\":\"操作失败!\"}";		
		try {
			String sql = "UPDATE resource SET name=?, url=? WHERE id=?";
			conn = DBHelper.getConn();
			ps = DBHelper.prepare(conn, sql);
			ps.setString(1, name);
			ps.setString(2, url);
			ps.setString(3, id);
			int count = ps.executeUpdate();
			if (count == 1) {
				result = "{\"status\":\"提示信息\", \"message\":\"操作成功!\"}";		
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				resp.setContentType("text/html;charset=utf-8");
				resp.getWriter().write(result);
				
				DBHelper.close(ps);
				DBHelper.close(conn);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	// 新增权限
	private void addResource(HttpServletRequest req, HttpServletResponse resp) {
		
		String name = req.getParameter("name");
		String url = req.getParameter("url");
		String parentId = req.getParameter("parentId");
		
		// {"status":"提示信息", "message":"操作失败!"}
		String result = "{\"status\":\"提示信息\", \"message\":\"操作失败!\"}";		
		try {
			String sql = "INSERT INTO resource(name,url,parent_id) VALUES(?,?,?)";
			conn = DBHelper.getConn();
			ps = DBHelper.prepare(conn, sql);
			ps.setString(1, name);
			ps.setString(2, url);
			ps.setString(3, parentId);
			int count = ps.executeUpdate();
			if (count == 1) {
				result = "{\"status\":\"提示信息\", \"message\":\"操作成功!\"}";		
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				resp.setContentType("text/html;charset=utf-8");
				resp.getWriter().write(result);
				
				DBHelper.close(ps);
				DBHelper.close(conn);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	// 节点拖拽
	private void changeNode(HttpServletRequest req, HttpServletResponse resp) {
		String targetId = req.getParameter("targetId");
		String sourceId = req.getParameter("sourceId");
		
		String result = "{\"status\":\"success\"}";
		try {
			String sql = "UPDATE resource SET parent_id=? WHERE id=?";
			conn = DBHelper.getConn();
			ps = DBHelper.prepare(conn, sql);
			ps.setString(1, targetId);
			ps.setString(2, sourceId);
			int count = ps.executeUpdate();
			
			if (count != 1) {	// 操作失败
				result = "{\"status\":\"error\"}";
			}
			
			resp.setContentType("text/html;charset=utf-8");
			resp.getWriter().write(result);
			
		} catch (Exception e) {
			result = "{\"status\":\"error\"}";
			resp.setContentType("text/html;charset=utf-8");
			try {
				resp.getWriter().write(result);
			} catch (IOException e1) {
				e1.printStackTrace();
			}
			e.printStackTrace();
		} finally {
			DBHelper.close(ps);
			DBHelper.close(conn);
		}
	}

	// 根据id获取子节点
	private void loadTree(HttpServletRequest req, HttpServletResponse resp) {
		// 获取当前展开的节点id
		String id = req.getParameter("id");
		// 判断id
		if (id == null || "".equals(id)) {
			id = "999999";	// 对应数据库的根节点id
		} 
		try {
			List<TreeDTO> tList = this.getChildrenByParentId(id);
			resp.setContentType("text/html;charset=utf-8");
			resp.getWriter().write(JSONArray.fromObject(tList).toString());
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	// 根据父节点id获取所有子节点
	private List<TreeDTO> getChildrenByParentId(String id) {
		List<TreeDTO> tList = new ArrayList<TreeDTO>();
		List<Resource> rList = new ArrayList<Resource>();
		try {
			String sql = "SELECT * FROM resource WHERE parent_id=?";
			conn = DBHelper.getConn();
			ps = DBHelper.prepare(conn, sql);
			ps.setString(1, id);
			rs = ps.executeQuery();
			while (rs.next()) {
				Resource resource = new Resource();
				resource.setId(rs.getInt("id"));
				resource.setName(rs.getString("name"));
				resource.setChecked(rs.getInt("checked"));
				resource.setIcon(rs.getString("icon"));
				resource.setUrl(rs.getString("url"));
				resource.setParentId(rs.getInt("parent_id"));
				
				rList.add(resource);
			}
			if (rList != null && rList.size() > 0) {
				for (Resource resource : rList) {
					TreeDTO treeDTO = new TreeDTO();
					
					treeDTO.setId(resource.getId());
					treeDTO.setText(resource.getName());
					treeDTO.setChecked(resource.getChecked());
					treeDTO.setIconCls(resource.getIcon());
					
					Map<String, Object> map = new HashMap<String, Object>();
					map.put("url", resource.getUrl());
					treeDTO.setAttributes(map);
					
					// 有孩子节点就关闭(closed),否则就打开(open)
					List<Resource> resources = this.getChildrenByParentId(resource.getId());
					if (resources.size() > 0) {
						treeDTO.setState("closed");
					} else {
						treeDTO.setState("open");
					}
					
					tList.add(treeDTO);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			DBHelper.close(rs);
			DBHelper.close(ps);
			DBHelper.close(conn);
		}
		return tList;
	}

	// 获取所有孩子节点(其实和getChildrenById方法一样)
	private List<Resource> getChildrenByParentId(int parentId) {
		List<Resource> resources = new ArrayList<Resource>();
		try {
			conn = DBHelper.getConn();
			String sql = "SELECT * FROM resource WHERE parent_id=?";
			ps = DBHelper.prepare(conn, sql);
			ps.setInt(1, parentId);
			rs = ps.executeQuery();
			while (rs.next()) {
				Resource resource = new Resource();
				resource.setId(rs.getInt("id"));
				resource.setName(rs.getString("name"));
				resource.setChecked(rs.getInt("checked"));
				resource.setIcon(rs.getString("icon"));
				resource.setUrl(rs.getString("url"));
				resource.setParentId(rs.getInt("parent_id"));
				
				resources.add(resource);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return resources;
	}
}

014_tree_curd.jsp.java:

<%@ page language="java" import="java.util.*" 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">
<html>
<head>
<base href="<%=basePath%>">

<title>Tree_CRUD</title>

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">

<link rel="stylesheet" type="text/css" href="js/jquery-easyui-1.2.6/themes/default/easyui.css">
<link rel="stylesheet" type="text/css" href="js/jquery-easyui-1.2.6/themes/icon.css">
<script type="text/javascript" src="js/jquery-easyui-1.2.6/jquery-1.7.2.min.js"></script>
<script type="text/javascript" src="js/jquery-easyui-1.2.6/jquery.easyui.min.js"></script>
<script type="text/javascript" src="js/jquery-easyui-1.2.6/locale/easyui-lang-zh_CN.js"></script>

<script type="text/javascript">

	var flag;	// 编辑还是保存

	$(function() {
		$("#t2").tree({
			url: "ResourceServlet?method=loadTree",
			//animate: true,
			checkbox: true,
			dnd: true,
			// 拖拽,后台同步, target:要把节点拖拽到那个节点里,是DOM元素;source:被拖拽的节点,是js对象;point:操作范方式,append,top,bottom
			onDrop: function(target, source, point) {	
				var target = $("#t2").tree("getNode", target);		// 把DOM元素转换成js对象
				var targetId = target.id;		// 目标节点id
				var sourceId = source.id;		// 被拖拽的节点id
				
				var url = "ResourceServlet?method=changeNode";
				var args = {"time": new Date(), "targetId": targetId, "sourceId": sourceId};
				$.post(url, args, function(result) {
					// 如果错误就提示,成功就什么也不做, 失败:{"status":"error"}
					var jsonObj = $.parseJSON(result);
					if (jsonObj.status == "error") {
						$.messager.alert("提示信息", "操作失败!", "error", function() {
							// 恢复数据到操作前
						});
					} else {
						$.messager.show({
							title: "提示信息",
							msg: "操作成功!"
						});
					}
				});
			},
			// 菜单事件, e: 右键的事件对象, node: 被右键的节点元素(DOM)
			onContextMenu: function(e, node) {	
				e.preventDefault();		// 阻止浏览器右键的菜单事件
				$(this).tree("select", node.target);	// 右键时选中该节点
				$("#menu").menu("show", {
					left: e.pageX,		// 菜单出现在右键的位置上
					top: e.pageY
				});
			}
		});
		// 新增权限窗口
		$("#resourceDiv").dialog({
			title: "设置权限",
			width: 330,
			height: 190,
			closed: true,
			modal: true,
			draggable: false
		});
		// 表单数据校验
		$("#resourceTable input=[name='name']").validatebox({
			required: true,
			missingMessage: "权限名称必填!"
		});
		$("#resourceTable input=[name='url']").validatebox({
			required: true,
			missingMessage: "权限URL必填!"
		});
		// 新增权限提交
		$("#saveBtn").click(function() {
			resourceFormSubmit();
		});
		// 回车提交表单
        $("#resourceForm").find("input").on("keyup", function(event) { 
            if (event.keyCode == 13) {
            	resourceFormSubmit();
            }
        });
		// 关闭新增权限窗口
		$("#cancelBtn").click(function() {
			// 关闭窗口
			$("#resourceDiv").dialog("close");
		});
	});
	// 菜单事件
	function append() {
		flag = "add";
		// 清空表单
		$("#resourceForm").find("input").val("");
		// 打开新增权限窗口
		$("#resourceDiv").dialog("open");
		$("#resourceTable input[name='name']").focus();
	}
	function edit() {
		flag = "edit";
		// 清空表单
		$("#resourceForm").form("clear");
		// 重新加载表单数据
		var node = $("#t2").tree("getSelected");
		$("#resourceForm").form("load", {
			id: node.id,
			name: node.text,
			url: node.attributes.url
		});
		// 打开编辑窗口
		$("#resourceDiv").dialog("open");
	}
	function remove() {
		$.messager.confirm("提示信息", "<center>确定删除吗?<br/><font color='red'>(若有子节点,也将删除其所有子节点)</font></center>", function(r) {
			if (r) {	// 删除
				// 前台删除
				var node = $("#t2").tree("getSelected");
				var id = node.id;
				$("#t2").tree("remove", node.target);
				
				// 后台删除
				var url = "ResourceServlet?method=deleteResource";
				var args = {"time": new Date(), "id": id};
				$.post(url, args, function(result) {
					var jsonObj = $.parseJSON(result);
					$.messager.show({	// {"status": "操作成功!"}、{"status": "操作失败!"}
						title: "提示信息",
						msg: jsonObj.status
					});
				});
			} 
		});
	}
	// 提交新增权限表单
	function resourceFormSubmit() {
		// 获取被右键的节点id,将其作为即将添加的节点的父id
		var node = $("#t2").tree("getSelected");
		
		if (flag == "add") {	// 新增
			if ($("#resourceForm").form("validate")) {
				// 前台更新
				$("#t2").tree("append", {	// 调用tree的append方法更新前台数据,相当于刷新
					parent: node.target,
					data: [{
						text: $("#resourceForm input[name='name']").val(),
						attributes: {
							url: $("#resourceForm input[name='url']").val()
						}
					}]
				});
				
				// 后台更新
				$.ajax({
					type: "post",
					url: "ResourceServlet?method=addResource",
					data: {
						"parentId": node.id,
						"name": $("#resourceForm input[name='name']").val(),
						"url": $("#resourceForm input[name='url']").val()
					},
					dataType: "text",
					cache: false,
					success: function(result) {		// {"status":"提示信息", "message":"操作成功!"}
						$("#resourceDiv").dialog("close");	// 关闭窗口
						
						// 刷新节点 (如果这里不更新节点,新增加的节点就不会有id,当再次在新添加的节点上添加新的节点时就会没有parentId,后台报错,数据库插不进数据)
						var parent = $("#t2").tree("getParent" , node.target);
						$("#t2").tree("reload", parent.target);
						
						var result = $.parseJSON(result);
						$.messager.show({
						    title: result.status,
						    msg: result.message
						});
					},
					error: function(result) {		// {"status":"提示信息", "message":"操作失败!"}
						var result = $.parseJSON(result);
						$.messager.show({
						    title: result.status,
						    msg: result.message
						});
					}
				});
			} else {	
				$.messager.show({
					title: "提示信息",
					msg: "校验没有通过,不能提交表单!"
				});
				return false;	// 阻止表单提交
			}
		} else {	// 修改
			if ($("#resourceForm").form("validate")) {
				// 后台更新
				$.ajax({
					type: "post",
					url: "ResourceServlet?method=editResource",
					data: {
						"id": node.id,
						"name": $("#resourceForm input[name='name']").val(),
						"url": $("#resourceForm input[name='url']").val()
					},
					dataType: "text",
					cache: false,
					success: function(result) {		// {"status":"提示信息", "message":"操作成功!"}
						$("#resourceDiv").dialog("close");	// 关闭窗口
						
						// 刷新节点 (如果这里不更新节点,新增加的节点就不会有id,当再次在新添加的节点上添加新的节点时就会没有parentId,后台报错,数据库插不进数据)
						var parent = $("#t2").tree("getParent" , node.target);
						$("#t2").tree("reload", parent.target);
						
						var result = $.parseJSON(result);
						$.messager.show({
						    title: result.status,
						    msg: result.message
						});
					},
					error: function(result) {		// {"status":"提示信息", "message":"操作失败!"}
						var result = $.parseJSON(result);
						$.messager.show({
						    title: result.status,
						    msg: result.message
						});
					}
				});
			} else {
				$.messager.show({
					title: "提示信息",
					msg: "校验没有通过,不能提交表单!"
				});
				return false;	// 阻止表单提交
			}
		}
		
	}
</script>
</head>

<body>
	<ul id="t2"></ul>
	<!-- 右键菜单 -->
	<dir id="menu" class="easyui-menu" style="width: 150px;">
		<div onclick="append();" iconCls="icon-add">Append</div>
		<div onclick="edit();" iconCls="icon-edit">Edit</div>
		<div onclick="remove();" iconCls="icon-remove">Remove</div>
	</dir>
	<!-- append菜单 -->
	<div id="resourceDiv" class="easyui-dialog">
		<form id="resourceForm" action="" method="post">
			<input type="hidden" name="id"/>
			<table id="resourceTable" cellspacing="7px;" style="padding: 15px;">
				<tr>
					<td>权限名称:</td>
					<td><input type="text" name="name" style="width: 180px;"/></td>
				</tr>
				<tr>
					<td>权限地址:</td>
					<td><input type="text" name="url" style="width: 180px;"/></td>
				</tr>
				<tr>
					<td colspan="2" align="right">
						<a id="saveBtn" class="easyui-linkbutton" style="margin-top: 10px;">确定</a>
						<a id="cancelBtn" class="easyui-linkbutton" style="margin-top: 10px;">取消</a>
					</td>
				</tr>
			</table>
		</form>
	</div>
</body>
</html>

 

posted @ 2017-08-03 23:25  半生戎马,共话桑麻、  阅读(381)  评论(0)    收藏  举报
levels of contents