上期回顾
上篇文章菜单搭建的数据是定死的 。今天这篇文件在上篇菜单搭建的基础上进行优化 将数据从数据库中提取出来 显示在页面上 如下图所示
菜单搭建使用树控件搭建的 什么是树控件?树控件在web页面中一个将分层数据以树形结构进行显示。它提供用户展开、折叠、拖拽、编辑和异步加载等功能。
除了这一功能外 还增加了选项卡的功能
选项卡显示一批面板。但在同一个时间只会显示一个面板。每个选项卡面板都有头标题和一些小的按钮工具菜单,包括关闭按钮和其他自定义按钮。
选项卡的效果如下图所示:
主要实现的功能:当左侧菜单的子节点被点击时右侧创建选项卡 并根据数据库中子节点的路径显示对应的页面
具体代码如下:
index.jsp(主页面)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <link rel="stylesheet" href="${pageContext.request.contextPath}/easyui/themes/default/easyui.css"> <script rel="stylesheet" src="${pageContext.request.contextPath}/easyui/jquery.min.js"></script> <script rel="stylesheet" src="${pageContext.request.contextPath}/easyui/jquery.easyui.min.js"></script> </head> <body class="easyui-layout"> <div data-options="region:'north',title:'网站导航栏',collapsible:false" style="height: 100px;"></div> <div data-options="region:'west',title:'菜单',split:true" style="width: 20%;"> <ul id="asideMenu"></ul> </div> <div data-options="region:'center',collapsible:false,border:false" style="padding: 5px; background: #eee;"> <div id="mainTab" class="easyui-tabs" style="width: 100%; height: 100%;"></div> </div> <script> let mainTab = $('#mainTab') $('#asideMenu').tree({ url: '${pageContext.request.contextPath}/permission.do', //远程数据的地址 method: "POST",//访问方式 lines: true, //显示虚线 onClick(node) { //判断是否是父节点 if (!node.attributes['pid']) { return } //判断是不是已经打开了 if(mainTab.tabs('exists',node.text)){ mainTab.tabs('select',node.text) return } mainTab.tabs('add', { closable:true, id:node.id, title: node.text, //content:"<iframe src='"+node.attributes['url']+"'></iframe>" href:node.attributes['url'] }); } }); </script> </body> </html>
PermissionServlet.java
package com.zking.servlet; import java.io.IOException; 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 com.fasterxml.jackson.databind.ObjectMapper; import com.zking.biz.IPermissionBiz; import com.zking.biz.impl.PermissionBizImpl; @WebServlet("/permission.do") public class PermissionServlet extends HttpServlet{ private IPermissionBiz permissionBiz=new PermissionBizImpl(); private ObjectMapper mapper=new ObjectMapper(); @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //查询所有的菜单,将菜单写出去 mapper.writeValue(resp.getOutputStream(), permissionBiz.listNodes()); } }
TreeFactory.java
package com.zking.util; import java.util.Arrays; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; @SuppressWarnings("all") public class TreeFactory { public static List<TreeNode> buildList(List<TreeNode> nodeList) { List<TreeNode> list = buildList(nodeList, "0"); TreeNode root; if (!list.isEmpty()) { return list; } else { root = new TreeNode(); root.setId("000"); root.setParentId("-1"); root.setHasParent(false); root.setHasChildren(true); root.setChecked(true); root.setChildren(list); root.setText("主菜单"); root.setState("closed"); } return Arrays.asList(root); } public static List<TreeNode> buildList(List<TreeNode> nodeList, String topMenuId) { return Optional.ofNullable(nodeList).map(list -> { list.forEach(item -> { list.stream().filter(i -> { return i.getId().equals(item.getParentId()); }).forEach(i -> { i.setHasChildren(Boolean.TRUE); i.getChildren().add(item); }); }); return list.stream().filter(i -> { return i.getParentId().equals(topMenuId); }).collect(Collectors.toList()); }).get(); } }
TreeNode.java
package com.zking.util; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class TreeNode { private String id; private String text; private String state; private Boolean checked = false; private Map<String, Object> attributes=new HashMap<>(); private List<TreeNode> children = new ArrayList<>(); private String parentId; private Boolean hasParent = false; private Boolean hasChildren = false; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getText() { return text; } public void setText(String text) { this.text = text; } public String getState() { return state; } public void setState(String state) { this.state = state; } public Boolean getChecked() { return checked; } public void setChecked(Boolean checked) { this.checked = checked; } public Map<String, Object> getAttributes() { return attributes; } public void setAttributes(Map<String, Object> attributes) { this.attributes = attributes; } public List<TreeNode> getChildren() { return children; } public void setChildren(List<TreeNode> children) { this.children = children; } public String getParentId() { return parentId; } public void setParentId(String parentId) { this.parentId = parentId; } public Boolean getHasParent() { return hasParent; } public void setHasParent(Boolean hasParent) { this.hasParent = hasParent; } public Boolean getHasChildren() { return hasChildren; } public void setHasChildren(Boolean hasChildren) { this.hasChildren = hasChildren; } public TreeNode(String id, String text, String state, Boolean checked, Map<String, Object> attributes, List<TreeNode> children, String parentId, Boolean hasParent, Boolean hasChildren) { super(); this.id = id; this.text = text; this.state = state; this.checked = checked; this.attributes = attributes; this.children = children; this.parentId = parentId; this.hasParent = hasParent; this.hasChildren = hasChildren; } public TreeNode() { // TODO Auto-generated constructor stub } @Override public String toString() { return "TreeNode [id=" + id + ", text=" + text + ", state=" + state + ", checked=" + checked + ", attributes=" + attributes + ", children=" + children + ", parentId=" + parentId + ", hasParent=" + hasParent + ", hasChildren=" + hasChildren + "]"; } }
DBHelper.java
package com.zking.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; /** * 数据库驱动类 * @author zjjt * */ public class DBHelper { //定义链接字符串 private static final String URL = "jdbc:oracle:thin:@localhost:1521:orcl"; //加载驱动 static { try { Class.forName("oracle.jdbc.driver.OracleDriver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } //获得链接 public static Connection getCon() { try { return DriverManager.getConnection(URL, "scott", "123123"); } catch (SQLException e) { e.printStackTrace(); } return null; } //关闭资源 public static void close(Connection con, PreparedStatement ps, ResultSet rs) { try { if (con != null && !con.isClosed()) { con.close(); } if (ps != null) { ps.close(); } if (rs != null) { rs.close(); } } catch (Exception e) { e.printStackTrace(); } } }
Permission.java
package com.zking.pojo; public class Permission { private Integer id; private Integer pid; private String text; private String url; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Integer getPid() { return pid; } public void setPid(Integer pid) { this.pid = pid; } public String getText() { return text; } public void setText(String text) { this.text = text; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public Permission(Integer id, Integer pid, String text, String url) { super(); this.id = id; this.pid = pid; this.text = text; this.url = url; } public Permission() { // TODO Auto-generated constructor stub } @Override public String toString() { return "Permission [id=" + id + ", pid=" + pid + ", text=" + text + ", url=" + url + "]"; } }
IPermissionDao .java
package com.zking.dao; import java.util.List; import com.zking.pojo.Permission; import com.zking.util.TreeNode; public interface IPermissionDao { List<Permission>list(); List<TreeNode>listNodes(); }
PermissionDaoImpl.java
package com.zking.dao.impl; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import java.util.List; import com.zking.dao.IPermissionDao; import com.zking.pojo.Permission; import com.zking.util.DBHelper; import com.zking.util.TreeFactory; import com.zking.util.TreeNode; public class PermissionDaoImpl implements IPermissionDao{ private Connection con; private PreparedStatement ps; private ResultSet rs; /** * 查询所有permission * @return */ public List<Permission> list() { List<Permission> list = new ArrayList<Permission>(); try { con = DBHelper.getCon(); ps = con.prepareStatement("select * from bs_permission"); rs = ps.executeQuery(); while (rs.next()) { Permission permission = new Permission(); permission.setId(rs.getInt(1)); permission.setPid(rs.getInt(2)); permission.setText(rs.getString(3)); permission.setUrl(rs.getString(4)); list.add(permission); } } catch (Exception e) { e.printStackTrace(); } finally { DBHelper.close(con, ps, rs); } return list; } public List<TreeNode> listNodes() { List<TreeNode> nodes = new ArrayList<TreeNode>(); //数据库中 List<Permission> list = list(); //将permission封装成node for (Permission permission : list) { TreeNode node = new TreeNode(); node.setId(String.valueOf(permission.getId())); node.setParentId(String.valueOf(permission.getPid())); node.setText(permission.getText()); //把pid放到自定义属性中 node.getAttributes().put("pid",permission.getPid()); //把url放到自定义属性中 node.getAttributes().put("url",permission.getUrl()); nodes.add(node); } return TreeFactory.buildList(nodes, "0"); } }
IPermissionBiz.java
package com.zking.biz; import java.util.List; import com.zking.pojo.Permission; import com.zking.util.TreeNode; public interface IPermissionBiz { List<Permission>list(); List<TreeNode>listNodes(); }
PermissionBizImpl.java
package com.zking.biz.impl; import java.util.List; import com.zking.biz.IPermissionBiz; import com.zking.dao.IPermissionDao; import com.zking.dao.impl.PermissionDaoImpl; import com.zking.pojo.Permission; import com.zking.util.TreeNode; public class PermissionBizImpl implements IPermissionBiz{ private IPermissionDao permissionDao=new PermissionDaoImpl(); @Override public List<Permission> list() { return permissionDao.list(); } @Override public List<TreeNode> listNodes() { return permissionDao.listNodes(); } }
数据库建表语句
CREATE TABLE bs_permission
(
id number DEFAULT NULL,
pid number DEFAULT NULL,
text varchar2(10) DEFAULT NULL,
url varchar2(255) DEFAULT NULL
);
create sequence seq_permission;
insert into bs_permission values(seq_permission.nextval,0,'会员管理','');
insert into bs_permission values(seq_permission.nextval,0,'商品管理','');
insert into bs_permission values(seq_permission.nextval,0,'订单管理','');
insert into bs_permission values(seq_permission.nextval,0,'数据报表','');
insert into bs_permission values(seq_permission.nextval,0,'系统管理','');
insert into bs_permission values(seq_permission.nextval,2,'会员卡充值','recharge.jsp');
insert into bs_permission values(seq_permission.nextval,2,'会员等级','level.jsp');
insert into bs_permission values(seq_permission.nextval,3,'状态管理','state.jsp');
insert into bs_permission values(seq_permission.nextval,3,'类目管理','topic.jsp');
insert into bs_permission values(seq_permission.nextval,3,'评论管理','comment.jsp');
select * from bs_permission;
commit
根据数据库定的路径建好页面
今天的分享就要这结束啦!!✌
以上就是关于easyui Tree后端工作的一些内容!!📖
期待下次再见!!😊