谁会做zTree。 树菜单选中保存进ztree获取数据库数据。下次加载树菜单打开时,还是显

ztree中的树形菜单有多选的即有单选的_百度知道1606人阅读
&&& 在做权限系统的时候,需要有一个树形的菜单。下图就是一个树形菜单的样式
&&& 但问题是,我们可以实现写死的树形菜单。什么是写死的?就是在前台代码中写好要加载的树形菜单是什么样子的。但是我们权限系统的要求是动态加载树形菜单,也就是根据数据库里面表的内容动态加载。
&&& 我首先要说的就是数据库设计,要想动态加载成树形菜单,数据库表中就一定要设置父节点ID和自身ID。通过父节点ID判断自身是属于哪一级菜单,而通过自身ID判断其对应的下一级菜单。这是数据库设计应该注意的地方,如果没有父节点和自身子节点,那么就没办法实现动态加载树形菜单。
&&& 动态加载树形菜单的实现利用的zTree。这里顺便提一下,zTree的网站做的真的很好,而且各种类型的zTree做的非常完美。我就是利用zTree来实现的,只不过与之不同的是zTree实现的树菜单也是在前台写好的,我们要做的就是将后台用数据库查询到的代码拼接成前台已经写好的代码格式。
&&& 这是前台写好的树菜单格式:
&&& 我们要做的就是将前台这种树形菜单格式在后台拼出来,而在树形菜单中显示的菜单名称是从数据库中查询出来的。最开始的时候尝试拼JSON串,但是事实证明,我失败了,拼出来的字符串运行的时候根本显示不出来
&&&&拼出的JSON串跟咱们要拼接的格式是不同的,JSON串拼接出来的格式适用于结构比较简单,这样利用循环可以将需要的字符串拼接出来。而我们需要的字符串是需要判断下一级是否有子节点的,这个利用JSON串我没有实现,只能实现一级菜单,而对应的实现三级菜单我没有拼出来。很遗憾,但是利用循环、遍历和DataTable的查询,最终实现了树形菜单字符串的拼接。下面是我实现的代码
&&& 这个对应的实现二级菜单的拼接
public string getTree(string strTree)
string Chilstr = &&;
//获取DataTable
zTreeBLL zTree = new zTreeBLL();
DataTable dt = new DataTable();
dt = zTree.QueryResource();
//查询父节点有多少条不重复的数据
zTreeBLL zTree1 = new zTreeBLL();
DataTable dt1 = new DataTable();
dt1 = zTree1.QueryParidNum();
//父节点只能加到4
//for (int p = 0; p & Convert.ToInt32(dt1.Rows[0][0]); p++)
//Convert.ToInt32强制转换字符,把Object类型转换成int
int parentId = 0;
//查找第一个父节点有多少个,即初值为0的父节点
DataRow[] rowsP = dt.Select(&ParentID=& + parentId);
//利用循环将父节点拼接起来
for (int i = 0; i & rowsP.L i++)
//把rowsP里面的数值取出来
foreach (DataRow drP in rowsP)
string parName = drP[&ResourceName&].ToString();
//strTree = &[{name:\&&+ parName + &\&&;
strTree = &[{name:\&& + parName + &\&&;
DataRow[] rowsC = dt.Select(&ParentID=& + parentId + 1);
if (rowsC.Length & 0)
//如果子节点不为0,则开始拼接子节点的字符串
//利用循环将父节点对应下的子节点串起来
foreach (DataRow drC in rowsC)
string chilName = drC[&ResourceName&].ToString();
Chilstr = Chilstr + &{name:\&& + chilName + &\&}&;
Chilstr = Chilstr + &,&;
Chilstr = Chilstr.Remove(Chilstr.LastIndexOf(&,&), 1);
strTree = strTree + &,children:[& + Chilstr + &]}];&;
strTree = strTree + &\&}];&;
parentId++;
return strT
&&& 这个对应的是多级菜单的拼接
public string getTree(string strTree)
string Chilstr = &&;
//获取DataTable
zTreeBLL zTree = new zTreeBLL();
DataTable dt = new DataTable();
dt = zTree.QueryResource();
//查询父节点有多少条不重复的数据
zTreeBLL zTree1 = new zTreeBLL();
DataTable dt1 = new DataTable();
dt1 = zTree1.QueryParidNum();
//父节点只能加到4
//for (int p = 0; p & Convert.ToInt32(dt1.Rows[0][0]); p++)
//Convert.ToInt32强制转换字符,把Object类型转换成int
int parentId = 0;
//查找第一个父节点有多少个,即初值为0的父节点
DataRow[] rowsP = dt.Select(&ParentID=& + parentId);
//利用循环将父节点拼接起来
for (int i = 0; i & rowsP.L i++)
//把rowsP里面的数值取出来
foreach (DataRow drP in rowsP)
string parName = drP[&ResourceName&].ToString();
//strTree = &[{name:\&&+ parName + &\&&;
strTree = &[{name:\&& + parName + &\&&;
DataRow[] rowsC = dt.Select(&ParentID=& + parentId + 1);
if (rowsC.Length & 0)
//如果子节点不为0,则开始拼接子节点的字符串
//利用循环将父节点对应下的子节点串起来
foreach (DataRow drC in rowsC)
string Threestr = &&;
//判断二级菜单下对应的ID,也就是查找三级菜单的ParentID
string chilFollow = drC[&ID&].ToString();
//查询三级菜单
DataRow[] rowsThree = dt.Select(&ParentID=& + chilFollow);
//判断是否存在三级菜单
if (rowsThree.Length & 0)
foreach (DataRow drThree in rowsThree)
string ThreeName = drThree[&ResourceName&].ToString();
Threestr = Threestr + &{name:\&&+ThreeName+&\&}&;
Threestr = Threestr + &,&;
Threestr = Threestr.Remove(Threestr.LastIndexOf(&,&), 1);
string chilName = drC[&ResourceName&].ToString();
Chilstr = Chilstr + &{name:\&& + chilName + &\&,children:[&+Threestr+&]},&;
//如果不存在三级菜单的话直接加载二级菜单
string chilName = drC[&ResourceName&].ToString();
Chilstr = Chilstr + &{name:\&& + chilName + &\&}&;
Chilstr = Chilstr + &,&;
Chilstr = Chilstr.Remove(Chilstr.LastIndexOf(&,&), 1);
strTree = strTree + &,children:[& + Chilstr + &]}];&;
strTree = strTree + &\&}];&;
return strT
&&&& 最终实现的效果
&&& 其实实现这个例子的方法还有很多种,比如说递归。虽然JSON串没有拼接成功,但是我觉得JSON串是可以实现的。只是鉴于个人能力的缘故最终没有拼接成功。动态加载树形菜单终于实现的,但是还有很多需要改进的地方,比如如何将这个方法封装起来,以至于可以无限的调用没有缺陷等,这是下一步值得继续探讨的问题。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:159571次
积分:5170
积分:5170
排名:第3685名
原创:122篇
评论:1571条
(1)(4)(1)(2)(5)(2)(4)(2)(1)(4)(3)(4)(4)(4)(5)(6)(4)(4)(3)(4)(4)(3)(4)(3)(3)(2)(2)(3)(2)(1)(1)(3)(2)(4)(5)(3)(2)(3)(3)(3)(2)(4)MenuDemo ztree 树形结构菜单
数据库备份文件在项目里面 View 238万源代码下载-
&文件名称: MenuDemo
& & & & &&]
&&所属分类:
&&开发工具: Java
&&文件大小: 716 KB
&&上传时间:
&&下载次数: 6
&&提 供 者:
&详细说明:ztree 树形结构菜单
数据库备份文件在项目里面-ztree
文件列表(点击判断是否您需要的文件,如果是垃圾请在下面评价投诉):
&&MenuDemo\.classpath&&........\.mymetadata&&........\.project&&........\.settings\.jsdtscope&&........\.........\com.genuitec.eclipse.j2eedt.core.prefs&&........\.........\org.eclipse.jdt.core.prefs&&........\.........\org.eclipse.wst.jsdt.ui.superType.container&&........\.........\org.eclipse.wst.jsdt.ui.superType.name&&........\src\com\shyy\menu\dao\JDBCDao.java&&........\...\...\....\....\...\MenuDao.java&&........\...\...\....\....\entitys\Menu.java&&........\...\...\....\....\servlet\MenuServlet.java&&........\...\...\....\....\test\testMenuDao.java&&........\WebRoot\a.html&&........\.......\admin_index_top.jsp&&........\.......\css\demo.css&&........\.......\...\zTreeStyle\img\diy\1_close.png&&........\.......\...\..........\...\...\1_open.png&&........\.......\...\..........\...\...\2.png&&........\.......\...\..........\...\...\3.png&&........\.......\...\..........\...\...\4.png&&........\.......\...\..........\...\...\5.png&&........\.......\...\..........\...\...\6.png&&........\.......\...\..........\...\...\7.png&&........\.......\...\..........\...\...\8.png&&........\.......\...\..........\...\...\9.png&&........\.......\...\..........\...\line_conn.gif&&........\.......\...\..........\...\loading.gif&&........\.......\...\..........\...\zTreeStandard.gif&&........\.......\...\..........\...\zTreeStandard.png&&........\.......\...\..........\zTreeStyle.css&&........\.......\index.jsp&&........\.......\js\jquery-1.4.4.min.js&&........\.......\..\jquery.ztree.all-3.0.js&&........\.......\..\jquery.ztree.all-3.0.min.js&&........\.......\..\jquery.ztree.core-3.0.js&&........\.......\..\jquery.ztree.core-3.0.min.js&&........\.......\..\jquery.ztree.excheck-3.0.js&&........\.......\..\jquery.ztree.excheck-3.0.min.js&&........\.......\..\jquery.ztree.exedit-3.0.js&&........\.......\..\jquery.ztree.exedit-3.0.min.js&&........\.......\lium.jsp&&........\.......\menu.jsp&&........\.......\META-INF\MANIFEST.MF&&........\.......\start.jsp&&........\.......\WEB-INF\classes\com\shyy\menu\dao\JDBCDao.class&&........\.......\.......\.......\...\....\....\...\MenuDao.class&&........\.......\.......\.......\...\....\....\entitys\Menu.class&&........\.......\.......\.......\...\....\....\servlet\MenuServlet.class&&........\.......\.......\.......\...\....\....\test\testMenuDao.class&&........\.......\.......\lib\msbase.jar&&........\.......\.......\...\mssqlserver.jar&&........\.......\.......\...\msutil.jar&&........\.......\.......\web.xml&&........\.......\数据库\Memodb.bak&&........\.......\WEB-INF\classes\com\shyy\menu\dao&&........\.......\.......\.......\...\....\....\entitys&&........\.......\.......\.......\...\....\....\servlet&&........\.......\.......\.......\...\....\....\test&&........\.......\.......\.......\...\....\menu&&........\src\com\shyy\menu\dao&&........\...\...\....\....\entitys&&........\...\...\....\....\servlet&&........\...\...\....\....\test&&........\WebRoot\css\zTreeStyle\img\diy&&........\.......\WEB-INF\classes\com\shyy&&........\src\com\shyy\menu&&........\WebRoot\css\zTreeStyle\img&&........\.......\WEB-INF\classes\com&&........\src\com\shyy&&........\WebRoot\css\zTreeStyle&&........\.......\WEB-INF\classes&&........\.......\.......\lib&&........\src\com&&........\WebRoot\css&&........\.......\js&&........\.......\META-INF&&........\.......\WEB-INF&&........\.......\数据库&&........\.settings&&........\src&&........\WebRoot&&MenuDemo
&相关搜索:
&输入关键字,在本站238万海量源码库中尽情搜索:
&[] - ztree导航树,sping构架,jdbc配置数据库连接,jdbc配置文件在src下
&[] - ztree的一些增删查改 一些小案列 希望对大家有所帮助
&[] - ztree将节点数据提交给Server端例子:
将页面的节点ID遍历解析成字符串形式提交到后台。连接数据库实例(树形菜单)
工程结构如图
数据库设计
增加SqlConnect类
代码如下:
package com.
import java.sql.*;
import javax.swing.JOptionP
public class SqlConnect {
static Connection con =&
private String url =
"jdbc:sqlserver://localhost:1433;DatabaseName=JavaTusername=password=123";
private String user ="sa";//数据库用户名
private String password = "123";//数据库用户密码
public &Connection getConnection(){
& & 连接SQLServer2008 驱动
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
con = DriverManager.getConnection(url, user, password);
} catch (Exception e) {
e.printStackTrace();
JOptionPane.showMessageDialog(null,
"数据库连接失败!");&
增加Node类,代码如下:
package com.
public class Node {
public Node(String yuanxi,String banji){
this.yuanxi=
this.banji=
public String getYuanxi() {
public void setYuanxi(String yuanxi) {
this.yuanxi =
public String getBanji() {
public void setBanji(String banji) {
this.banji =
增加DB类,代码如下:
package com.
import java.sql.C
import java.sql.PreparedS
import java.sql.ResultS
import java.sql.ResultSetMetaD
import java.sql.SQLE
import java.sql.S
import java.util.V
import javax.swing.table.DefaultTableM
import javax.swing.table.TableM
public class DB {
private static PreparedS
static SqlConnect &sqlcon=new
SqlConnect();
static Connection con=sqlcon.getConnection();
static Statement stat=
public static Vector getNode(String sqlStr) {
& & Vector data=
con.createStatement();
ResultSet rs = stat.executeQuery(sqlStr); // 查询数据
data = new Vector();
while (rs.next()) { // 利用循环获得所有记录
String yuanxi=rs.getString(1);
String banji=rs.getString(2);
Node a=new Node(yuanxi,banji);
data.addElement(a);
// con.close();
// rs.close();
// stat.close();
} catch (Exception e) {
e.printStackTrace();
public &PreparedStatement
prepareStatement(String sql){
//可以产生一个指针能够移动的结果集
pstmt=con.prepareStatement(sql,ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
} catch (SQLException e) {
e.printStackTrace();
@SuppressWarnings("serial")
public &TableModel getTableModel(ResultSet
DefaultTableModel tablemodel=
ResultSetMetaData metadata=ds.getMetaData();
ds.last();//结果集指针指向最后一行
int rowcount=ds.getRow();
ds.beforeFirst();//结果集指针指向第一行的前一行
int columncount=metadata.getColumnCount();
Object[][] stuinfo_all=new
Object[rowcount][columncount];
Object[]columnname=new Object[columncount];
while(ds.next()){//next()表示从当前的一行移到下一行,因此以下下一行的数据,因此使用beforefirst是指针移到第一行的前面,否则检索不到第一行
& &for(int j=0;j
stuinfo_all[i][j]=ds.getObject(j+1);//注意:ResultSet的列数和行数都是从1起,而数据都是从0起,注意区别,否则容易超出数组或者ResultSet的索引范围
for(int j=0;j
columnname[j]=metadata.getColumnName(j+1);
tablemodel=new
DefaultTableModel(stuinfo_all,columnname){
//重写方法,使JTable能根据数据类型来显示数据
public Class&?&
getColumnClass(int c) { & &
if (dataVector.isEmpty() == false
&& getValueAt(0, c) != null){
return getValueAt(0, c).getClass(); &
else{ & & &
return Object. & &
//重写方法,使JTable能够选择而不能编辑
public boolean isCellEditable(int row ,int colunm){
} catch (Exception e) {
e.printStackTrace();
package com.
//import DB;
import javax.swing.*;
import java.awt.BorderL
import java.awt.event.MouseA
import java.awt.event.MouseE&
import java.sql.PreparedS
import java.sql.ResultS
import java.sql.SQLE
import java.util.I
import java.util.V
javax.swing.tree.DefaultMutableTreeN&
public class Tree {
JFrame jf=new JFrame("Java Test");
DefaultMutableTreeNode root = new
DefaultMutableTreeNode();
Vector&Node& vtnode=
DB.getNode("SELECT yuanxi.yuanximingcheng, banji.banjimingcheng
" banji & &JOIN yuanxi ON
banji.yuanxiID = yuanxi.yuanxiID");
public void init(){
DefaultMutableTreeNode father=new
DefaultMutableTreeNode();
String fatherString="";
for (Iterator&Node& iterator =
vtnode.iterator(); iterator.hasNext();) {
Node n = (Node) iterator.next();
if(!n.getYuanxi().equals(fatherString)){
father=new DefaultMutableTreeNode(n.getYuanxi());
fatherString=n.getYuanxi();
root.add(father);
DefaultMutableTreeNode child=new
DefaultMutableTreeNode(n.getBanji());
father.add(child);
// 以根节点创建树
tree = new JTree(root);
tree.putClientProperty("JTree.lineStyle",
"None");//节点之间没有连线
// 设置是否显示根节点的“展开/折叠”图标,默认是false
tree.setShowsRootHandles(true);
// 设置节点是否可见,默认是true
tree.setRootVisible(false);
// 设置使用定制的节点绘制器
// tree.setCellRenderer(new ImageCellRenderer());
// jf.add(new JScrollPane(tree));
// jf.pack();
jf.setSize(800,400);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setVisible(true);
tree.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
// JOptionPane.showMessageDialog(null,
tree.getLastSelectedPathComponent().toString());
PreparedStatement pst=new DB().prepareStatement("SELECT
& & banzhang, xuewei, " +
"tuanzhishu &FROM &
& banji &WHERE &
&banji.banjimingcheng = ?");
pst.setString(1,
tree.getLastSelectedPathComponent().toString());
ResultSet rs=pst.executeQuery();
// while(rs.next()){
// for(int i=1;i&9;i++){
// System.out.print(rs.getString(i)+ " ");
// System.out.println();
// Vector&String& columnName=new
Vector&String&();
// columnName.addElement("班长");
// columnName.addElement("学委");
// columnName.addElement("团支书");
table.setModel(new DB().getTableModel(rs));
// table.setModel(new DefaultTableModel((Vector)rs,
columnName));
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
jf.add(new JScrollPane(tree),BorderLayout.WEST);
table=new JTable();
jf.add(new JScrollPane(table),BorderLayout.CENTER);
// jf.add(new JScrollPane(table),BorderLayout.CENTER);
// jf.setBounds(0, 0,);
// jf.setVisible(true);
增加TestMain
package com.
public class TestMain {
public static void main(String[] args) {
Tree tree=new Tree();
tree.init();
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&}

我要回帖

更多关于 ztree数据库 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信