惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
DataBreaches.Net
IT之家
IT之家
The Cloudflare Blog
Apple Machine Learning Research
Apple Machine Learning Research
WordPress大学
WordPress大学
N
Netflix TechBlog - Medium
阮一峰的网络日志
阮一峰的网络日志
P
Proofpoint News Feed
L
LangChain Blog
博客园 - Franky
美团技术团队
J
Java Code Geeks
Microsoft Security Blog
Microsoft Security Blog
博客园 - 叶小钗
小众软件
小众软件
Y
Y Combinator Blog
B
Blog RSS Feed
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
D
Docker
Hugging Face - Blog
Hugging Face - Blog
Jina AI
Jina AI
罗磊的独立博客
大猫的无限游戏
大猫的无限游戏
Vercel News
Vercel News

秋码分享

我是如何解决将 c++ 编译成可以在 node.js 中使用的 *.node,中间出现的一大堆问题的(指纹浏览器基石篇) eSIM Plus 爱沙尼亚手机号彻底翻车?“永久有效”悄然变成了一年! 接码平台 SMS-Activate 余额可以转移到新平台使用,截止日期:2026年1月29日 是时候将 hugo-theme-kiwi 主题提交到 themes.gohugo.io 站点上了 Flux2 刚开源就凉了?Z-Image 本地部署狠狠打了个样 声音的未来:Chatterbox —— 用「夸张度旋钮」提升表现力的开源 TTS 向导 还以为那只是换个背景?Qwen-Image-Edit 在 ComfyUI 中能做到更离谱的事 Windows 结合最新版 ComfyUI 部署阿里最新开源的 Qwen-Image 图像大模型 从零样本到跨场景:Seed-VC语音转换技术的革命性突破 大语音模型轻量化革命:MegaTTS3 如何重新定义文本生成语音的技术边界(windows篇) 竞赛级编程大模型OlympicCoder-7B之本地部署(Windows篇) 阿里开源了端到端全模态大模型Qwen-2.5-Omini-7B之本地部署(windows篇) 语音识别之whisper本地部署(实时语音之开篇) 甭管是个人还是企业都能部署的Mistral-Small3.1,远超同级别的模型 文生音乐开源项目DiffRhythm,8G显存本地部署之Windows篇 阿里QwQ-32B本地部署指南:用Ollama轻松运行320亿参数大模型 基于Qwen2.5大模型的Spark-TTS,零样本语音克隆,CPU可运行之本地部署(Windows篇) 智谱开源了文生图CogView4-6B模型,支持中文提示词之本地部署(Windows篇) 基于歌词生成整首歌的开源AI音乐模型,支持中、英、日、韩等多种语言,本地化部署YuE(windows篇) 阿里云开源的文生视频万相 Wan2.1之本地部署Wan2.1-T2V-1.3B模型 互动式开源AI图像编辑神器,Windows11本地部署 MagicQuill 本地部署Qwen2.5-VL-7B-Instruct多模态视觉大模型(Windows篇) 保持角色一致性的绘本生成AI开源项目之Story-Adapter本地部署Windows篇 本地部署 Stable Diffusion 3.5(最新 ComfyUI记录篇) 谁说Win7安装不了Node.js最新版的呢?都2025年,还不更新系统到Win11 vs code远程调试Linux服务器上的php代码 浏览器定制 | Windows11 编译 Chromium 133.0.6885.0(截稿前Chromium最新版之编译篇[一]) 不说是彻底搞懂,至少让你不再惧怕c/c++指针,以及各种奇葩指针变种 解决windows下php8.x及以上版本,在Apache2.4中无法加载CURL扩展的问题 在 Windows8.1 下编译 Chromium (103.0.5060.68 之三)
Ztree整合SpringMVC实现异步加载树
一个游离于山间之上的江湖漫行者。A jungle wanderer who wanders above the mountain · 2019-04-05 · via 秋码分享

正值清明时节,天气也将开始升温了,夏天即将到来,你做好准备了吗?好了,废话少扯,切入正题,本文笔者将要讲解的是JQuery的树插件Ztree。现在web项目基本上也都是使用Ztree作为树组件进行实现的。

正值清明时节,天气也将开始升温了,夏天即将到来,你做好准备了吗?好了,废话少扯,切入正题,本文笔者将要讲解的是JQuery的树插件Ztree。现在web项目基本上也都是使用Ztree作为树组件进行实现的。 好了,来看下最终实现的效果图: img

笔者这里使用的是Mysql数据库,先创建一张表。

CREATE TABLE `city_ztree` (              
              `id` varchar(36) NOT NULL,             
              `city_name` varchar(50) DEFAULT NULL,  
              `parent_id` varchar(36) DEFAULT NULL,  
              PRIMARY KEY (`id`)                     
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8

而后插入些测试数据。

insert into `city_ztree`(`id`,`city_name`,`parent_id`) values ( '1a','福建省','0');
 insert into `city_ztree`(`id`,`city_name`,`parent_id`) values ( '2b','浙江省','0');  
 insert into `city_ztree`(`id`,`city_name`,`parent_id`) values ( '3c','广东省','0');
 insert into `city_ztree`(`id`,`city_name`,`parent_id`) values ( '4d','江苏省','0');
insert into `city_ztree`(`id`,`city_name`,`parent_id`) values ( '1a1','福州市','1a');
 insert into `city_ztree`(`id`,`city_name`,`parent_id`) values ( '1a2','厦门市','1a');
 insert into `city_ztree`(`id`,`city_name`,`parent_id`) values ( '1a3','泉州市','1a');
 insert into `city_ztree`(`id`,`city_name`,`parent_id`) values ( '1a4','漳州市','1a');
 insert into `city_ztree`(`id`,`city_name`,`parent_id`) values ( '1a5','莆田市','1a');
 insert into `city_ztree`(`id`,`city_name`,`parent_id`) values ( '1a6','宁德市','1a');
 insert into `city_ztree`(`id`,`city_name`,`parent_id`) values ( '1a7','三明市','1a');
 insert into `city_ztree`(`id`,`city_name`,`parent_id`) values ( '1a8','南平市','1a');
 insert into `city_ztree`(`id`,`city_name`,`parent_id`) values ( '1a9','龙岩市','1a');

由于篇幅原因,只截取部分数据,自己想要更多数据,可自行插入,只要id和parent_id保持上下级关系就好了。而后在创建一个与表对应的javabean实体类。

public class CityZtree {

    private String id;
    private String cityName;
    private String parentId;
    //由于篇幅原因,在此省略get/set方法
    }

img 表有了,测试数据也有了,与表对应的实体类也创建了,那现在就可以操作Dao了,来建一个Dao接口。

import com.zhenqi.entity.CityZtree;

import java.util.List;

/**
 * Created by wuming on 2019/4/5.
 */
public interface CityZtreeDao {

    /**
     * 根据父id查找树
     * @param parentId
     * @return
     */
    public List<CityZtree> findCityZtreeByParentId(String parentId);

    /**
     * 当前节点是否还有子节点
     * @param id
     * @return
     */
    public Integer hasChild(String id);
}

笔者使用的是Mybatis作为ORM,故而写上对应的xml文件,文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zhenqi.dao.CityZtreeDao">

    <resultMap id="resultCity" type="com.zhenqi.entity.CityZtree">
        <id property="id" column="id" />
        <result property="cityName" column="city_name" />
        <result property="parentId" column="parent_id" />
    </resultMap>

    <select id="findCityZtreeByParentId" parameterType="String" resultMap="resultCity">
        select * from city_ztree where parent_id=#{parentId}
    </select>

    <select id="hasChild" parameterType="String" resultType="Integer">
        select count(1) from city_ztree where parent_id=#{id}
    </select>
</mapper>

再者写个Service实现业务逻辑处理。先建个接口,然后再建个实现接口的实现类。

package com.zhenqi.service;

import com.zhenqi.entity.CityZtree;

import java.util.List;
import java.util.Map;

/**
 * Created by wuming on 2019/4/5.
 */
public interface CityZtreeService {

    public List<CityZtree> findByParentId(String parentId);

    public List<Map<String,Object>> getParent(List<CityZtree> list,String parentId);

    public boolean hasChild(String id);
}
package com.zhenqi.service.impl;

import com.zhenqi.dao.CityZtreeDao;
import com.zhenqi.entity.CityZtree;
import com.zhenqi.service.CityZtreeService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by wuming on 2019/4/5.
 */
@Service("cityZtreeService")
public class CityZtreeServiceImpl implements CityZtreeService {

    @Autowired
    private CityZtreeDao cityZtreeDao;

    @Override
    public List<CityZtree> findByParentId(String parentId) {
        if(StringUtils.isNotBlank(parentId)){
            parentId=parentId;
        }else{
            parentId="0";
        }
        return cityZtreeDao.findCityZtreeByParentId(parentId);
    }

    @Override
    public List<Map<String, Object>> getParent(List<CityZtree> list,String parentId) {
        List<Map<String,Object>> rootList=new ArrayList<>();
        for(CityZtree cityZtree : list){
            Map<String,Object> cityMap=new HashMap<>();
            cityMap.put("id",cityZtree.getId());
            cityMap.put("name",cityZtree.getCityName());
            if(StringUtils.isNotBlank(parentId)){
                cityMap.put("pId",parentId);
            }else{
                cityMap.put("pId","0");
            }
            if(hasChild(cityZtree.getId())){
                cityMap.put("isParent",true);
            }
            rootList.add(cityMap);
        }
        return rootList;
    }

    @Override
    public boolean hasChild(String id) {
        Integer count=cityZtreeDao.hasChild(id);
        if(count>0)
            return true;
        return false;
    }
}

​ 当然,是时候来写个controller类了!

package com.zhenqi.controller;

import com.zhenqi.entity.CityZtree;
import com.zhenqi.service.CityZtreeService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * Created by wuming on 2019/4/5.
 */
@Controller
@RequestMapping
public class ZtreeController {

    @Autowired
    private CityZtreeService cityZtreeService;

    @RequestMapping("/cityZtree/getCityZtree")
    @ResponseBody
    public Object getCityZtree(HttpServletRequest request, HttpServletResponse response){
        String parentId=request.getParameter("parentId");

        List<CityZtree> parentCityList=new ArrayList<>();
            parentCityList=cityZtreeService.findByParentId(parentId);
            return cityZtreeService.getParent(parentCityList,parentId);

    }
}

​ 你要事先下载好Ztree的包,在你的模板文件中引入以下文件:

<link rel="stylesheet" type="text/css" href="/static/ztree/css/metroStyle.css">
    <script type="text/javascript" src="/static/ztree/js/jquery-1.4.4.min.js"></script>
    <script type="text/javascript" src="/static/ztree/js/jquery.ztree.core-3.5.min.js"></script>
    <script type="text/javascript" src="/static/ztree/js/jquery.ztree.excheck-3.5.min.js"></script>

界面完整源码如下:

<!DOCTYPE html >
<html>
<head>
    <title>SpringMVC整合Ztree实现树异步加载</title>

    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <link rel="stylesheet" type="text/css" href="/static/ztree/css/metroStyle.css">
    <script type="text/javascript" src="/static/ztree/js/jquery-1.4.4.min.js"></script>
    <script type="text/javascript" src="/static/ztree/js/jquery.ztree.core-3.5.min.js"></script>
    <script type="text/javascript" src="/static/ztree/js/jquery.ztree.excheck-3.5.min.js"></script>
    <script type="text/javascript">
        var setting = {

            check: {
                enable: true,
                chkStyle: "radio",
                radioType: "all"
            },
            data: {
                simpleData: {
                    enable: true
                }
            }, callback: {

                onExpand: zTreeOnExpand,
                onClick: function (e, treeId, treeNode, clickFlag) {
                    $.fn.zTree.getZTreeObj("myZtree").checkNode(treeNode, !treeNode.checked, true);
                }
            }
        };

        //加载展开方法
        function zTreeOnExpand(event, treeId, treeNode) {

            var treeNodeId = treeNode.id;
            $.post(
                    '/cityZtree/getCityZtree',
                    {parentId: treeNodeId},
                    function (data) {
                        var tree = $.fn.zTree.getZTreeObj("myZtree");

                        if (!treeNode.zAsync) {
                            tree.addNodes(treeNode, data);
                            treeNode.zAsync = true;
                        } else {
                            tree.reAsyncChildNodes(treeNode, "refresh");
                        }
                    }
            );
        }

        //首次进入加载level为1的
        $(function () {
            $.post(
                    '/cityZtree/getCityZtree',
                    function (data) {
                        $.fn.zTree.init($("#myZtree"), setting, data);

                    }
            );
        });


    </script>
</head>
<body style="overflow-y: auto">
<ul id="myZtree" class="ztree"></ul>

</body>
</html>