首先,想清楚目的,需要的是只是单纯的实现菜单功能,还是菜单下可以有文件的那种实战开发中需要用到的菜单(即菜单下可以有菜单还可以有文件)

如果只是想要单纯的实现菜单,不需要有文件那么这种方式相对较为简单

1、建目录表,表中应有以下关键字段

  • 目录id(dir_id)
  • 目录名(dir_name)
  • 父目录id(parent_id)

2、创建目录(这个功能就是向数据库表中插入数据,没什么好说的,注意需要同名判断)

3、获取目录树结构

思路:从数据库中获取所有的目录节点对象,设置根目录,判断此字段的父id是否为根目录,然后递归

     /*** 获取目录树结构* @return*/public DataSetDirectory getDir() {//获取所有的目录节点对象,从数据库里面查就好了List<DataSetDirectory> dataSetDirectorys = this.getAllDataSetDirectory();DataSetDirectory rootDir = new DataSetDirectory();rootDir.setDirId("0");rootDir.setDirName("根目录");if (null != dataSetDirectorys) {rootDir.setChildren(getChildrenDir(dataSetDirectorys, "0"));}return rootDir;}/*** 获取目录子节点** @param dataSetDirectories* @param parentId* @return*/public List<DataSetDirectory> getChildrenDir(List<DataSetDirectory> dataSetDirectories, String parentId) {List<DataSetDirectory> result = new ArrayList<>();for (DataSetDirectory dataSetDirectory : dataSetDirectories) {if (null == dataSetDirectory || null == parentId) {continue;}if (Objects.equals(dataSetDirectory.getSupId(), parentId)) {//此目录的父id和parentId相等说明是一级目录,则设置其子目录dataSetDirectory.setChildren(getChildrenDir(dataSetDirectories, dataSetDirectory.getDirId()));result.add(dataSetDirectory);}}return result;}

这样就简单的实现了获取多层级目录的功能

如果想要实现可以正常使用的多层级菜单,菜单下有菜单还可以有文件的那种,就要稍微复杂点,具体实现如下:

1、想要实现这种方式,就肯定要有一个目录文件类,既包含了目录又包含了文件,代码如下:

public class DataTree {//目录节点idprivate String treeId;//目录名private String treename;//目录父节点idprivate String parentId;//目录类型,是文件还是目录private DataTreeType dataTreeType;//子节点对象private List<DataTree> children;//此处省略getset方法·····
}

枚举类如下:

public enum DataTreeType {/*** 目录*/DIR,/*** 文件*/FILE;}

目录类如下:

public class DataSetDirectory {//目录idprivate String dirId;//目录名称private String dirName;//上级目录idprivate String supId;//描述private String description;//文件夹包含的数据集private List<DataSet> dataSetList;//子目录private List<DataSetDirectory> children;//此处省略getset方法
}

文件类就不列举出来了,记得有个关键性字段为所在目录id(dirId),其他的无关紧要。

思路:想查询出目录又想查询出文件,而且我有了一个目录文件类,那么我就需要把目录和菜单都装进这个类里面去,目录和文件都装进去之后返回这个对象也就可以得到目录树和数据集结构

正式逻辑:

1、首先需要获取指定目录下的数据集吧(数据集即文件),方法如下:

    /*** 获取目录树下的数据集** @param dataTree* @return*/public List<DataTree> getChildrenDataSet(DataTree dataTree) {//获取指定目录节点下所有文件List<DataSet> dataSetList = this.getDataSetBydirId(dataTree.getTreeId());List<DataTree> dataTreeLit = new ArrayList<>();for (DataSet dataSet : dataSetList) {if (null != dataSet) {continue;}DataTree child = new DataTree();child.setParentId(dataTree.getTreeId());child.setTreeId(dataSet.getDirId());child.setTreename(dataSet.getDatasetName());child.setDataTreeType(DataTreeType.FILE);dataTreeLit.add(child);}return dataTreeLit;}

2、有了目录下的数据集,还需要获取目录和目录下的数据集(数据集即文件)

    /*** 获取数据集和目录子节点** @param dataSetDirectories 所有的目录节点对象* @param parentId 父目录id* @return*/public List<DataTree> getchildrenDataTree(List<DataSetDirectory> dataSetDirectories, String parentId) {List<DataTree> result = new ArrayList<>();for (DataSetDirectory dataSetDirectory : dataSetDirectories) {if (Objects.equals(dataSetDirectory.getSupId(), parentId)) {DataTree dataTree = new DataTree();dataTree.setTreeId(dataSetDirectory.getDirId());dataTree.setParentId(dataSetDirectory.getSupId());dataTree.setTreename(dataSetDirectory.getDirName());dataTree.setDataTreeType(DataTreeType.DIR);//先加载所有子目录List<DataTree> childrenDir = getchildrenDataTree(dataSetDirectories, dataSetDirectory.getDirId());//加载所有目录下的文件List<DataTree> childrenDataSet = getChildrenDataSet(dataTree);List<DataTree> children = new ArrayList<>();if (null != childrenDir && childrenDir.size() > 0) {children.addAll(childrenDir);}if (null != childrenDataSet && childrenDataSet.size() > 0) {children.addAll(childrenDataSet);}dataTree.setChildren(children);result.add(dataTree);}}return result;}

3、啥都有了,直接获取目录树和数据集结构

    /*** 获取目录树及其数据集* @return*/public List<DataTree> getDataTree() {//获取所有的目录List<DataSetDirectory> dataSetDirectories = this.getAllDataSetDirectory();List<DataTree> DataTreeList = new ArrayList<>();//加载目录树结构if(null!=dataSetDirectories&&dataSetDirectories.size()>0){DataTreeList.addAll(getchildrenDataTree(dataSetDirectories,"0"));}//有些人不喜欢建目录直接建文件,这时候就可能会有这种情况,根目录为0List<DataSet> rootDataSet = dataSetMapper.getByDirId("0");if (null != rootDataSet && rootDataSet.size() > 0) {for (DataSet dataSet : rootDataSet) {DataTree dataTree = new DataTree();dataTree.setParentId("0");dataTree.setTreeId(dataSet.getDirId());dataTree.setTreename(dataSet.getDatasetName());dataTree.setDataTreeType(DataTreeType.FILE);DataTreeList.add(dataTree);}}return DataTreeList;}

以上。

Java后台实现多层级目录树的构建相关推荐

  1. java实现多层级目录树详解

    一,引言 在开发中,经常遇到前端需要实现一个多层级的目录树,那么后端就需要根据这种结构返回对应的数据,因此在这里记录一下本人在开发中是如何实现这个多层级的目录树. 二,建表建库 在建表时,需要注意的是 ...

  2. Java中的无限层级递归树前后端操作解决方案

    引言: 抖音真是一个神奇的软件,前两天脑海中浮现了一首歌,知道歌曲的调调,今天打算写博客之前刷了一下抖音,抖音的推荐算法居然给我推送了这首歌,这首歌叫做<一开始说陪你到老的人现在他还好吗> ...

  3. 微信小程序及Java后台测试登录

    微信小程序及Java后台测试登录 文章目录 微信小程序及Java后台测试登录 一.使用的工具以及开发环境 二.微信端登录代码. 第一种方式,使用wx.getUserInfo直接获取微信头像,昵称. 第 ...

  4. php打印文件目录结构,php和java关于目录树(列出某一目录下文件结构)

    php和java关于目录树(列出某一目录下文件结构) java的写法 /** * * @param location * @param nameList保存结果的! */ public void li ...

  5. java当中递归打印目录树

    一:上码 package cn.wyj.one;import java.io.File;public class Demo8_递归打印目录树 {public static void main(Stri ...

  6. java记录目录树_Java记录

    java记录目录树 https://openjdk.java.net/jeps/359概述了Java的新功能,该功能可能会/将在某些将来的Java版本中实现. JEP建议使用一种新的"类别& ...

  7. java查找目录文件函数_java 实现 文件操作工具集。包括文件、目录树的拷贝、删除、移动、查找等工具函数...

    import java.io.*; /** * 文件操作工具集.包括文件.目录树的拷贝.删除.移动.查找等工具函数. * @author InternetTeam3 * @version 1.0 */ ...

  8. python学习笔记(十七) Tkinter鼠标事件、树状层级目录和一些补充

    目录 1.鼠标点击事件: 2.鼠标移动事件: 3.鼠标释放事件: 4.组合按键: 5.相对布局: 6.绝对布局: 7.表格布局: 8.表格数据: 9.树状层级目录: 1.鼠标点击事件: import ...

  9. Java File createNewFile创建文件包含多层级目录报错

    Java File createNewFile创建文件包含多层级目录报错 比如,需要创建一个包含目录层级结构的文件:c:\dira\dirb\dirc\file.txt 如果直接使用File的crea ...

最新文章

  1. 配置国内 Docker Registry Mirror
  2. Android 创建其它应该程序的上下文对象
  3. Lighttpd日志打印格式
  4. 对某机构为“转移内部矛盾”而嫁祸于我们的事件之真相大起底
  5. qt如和调用linux底层驱动_擅长复杂硬件体系设计,多核系统设计,以及基于RTOS或者Linux,QT等进行相关底层驱动。...
  6. TiDB数据库备份恢复与数据迁移
  7. maven 安装后变成 mvn 不是内部命令解决方法
  8. 循环c语言格式,关于for循环的格式
  9. strlen函数在哪个头文件_第二十七中、字符串处理函数-strlen、strcat、strncat
  10. Python安装geopandas库
  11. 【codevs3945】 完美拓印
  12. IKM JAVA , SPRING, HIBERNATE_ANZ
  13. virtuoso 安装与使用
  14. perl pack和unpack的使用详解
  15. 符合W3C的网站的开发模型和必要性的探讨(一)
  16. 【产品运营从0到1】资深产品运营推荐的互联网产品运营人员必看书籍
  17. Fibo Rule规则引擎可视化
  18. 【计算机视觉】张正友棋盘格标定法
  19. java统计每个单词单词出现的次数_Java统计英文句子中出现次数最多的单词并计算出现次数的方法...
  20. clock jitter和clock skew

热门文章

  1. 电脑下载python 步骤_python3安装详细步骤
  2. PPT在线转视频的方法以及操作
  3. 按摩头面部可以有效促进淋巴排毒
  4. CNN(卷积神经网络)、RNN(循环神经网络)、DNN(深度神经网络)的内部网络结构有什么区别?...
  5. 涂雅七月:IT娱乐圈
  6. 老机型MacAir安装win10踩坑填坑记录
  7. No tldr entry for 的解决办法
  8. 组词组合 php,PHP实现的简单组词算法示例 - PHP教程
  9. 网页 查看源文件”时打开ie所在目录或打开桌面的解决办法综述
  10. Linux平台下Spool导出数据并发送到邮箱