package book.treeview;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;
public class treeviewRender {
static public String renderStatic(TreeviewElement treeElmt, boolean bHidden) {
StringBuffer content = new StringBuffer();
content.append("<li id=" + treeElmt.getID() + ">");//显示li元素
if (bHidden && treeElmt.canExpand())//如果可以展开并且初始化为隐藏,则显示展开图片,并添加showHide事件
content.append("<img src=images/plus.gif onClick=\"showHide('"
+ treeElmt.getID() + "')\">");
else if (treeElmt.canExpand())//如果可以展开,则显示折叠图片,并添加showHide事件
content.append("<img src=images/minus.gif onClick=\"showHide('"
+ treeElmt.getID() + "')\">");
else//否则显示空白图片
content.append("<img src=images/blank.gif>");
content.append("<img src=images/folder.gif><a href=\"#\"");//添加文件夹图片
if (treeElmt.canExpand())//如果可以展开,为节点添加showHide事件
content.append("onClick=\"showHide('" + treeElmt.getID() + "')\"");
content.append(">" + treeElmt.getNodeName() + "</a>");
if (treeElmt.canExpand()) {//如果可以展开,则用UL标记显示子结点
content.append("<ul");
if (bHidden)
content.append(" style=\"display:none;\" ");
content.append(">");
TreeviewElement[] elmts = treeElmt.getChildren();//获得此结点的子节点
for (int i = 0; i < elmts.length; i++)
content.append(renderStatic(elmts[i], bHidden));//递归调用显示子节点
content.append("</ul>");
}
content.append("</li>");//结束显示<li>元素
return content.toString();
}
static public TreeviewElement[] getTopCategory() {//得到父类id为0的子类集合
String sql = "select category_id from product_category where parent_category_id=0";
ResultSet rs = DbManager.getResultSet(sql);//执行sql语句并返回ResultSet
try {
rs.last();// 移动到最后一行
int row = rs.getRow();// 得到总记录数
if (row <= 0) {
return null;
} else {
Vector vData = new Vector();
rs.beforeFirst();
while (rs.next())
vData.add("" + rs.getInt("CATEGORY_ID"));
TreeviewElement[] children = new TreeviewElement[vData.size()];
for (int i = 0; i < vData.size(); i++) {
int id = Integer.parseInt((String) vData.get(i));
children[i] = new Category(id);
}
return children;
}
} catch (SQLException e) {
e.printStackTrace();
return null;
} finally {
try {// 最后关闭ResutltSet,Statement.并释放连接
if (rs != null)
rs.close();
if (rs.getStatement() != null)
rs.getStatement().close();
DbManager.releaseConnection();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
static public String renderSimple(TreeviewElement treeElmt) {//循环显示父类下的所有子类集合
StringBuffer content = new StringBuffer();
content.append("<li id=" + treeElmt.getID() + "><a href=\"#\">");
content.append( treeElmt.getNodeName() + "</a>");
if (treeElmt.canExpand()) {
content.append("<ul>");
TreeviewElement[] elmts = treeElmt.getChildren();
for (int i = 0; i < elmts.length; i++)
content.append(renderSimple(elmts[i]));
content.append("</ul>");
}
content.append("</li>");
return content.toString();
}
static public String renderTreeViewAjax(TreeviewElement treeElmt,boolean bRenderChildren) {
StringBuffer content = new StringBuffer();
content.append("<li id="+treeElmt.getID()+">");
if (treeElmt.canExpand())
content.append("<img src=images/plus.gif onClick=\"getSubTree('"+treeElmt.getID()+"')\">");
else
content.append("<img src=images/blank.gif>");
content.append("<img src=images/folder.gif><a href=\"#\"");
if (treeElmt.canExpand())
content.append(" onClick=\"getSubTree('"+treeElmt.getID()+"')\"");
content.append(">"+treeElmt.getNodeName()+"</a>");
if ( bRenderChildren&&treeElmt.canExpand( ))
{
content.append("<ul>");
TreeviewElement[] elmts = treeElmt.getChildren();
for (int i=0;i<elmts.length;i++)
content.append(renderTreeViewAjax(elmts[i],false));
content.append("</ul>");
}
content.append("</li>");
return content.toString();
}
}
java实现无限级分类树形,连接mysql数据库



在Java编程中,构建无限级分类树形结构是一项常见的任务,尤其在数据管理、文件系统或者网站导航等场景中。本教程将介绍如何利用Java来实现这种功能,并结合MySQL数据库进行数据存储,同时通过AJAX技术实现页面的异步刷新。 我们需要建立一个Java实体类来表示树形结构中的节点。这个类通常包含ID(主键)、名称、父节点ID等属性,以及获取和设置这些属性的方法。例如: ```java public class TreeNode { private Long id; private String name; private Long parentId; // getters and setters... } ``` 接着,我们需要设计一个数据库表来存储这些节点信息。表结构可以是这样的: ```sql CREATE TABLE `tree_nodes` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `parent_id` bigint(20) DEFAULT NULL, PRIMARY KEY (`id`), KEY `parent_id` (`parent_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ``` 为了从MySQL数据库中获取无限级分类数据,我们可以使用递归查询或连接查询。这里我们演示递归查询的例子,使用MySQL的WITH RECURSIVE语句: ```sql WITH RECURSIVE tree AS ( SELECT * FROM tree_nodes WHERE parent_id IS NULL UNION ALL SELECT t.* FROM tree_nodes t JOIN tree p ON t.parent_id = p.id ) SELECT * FROM tree; ``` 在Java中,我们可以使用JDBC或者ORM框架如Hibernate、MyBatis来执行SQL查询并获取结果集。将结果集转换为TreeNode对象的集合,然后利用这些对象构建树形结构。例如,使用ArrayList作为树的容器,每个节点包含一个子节点列表: ```java List<TreeNode> rootNodes = new ArrayList<>(); // 从数据库获取数据并转换为TreeNode对象 // ... Map<Long, TreeNode> nodeMap = new HashMap<>(); for (TreeNode node : rootNodes) { nodeMap.put(node.getId(), node); } for (TreeNode node : nodeMap.values()) { if (node.getParentId() != null) { TreeNode parent = nodeMap.get(node.getParentId()); if (parent != null) { parent.getChildren().add(node); } } } ``` 接下来,为了让用户在界面上看到树形结构,我们可以使用JavaFX或Swing库中的组件。然而,题目中提到了“树形菜单”,这可能是指前端部分。在这种情况下,可以使用HTML和JavaScript库(如jQuery UI的Treeview或Angular的ng-bootstrap等)来渲染树形结构。服务器端通过RESTful API提供数据,例如使用Spring Boot的@RestController注解来创建API。 使用AJAX实现页面的异步刷新。在JavaScript中,可以使用jQuery的$.ajax或$.getJSON方法向后端发送请求,获取更新的树形数据,然后动态更新DOM元素。例如: ```javascript $.ajax({ url: '/api/tree', type: 'GET', success: function(data) { // 更新页面上的树形菜单 // ... }, error: function(error) { console.error('Failed to fetch tree data:', error); } }); ``` 总结来说,这个项目涵盖了以下知识点: 1. Java实体类设计 2. MySQL数据库操作 3. 递归查询 4. JDBC/ORM框架使用 5. 数据结构与算法(构建树形结构) 6. 前后端交互(RESTful API) 7. AJAX异步刷新 8. 前端树形菜单渲染 通过以上步骤,你可以实现一个能够连接MySQL数据库,支持无限级分类的Java树形菜单,并且利用AJAX实现页面的实时更新。这是一个综合性的项目,涵盖了Web开发的多个方面。

































































- 1

- #完美解决问题
- #运行顺畅
- #内容详尽
- #全网独家
- #注释完整
- wcrycl06102011-12-09根本不是异步加载,我的数据有六千多条,加载完成的时候需要几分钟,很慢
- smywhj2012-07-05不怎么好用呵
- bingxueyixi2012-08-19在myeclipse8.5里运行 好多问题
- alabo1272015-07-21貌似有点乱
- 菜鸟达人2012-12-01不会用,代码太乱

- 粉丝: 1
- 资源: 34
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- (源码)基于Python的数据处理与可视化项目.zip
- (源码)基于Python的远程智能家居声控系统.zip
- (源码)基于MakeCode平台的跳跃平台游戏开发框架.zip
- 【毕业设计+开题答辩】-基于Java的QQ屏幕截图工具的设计与实现-【源代码+截图+数据库+论文+视频讲解】
- nvidia gpu压力测试工具
- 三菱PLC Q系列12轴伺服控制与多协议通讯在精密制造中的应用
- 西门子S7-200 PLC定长切纸机控制系统解析及应用实例
- STM32F107与DP83848以太网芯片驱动程序详解及实战代码
- 基于Matlab的H∞鲁棒控制技术及其仿真实践
- 西门子PLC 1200与G120变频器Modbus RTU通讯及PID控制在压力燃油系统中的应用
- 西门子PLC大型伺服控制系统:20轴程序通讯、气缸与机械手控制及Modbus通讯解析
- ASP.NET Core + Bootstrap:企业级快速后台开发框架,支持多数据库与模块化设计
- MATLAB实现车辆路径问题(VRP)多种优化算法的代码解析
- 机械手运动控制系统:基于F1与F4的双重控制方案实践与应用
- 工程测量领域基于Python的附合导线与四等水准平差自动化程序实现
- 西门子S7-200 Smart与台达伺服电机运动控制系统在包装机的应用及调试


