该案例是实际开发中运用,java递归查询分类及分类下所有子分类。

代码走起:

1.jsp页面布局样式这里不再介绍,js业务逻辑展示分类树形结构如下:

/*** 商品分类操作*//*** 初始化*/
$(function(){//加载树reloadTree();});});/*** 加载树*/
function reloadTree(){//加载列表树initGoodsCateTree(1);//加载添加分类弹框树initGoodsCateTree(2);//加载编辑分类弹框树initGoodsCateTree(3);
}/*** 初始化商品分类树* type:1列表树2弹框树*/
function initGoodsCateTree(type){$.ajax({type:"post",  url: "queryAllCate.htm",async:false, //同步cache:false, //清除缓存dataType:"json",success: function(data){if(type==1){//加载列表树$("#cat_tree").html("");}else if(type==2){//加载添加分类弹框树$("#parentCate_add .tree").html("");}else if(type==3){//加载编辑分类弹框树$("#parentCate_edit .tree").html("");}loadGoodsCateTree(data,0,type);//加载分类树样式initGoodsCateTreeCss();}});
}/*** 递归树* datas:商品分类数据* parendId:父节点默认为0* type:1列表树2弹框树*/
function loadGoodsCateTree (datas,parentId,type){if(datas!=null){if(parentId==0){for(var i=0;i<datas.length;i++){var data=datas[i];if(type==1){//拼接列表树$("#cat_tree").append(goodsCateHtml(data));}else if(type==2){//拼接添加分类弹框树$("#parentCate_add .tree").append(selectGoodsCateHtml(data,"cateAdd"));}else if(type==3){//拼接编辑分类弹框树$("#parentCate_edit .tree").append(selectGoodsCateHtml(data,"cateEdit"));}//递归所有子节点for(var j=0;j<data.cateVos.length;j++){var dataCate=data.cateVos[j];loadGoodsCateTree(dataCate,dataCate.catId,type);}}}else{//非父节点var data=datas;if(type==1){//拼接列表树$("#cat_tree").append(goodsCateHtml(data));}else if(type==2){//拼接添加分类弹框树$("#parentCate_add .tree").append(selectGoodsCateHtml(data,"cateAdd"));}else if(type==3){//拼接编辑分类弹框树$("#parentCate_edit .tree").append(selectGoodsCateHtml(data,"cateEdit"));}//递归所有子节点for(var j=0;j<data.cateVos.length;j++){var dataCate=data.cateVos[j];loadGoodsCateTree(dataCate,dataCate.catId,type);}}}
}/*** 拼接商品分类列表树* data:商品分类数据*/
var goodsCateHtml=function (data) {var html="";//默认只展示父节点if(data.catGrade==1){html= '<div depath="'+data.catGrade+'" class="clear_cat row"  cid="'+data.catId+'"  pid="'+data.catParentId+'" >'}else{html= '<div depath="'+data.catGrade+'" class="clear_cat row"  style="display:none;" cid="'+data.catId+'"  pid="'+data.catParentId+'" >'}html= html+'<table>'+'<tbody>'+'<tr>'+'<td class="td1">'+'<div >'+'<span class="handle-icon">'+'<img src="data:images/cticon2.png" alt="收起子分类" title="收起子分类" class="handle-hide" app="desktop" style="display: none;">'+'<img src="data:images/cticon1.png" alt="展开子分类" title="展开子分类" class="handle-show" app="desktop">'+'</span>'+'<a >'+data.catName+'</a>'+'</div>'+'</td>'+'<td class="td2"><span class="quiet">['+data.typeName+']</span></td>'+'<td class="td3"><b>'+data.catSort+'</b></td>'+'<td class="td4">'+'<a href="javascript:void(0);" class="addSubNote" οnclick="addSubCate('+data.catId+','+data.catGrade+',\''+data.catName+'\')">增加子类</a>'+ '<a href="javascript:void(0);" οnclick="editGoodsCate('+data.catId+')">编辑</a>'+ '<a href="javascript:void(0);" οnclick="deleteGoodsCate('+data.catId+')">删除</a>'+'</td>'+'<td class="td5">'+'<input type="hidden" value="'+data.catIsFinal+'"/>'+'</td>'+'</tr>'+'</tbody>'+'</table>'+'</div>';return html;
}/*** 加载商品分类树样式*/
function initGoodsCateTreeCss(){$(".clear_cat").each(function(){//判断是否是末级var isM = $(this).find(".td5 input").val();if(isM == 1){//末级节点不展示图标$(this).find(".handle-icon").remove();//不显示添加子类$(this).find(".addSubNote").remove();}else {//非末级节点不显示类型名称$(this).find(".quiet").html(" ");}//子节点添加样式var depath = $(this).attr("depath");$(this).find(" .td1>div").css("padding-left",20*depath+"px");});
}/*** 拼接商品分类弹框树* data:商品分类数据*/
var selectGoodsCateHtml=function (data,divId){var html="";//默认只展示父节点if(data.catGrade==1){html= '<div depath="'+data.catGrade+'" class="clear_cat row"  cid="'+data.catId+'"  pid="'+data.catParentId+'" >'}else{html= '<div depath="'+data.catGrade+'" class="clear_cat row"  style="display:none;" cid="'+data.catId+'"  pid="'+data.catParentId+'" >'}html= html+'<table>'+'<tbody>'+'<tr>'+'<td class="td1">'+'<div >'+'<span class="handle-icon">'+'<img src="data:images/cticon2.png" alt="收起子分类" title="收起子分类" class="handle-hide" app="desktop" style="display: none;">'+'<img src="data:images/cticon1.png" alt="展开子分类" title="展开子分类" class="handle-show" app="desktop">'+'</span>'+'<a href="javascript:void(0);" οnclick="selectParentCate('+data.catId+','+data.catGrade+',\''+data.catName+'\',\''+divId+'\')" >'+data.catName+'</a>'+'</div>'+'</td>'+'<td class="td5">'+'<input type="hidden" value="'+data.catIsFinal+'"/>'+'</td>'+'</tr>'+'</tbody>'+'</table>'+'</div>';return html;
}/*** 点击上级分类显示弹框树*/
function showParentCate(){if($(".cateTree").css("display")=="none"){$(".cateTree").show();}else{$(".cateTree").hide();}
}/***点击上级分类显示弹框树,选择任意一个上级分类名称赋值至文件框* parentId:父节点id* parentGrade:父节点层级* parentName:父节点名称
 * divId:div标识判断是添加分类弹窗还是编辑分类弹窗*/
function selectParentCate(parentId,parentGrade,parentName,divId){//alert("parentId:"+parentId);alert("parentGrade:"+parentGrade);alert("parentName:"+parentName);alert("divId:"+divId);if(divId=="cateAdd"){$("#catParentName_add").val(parentName);$("#catParentId_add").val(parentId);$("#catGrade_add").val(parentGrade);}else if(divId=="cateEdit"){$("#catParentName_edit").val(parentName);$("#catParentId_edit").val(parentId);$("#catGrade_edit").val(parentGrade);}//隐藏弹框树$(".cateTree").hide();
}

备注:

1.注意用了代码重构的思想,如添加分类,编辑分类都要显示谈框树,则用type来区分是添加显示还是编辑显示

2.js执行顺序是从上到下,代码顺序很重要,在实际开发中因为代码放的位置不对,导致展示数据异常,这里就明显体现了。

3.从后台递归查询了数据,前台没有用任何框架,纯js+css展示,这里用js递归方法展示,本人是第一次写,觉得非常好,留着纪念

后台代码:

controlle层:

/*** 递归查询商品分类* @return*/@RequestMapping("/queryAllCate")@ResponseBodypublic List<GoodsCateVo> queryGoodsCateVo(HttpServletRequest request)  {//获取参数(all查询所有)String queryType = request.getParameter("queryType");Date date=new Date();List<GoodsCateVo> list=new ArrayList<GoodsCateVo>();HashMap<String, Object> paramMap=new HashMap<String, Object>();try {//根据父节点递归查询子节点if(!"all".equals(queryType)){paramMap.put("catParentId", 0);}list=goodsCateService.findAllGoodsCate(paramMap);System.out.println("查询耗时:"+(new Date().getTime()-date.getTime()));} catch (Exception e) {e.printStackTrace();LOGGER.error("递归查询商品分类失败"+e.getMessage(),e);}return list;}

注意这里查询是所有父分类即catParentId=0,然后根据父分类递归查询所有子分类

serverImpl业务层:

 /*** @descript:根据父节点递归查询子节点* @param:* @return:*/@Transactional(readOnly=true)public List<GoodsCateVo> findAllGoodsCate(Map<String, Object> paramMap){//封装返回结果List<GoodsCateVo> list=new ArrayList<GoodsCateVo>();try {//查询所有父商品分类List<GoodsCateVo> goodsParentCateList=goodsCateMapper.queryAllParentGoosCate(paramMap);if(goodsParentCateList!=null && !goodsParentCateList.isEmpty()){for(GoodsCateVo cateVo:goodsParentCateList){// 初始化变量申明GoodsCateVo vo=new GoodsCateVo();vo.setCatId(cateVo.getCatId());vo.setCatName(cateVo.getCatName());vo.setCatParentId(cateVo.getCatParentId());vo.setCatGrade(cateVo.getCatGrade());vo.setCatSort(cateVo.getCatSort());vo.setCatRate(cateVo.getCatRate());vo.setCatIsFinal(cateVo.getCatIsFinal());vo.setTypeId(cateVo.getTypeId());vo.setTypeName(cateVo.getTypeName());//子分类参数Map<String, Object> dataMap=new HashMap<String, Object>();dataMap.put("catParentId", cateVo.getCatId());//通过父分类递归子分类,最后一级不递归,商品分类是否是末级0否1是if("0".equals(cateVo.getCatIsFinal())){vo.setCateVos(findAllGoodsCate(dataMap));}list.add(vo);}}} catch (Exception e) {e.printStackTrace();LOGGER.error("查询商品分类失败"+e.getMessage(),e);}return list;}

mybatis查询:

 <!-- 根据父节点递归查询子节点 --><select id="queryAllParentGoosCate" parameterType="java.util.Map"  resultMap="goodsCateVo">select <include refid="goodsCateVo_Colimn_list" />from t_goods_category  c left join t_goods_type   t  on c.type_id=t.type_id  and  t.type_delflag='0'where   c.cat_delflag='0'  <if test="catParentId != null" >and  c.cat_parent_id=#{catParentId}</if>order by  c.cat_sort,c.cat_id</select>

实体类:

package com.qianjiang.goods.vo;import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;/*** 商品分类VO*/
public class GoodsCateVo implements Serializable{/*** 序列化*/private static final long serialVersionUID = -1362577335137261590L;/**分类ID*/private Long catId;/**分类名称*/private String catName;/**父级分类ID*/private Long catParentId;/**商品类型ID*/private Long typeId;/**类型排序*/private Integer catSort;/**层级*/private Integer catGrade;/**类型名称*/private String typeName;/**子级的CateVo集合,默认为空(这样定义是因为在js递归子分类出现异常故这样定义给个默认值)*/private List<GoodsCateVo> cateVos=new ArrayList<GoodsCateVo>(0);/**类目扣率*/private BigDecimal catRate;/**商品分类是否是末级0否1是*/private String catIsFinal;public BigDecimal getCatRate() {return catRate;}public void setCatRate(BigDecimal catRate) {this.catRate = catRate;}public Long getCatId() {return catId;}public void setCatId(Long catId) {this.catId = catId;}public String getCatName() {return catName;}public void setCatName(String catName) {this.catName = catName;}public Long getCatParentId() {return catParentId;}public void setCatParentId(Long catParentId) {this.catParentId = catParentId;}public Long getTypeId() {return typeId;}public void setTypeId(Long typeId) {this.typeId = typeId;}public Integer getCatSort() {return catSort;}public void setCatSort(Integer catSort) {this.catSort = catSort;}public Integer getCatGrade() {return catGrade;}public void setCatGrade(Integer catGrade) {this.catGrade = catGrade;}public String getTypeName() {return typeName;}public void setTypeName(String typeName) {this.typeName = typeName;}public List<GoodsCateVo> getCateVos() {return cateVos;}public void setCateVos(List<GoodsCateVo> cateVos) {this.cateVos = cateVos;}public String getCatIsFinal() {return catIsFinal;}public void setCatIsFinal(String catIsFinal) {this.catIsFinal = catIsFinal;}}

补充:

这里用到一个方法:Select下拉框onchange事件获取option的value值

jsp:

<div class="form-group"><label class="col-sm-5 control-label"> <span class="text-danger">*</span>是否末级:</label><div class="col-sm-14"> <select class="form-control w100 required" data-live-search="false" name="catIsFinal"  οnchange="changeSelect(this.options[this.options.selectedIndex].value,'cateRate_add');"><option value="">请选择</option><option value="0">否</option><option value="1" >是</option></select></div><div class="col-sm-4"></div>
</div>

js方法:

/*** select change事件* 判断是否末级,若是显示分类扣率否则不显示* catIsFinal 0否1是* @param obj select选中的值* @param divId 分类扣率divId*/
function changeSelect(obj,divId){//alert("select value:"+obj); alert("divId:"+divId);var catIsFinal=obj;if(catIsFinal=="1"){//添加验证$("#"+divId).find("select").addClass("required");$("#"+divId).find("input").addClass("required");//显示分类扣率$("#"+divId).show();}else{//移除验证$("#"+divId).find("select").removeClass("required");$("#"+divId).find("input").removeClass("required");//隐藏分类扣率$("#"+divId).hide();}
}

案例中放开alert,obj就是下拉框选中的值

java递归查询分类及分类下所有子分类相关推荐

  1. oracle 查询无限开始,Oracle无限分级下查询指定分类下所有子分类Sql

    表结构: create table "KDCategory" ( "CategoryID" INTEGER not null, "CategoryNa ...

  2. Magento获取指定分类下的所有子分类信息

    二次开发中经常遇到一种情况,就是判断一个分类是否属于某一个大的分类,而大的分类包括很多子分类成树状结构,基本的方法都是先获取大分类下的所有子分类的信息,然后再挨个比较看是否有ID和待定ID相等.一种用 ...

  3. php遍历子分类的函数,emlog程序获取主分类下的所有子分类ID函数

    emlog程序获取主分类下的所有子分类ID函数 蓝叶    网站设计    2021-01-04    208    0评论 emlog程序在制作模版时,需要增加一些自定义的列表调用,只设置主分类ID ...

  4. r读取文件夹下的所有csv文件_[R语言]读取文件夹下所有子文件夹中的excel文件,并根据分类合并。...

    解决的问题:需要读取某个大文件夹下所有子文件夹中的excel文件,并汇总,汇总文件中需要包含的2部分的信息:1.该条数据来源于哪个子文件夹:2.该条数据来源于哪个excel文件.最终,按照子文件夹单独 ...

  5. Android 开源项目分类汇总(下)

    Android 开源项目分类汇总(下) 九.ScrollView Discrollview 支持滚动时 Item 淡入淡出,平移,缩放效果的 ScrollView 项目地址:https://githu ...

  6. java递归查询公司下所有部门及子部门

    业务要求: 查询公司下所有子部门及子部门: 原型: 1.创建公司和部门实体: CompanyVos: package com.suwei.sysMng.vo;   import java.io.Ser ...

  7. Vue前台两级下拉栏分类内容

    简介 本篇主要记录一下vue中从后台获取数据后,在前台利用下拉栏对数据进行分类筛选显示 开发工具,环境 nacos,idea,springboot,vscode,vue 流程 首先背景是后台提供课程的 ...

  8. Python使用matplotlib可视化多分类变量组合下分组小提琴图、使用seaborn中的catplot函数可视化多分类变量组合下分组小提琴图(Categorical Plots)

    Python使用matplotlib可视化多分类变量组合下分组小提琴图.使用seaborn中的catplot函数可视化多分类变量组合下分组小提琴图(Categorical Plots) 目录

  9. 谷歌推出新模型「pQRNN」,少量参数下进行文本分类,性能堪比BERT

    近日,谷歌推出了新模型「pQRNN」,它是由去年推出的「PRADO」进一步使用小模型改进而得,达到了SOTA结果.pQRNN的新颖之处在于,它可以结合一个简单的映射和一个quasi-RNN编码器来进行 ...

最新文章

  1. Java内存回收机制基础[转]
  2. 显著性检验python
  3. 4.Ling初体验 匿名类型在查询表达式中的使用
  4. E0144 const char * 类型的值不能用于初始化 char * 类型的实体
  5. Spring JDBC-使用Spring JDBC获取本地连接对象以及操作BLOB/CLOB类型数据
  6. 类的继承与sizeof
  7. 关于40位MD5加密的破解
  8. 关于我喜欢计算机的作文600字,关于我喜欢的字作文600字5篇
  9. Spring事务管理介绍
  10. 使用数据库表查询的方式直接获得CRM服务订单的sold to party信息
  11. Monkey测试实例
  12. 【杭州】Hack for Cloud Beginner微软黑客松大赛
  13. atitit.userService 用户系统设计 v6 q413
  14. python调用sklearn库BP神经网络基于小样本进行痘痘预测尝试
  15. jquery学习文档
  16. pandas用法-全网最详细教程
  17. 微信打开h5链接,缓存未清除解决办法
  18. 33个CadQuery程序化建模实例
  19. R语言构建logistic回归模型并使用偏差(Deviance)和伪R方(pseudo R-squared )评估概率模型:使用sigr包快速计算偏差和伪R方、AIC赤信息指标和偏差的关系
  20. Tenacity——Exception Retry 从此无比简单

热门文章

  1. 构建线上线下一体化解决方案,旺小宝以AI赋能房企数智化营销|爱分析访谈
  2. 水果店圈子:怎么做好水果店线上营销方案,水果店线上如何做
  3. 对策论基础---其他类型对策简介
  4. 【Reinforcement Learning】蒙特卡洛算法
  5. Glide图片旋转与放大缩小
  6. mysql物理删除索引_mysql创建索引,mysql索引优化,mysql索引创建删除
  7. 用Android手机远程桌面连接登陆Windows10(用微软账号登陆),Microsoft账户登陆的计算机远程桌面连接问题
  8. pythonrender函数_Render函数
  9. Liunx树莓派(ARM)开发篇—第十四章、树莓派Linux内核编译步骤(超详细、图文结合)
  10. unity通过鼠标滑轮控制物体大小