产品分类树形展示的Java实现

这种视图结构可能被用在菜单,或者某种体现分类的信息上面等等。今天就让我们来探讨下怎么从后端去实现这样的一个内容!如果是Java使用者那就比较熟悉这其中的语法了。

首先看下前端浏览器的效果:

从其中不难发现,这是个分类信息展示,而且具有多级效果,业务上是需要无限极的特点的,上级和下级具有关联关系的。那么这种结构需要什么样的数据库表结构呢?

数据库内需要存在以上4个信息以上才能很方便地展示出刚才的效果,至少目前来看是拥有足够的信息了。那么接下来咱们的业务层如何去处理?

下面我定义了一个transform方法,用于取出数据库内所有的分类数据,并且转换为相对应的TreeNode对象的集合。这个TreeNode集合是一个彼此有关系的对象集合,TreeNode至少拥有如此的属性:id、text、children,其中children又是一个TreeNode对象的集合,代表子分类对象的集合。

public List<TreeNode> transform() {
        // Gets all categories
        List<Category> categories = categoryDao.selectWhole();

// Do sorting this categories,by level attribute value.The level 0 is
        // root category.
        categories.sort(new Comparator<Category>() {
            @Override
            public int compare(Category o1, Category o2) {
                Integer level1 = o1.getLevel();
                Integer level2 = o2.getLevel();

// The min level will be sorted to the top
                return level1.compareTo(level2);
            }
        });

// Initial list of tree nodes
        List<TreeNode> treeNodes = new ArrayList<>();

for (Category category : categories) {
            // Transform the category to a new treenode
            TreeNode newTreeNode = new TreeNode(category.getName());
            newTreeNode.setId(category.getId());
            newTreeNode.setSuperId(category.getSuperId());

// If the category‘s super id is null,that means it is a root
            // category.
            if (category.getSuperId() == null) {
                treeNodes.add(newTreeNode);
            } else {// Else call this method for next step
                treePlant(treeNodes, newTreeNode);
            }
        }

return treeNodes;

}

transform方法内,首先调用数据访问层的方法将分类数据全部取出来,并返回一个领域对象的集合,这个领域对象跟数据库的结构是属于对应关系的,肯定是不能直接拿来用在显示上面的,这里并没有使用像Hibernate那种的ORM框架,可以理解为使用的就是原生的JDBC技术。接下来调用了该集合的sort方法用于排序集合内的对象,且从里面的内容可以看出,排序依据是领域对象的level属性,也就是级别。在此处,说下级别是什么意思,最顶级的分类可以将其级别置为0,第二级别置为1,以此类推。添加级别属性的话,是对处理层次关系是有很大的帮助的,此处就用上了。经过这样排序的操作,那么最终这个集合内是一个级别最小排最前面的集合。为什么进行排序?后面就会知道。接下来定义一个TreeNode新的空的集合,用于方法返回。循环遍历领域对象的集合,并将当前循环到的对象转换为一个新的TreeNode对象,分别将编号和父编号赋值到TreeNode。然后对领域对象进行一个判断,判断父编号是否为空,如果为空的话,就直接将其放入返回对象集合内,即TreeNode集合。反之调用treePlant方法:

private void treePlant(List<TreeNode> treeNodes, TreeNode newTreeNode) {

// Else it is not a root category,then find the super category and plant
        // the category in it.
        for (TreeNode treeNode : treeNodes) {
            if (treeNode.getId().equals(newTreeNode.getSuperId())) {
                treeNode.getChildren().add(newTreeNode);
                return;
            }

treePlant(treeNode.getChildren(), newTreeNode);
        }

}

treePlant方法,用于将新的TreeNode对象正确放入到TreeNode对象集合内。如果找到编号为父编号的对象,那么就将其放入到父TreeNode的children对象集合内,以表明这种关系。其实要想这个方法运行正常的话,得考虑几个问题,首先是传入的treeNodes对象也就是TreeNode对象集合必须存在顶级分类(在数据库存在数据的情况下),这也就是为什么在transform方法内要首先将父编号为空的放入treeNodes对象。其次就是层次关系的问题,假设有这样一种情况,衣服是顶级分类,其下有上衣、裤子等,这些是二级分类,再往下有夹克,这个属于三级分类,属于上衣分类。在这里只是举个例子,如果不用设计一个层次属性的话,会出现什么情况呢?在调用treePlant方法的时候,有可能会出现丢失分类数据的情况!衣服分类在传入之前就已经放入参数treeNodes对象中,这个不用怀疑,在执行到内部循环的时候,此时如果循环到的分类是夹克,它属于上衣这个分类,你此时不能保证上衣这个分类已经被放入treeNodes对象中,也就是说,夹克这个三级分类有可能丢失。这就是为什么要设计一个level属性即层次级别。经过transform方法内排序处理,层次数越小的排在最前面,也就不会出现丢失分类的情况。

那么此时,已经得到一个TreeNode对象的集合,这个集合正是前端需要的数据,里面的结构也正好符合相关框架的要求,在这里,我用的是ExtJS。

这个解决方案是本人亲自摸索出来并应用而没有问题。如有更好的解决方案,请联系我告知,感恩不尽!

时间: 2024-10-08 20:04:32

产品分类树形展示的Java实现的相关文章

Java之File类及递归树形展示目录_20150804

Java之File类及递归树形展示目录 20150804 下面的构造函数可以用来生成File 对象: File(String directoryPath)          File(String directoryPath, String filename)          File(File dirObj, String filename) 这里,directoryPath是文件的路径名,filename 是文件名,dirObj 一个指定目录的File 对象.下面的例子创建了三个文件:f1

laravel关于产品分类的说说说

1.产品分类的数据表结构设计 不管有多少级分类,分类表中只要有以下几个字段即可, id(分类的id号,不管几级分类都有自己一个唯一的id号), name(分类的名称), parentid(分类的上一级id名称,如果为一级分类,则此处值为0), type(这个字段选填,代表当前分类名所属的等级,有这个字段可更快的判断分类名属于几级分类名称) 2.laravel中全部分类的展示: 1).在前端页面最上面加上如下代码 <?phpuse App\Http\Common\PHPTree;?> 2)在Ap

Mysql 产品分类和版本说明

MySQL Community Server是开源免费的,这也是我们通常用的MySQL的版本. 根据不同的操作系统平台细分为多个产品分类,具体分类如下: 1. MySQL Community Server 社区版本,免费,但是Mysql不提供官方技术支持. MySQLCommunity Server is a freely downloadable version of the world's most popularopen source database that is supported

商城产品分类设计思路

问题的提出:网上商城对产品进行了很多分类,不同的分类产品又有不同的属性,比如,电脑的属性有:CUP,内存,                   主板,硬盘等等,服装的属性有:布料,尺寸,颜色等等,那么产品表以及产品分类表应该如何设计才能满足                   不同类型产品的区别呢? 解决方案:      产品分类表的设计      第一种设计思路:使用树形结构,递归的形式,可以对产品进行N种     分类,只要你喜欢,树形结构在数据库的设计中                  

商城常用产品分类导航条

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Typ

LigoWave品牌的产品分类及项目选型

一.产品介绍Ligowave拥有多条产品线,涵盖了不同垂直领域的各种应用.多年的研发和应用经验,独特的专有技术和专业的产品设计,为用户提供高质量高性能的无线产品.Ligowave独有的产品设计,可以应用于不同距离的点对点和点对多点场景,广泛的产品具有不同的容量设计和价格,允许每个客户对每个项目进行适当的投资,为不同的场景选择独特的设备,为用户提供最大的灵活性.Ligowave独具的专有协议W-jet和ipoll,将设备产品性能最大化,即使在射频密集.距离更远的环境,也能确保更高的带宽.更高的数据

树形遍历(java)---孩子双亲表示法

给定一个树形结构,如图: 将它转换为孩子双亲表示法: 以下是JAVA实现://先序遍历 import java.util.ArrayList; public class TreeTraverse{ static int[] father = { 0,1,1,1,2,2,2,6,6,6,8,4,4,12,13,13,13 }; static int[] child = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 }; public static void

产品分类

互联网基础产品归为以下几个个分类: 一.门户.如:AOL.新浪.搜狐.无疑,门户是最初的互联网产品,门户的内容本质上就是新闻资讯,门户其实是一种传统媒体的替代形式. 二.搜索引擎.如:谷歌.百度.naver(韩国的百度).雅虎.搜索引擎是虚拟世界的指南针.路标和地图. 三.社区.如:twitter.facebook.天涯.猫扑.MySpace.wikipedia.youtube.社区是内容和关系交织的产品,是虚拟世界的公共交流空间.必有人质疑youtube的划分,我的理由是youtube是人与内

MVC 中 Razor 无限分类的展示

在MVC的Razor视图展示无级分类的办法,在网上看了很多资料,大多搞得很高大上.可能本人水平有限,实在是不会用. 那我就用最简单爆力的办法来做. Model: public class NewsCategory { [Key] public int CategoryId { get; set; } public int ParentCategoryId { get; set; } [Required] [StringLength(50)] public string CategoryName