zTree的调用设使用(跨两个系统,两类技术实现的项目案例SpringMVC+Spring+MyBatis和Struts2+Spring+ibatis框架组合)

简介: 1、从zTree官网上下载zTree的包,zTree的官方网址是:http://www.ztree.me/v3/main.php#_zTreeInfo2、引入zTree所需的依赖,例如(jQuery的js自己引入): <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <

1、从zTree官网上下载zTree的包,zTree的官方网址是:http://www.ztree.me/v3/main.php#_zTreeInfo

2、引入zTree所需的依赖,例如(jQueryjs自己引入)

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

<%@ include file="common/common.jsp"%>

 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>

    <title>My JSP 'tree.jsp' starting page</title>

    <link rel="stylesheet" type="text/css" href="${scriptsPath}/zTree/css/zTreeStyle/zTreeStyle.css"/>

   <script type="text/javascript" src="${scriptsPath}/jQuery/jquery-1.11.3.min.js" charset="utf-8"></script>

   <script type="text/javascript" src="${scriptsPath}/zTree/js/jquery.ztree.all-3.5.min.js"></script>

  </head>

 

  <body>

    <%--<div style="background:url('${imagesPath}/tree-icon/web.jpg') 0 0 no-repeat; width:100px; height:100px;"></div>--%>

   

    <input id="citySel" type="text" readonly value="" style="width:300px;" onclick="$.websiteChannel.showMenu(); return false;"/>

    <div id="menuContent" class="menuContent" style="width:300px; height:500px; display:none; background:#EFEFEF;">

      <div id="treeDemo" class="ztree" style="margin-top:0; width:180px; height: 300px;"></div>

   </div>

  

   <div id="chnlcode"></div>

   <div id="sitecode"></div>

   <div id="chnlid"></div>

   <div id="nodePath"></div>

 

    <!-- 站点栏目树对应的js -->

   <script type="text/javascript" src="${scriptsPath}/tpl/common/tree.js" charset="utf-8"></script>

  </body>

</html>

3、树的tree.js。调用如下:

$(function(){

   /*

    * name       :Zuoquan Tu

    * mail       :tuzq@XXXXXXX.cn

    * date       :2015/11/25

    * version    :1.0

    * description:

    * CopyRight (C) 2015-11

    */

   (function($){

      /**

       * 添加一个站点栏目树js对应的命名空间,避免污染其它地方的js

       */

      var targetObj = new Object;

      var targetId = '';

      $.treeMb = {

         showMenu:function(input) {

            targetObj = input;

            targetId = $(input).attr("id");

           

            var inputObj = $(input);

            var inputOffset = $(input).position();

            //alert(inputOffset.top + "," + inputOffset.left);

            $("#menuContent_mb").css({left:inputOffset.left + "px", top:inputOffset.top + inputObj.outerHeight() + "px"}).slideDown("fast");

            $("body").bind("mousedown", $.treeMb.onBodyDown);

           

            /**避免js内存溢出*/

            inputObj = null;

            inputOffset = null;

         },

         hideMenu:function() {

            $("#menuContent_mb").fadeOut("fast");

            $("body").unbind("mousedown", $.treeMb.onBodyDown);

         },

         onBodyDown:function(event) {

            if (!(event.target.id == "menuBtn" || event.target.id == "menuContent_mb" || $(event.target).parents("#menuContent_mb").length>0)) {

                $.treeMb.hideMenu();

            }

         },

         /**

          * 树被点击的时候执行的动作

          */

         onClick:function(e, treeId, treeNode) {

            var zTree = $.fn.zTree.getZTreeObj("treeDiv_mb");

            zTree.checkNode(treeNode, !treeNode.checked, null, true);

            return false;

         },

         /**

          * 树被选中时执行的事件

          */

         onCheck:function(e, treeId, treeNode) {

            var zTree = $.fn.zTree.getZTreeObj("treeDiv_mb"),

            nodes = zTree.getCheckedNodes(true),

            chnlcodeValue = "";

            sitecodeValue = "";

            chnlidValue = "";

            nodePath = "";  //显示建的专题位置,"站点"-->"最后一个栏目"的路径

            websiteId ="";

            for (var i=0, length=nodes.length; i<length; i++) {

                chnlcodeValue += nodes[i].chnlcode + ",";

                sitecodeValue += nodes[i].sitecode + ",";

                chnlidValue += nodes[i].id + ",";

            }

            if (chnlcodeValue.length > 0 )

                chnlcodeValue = chnlcodeValue.substring(0, chnlcodeValue.length-1);

            if (sitecodeValue.length > 0 )

                sitecodeValue = sitecodeValue.substring(0, sitecodeValue.length-1);

            if (chnlidValue.length > 0 )

                chnlidValue = chnlidValue.substring(0, chnlidValue.length-1);

           

           

            var pathNodes = treeNode.getPath();

            websiteId = pathNodes[0].id;

            for(var i = 0; i < pathNodes.length; i++) {

                nodePath += pathNodes[i].name + "/";

            }

           

            $("#chnlcode_mb").val(chnlcodeValue);

            $("#chnlid_mb").val(chnlidValue);

            $("#sitecode_mb").val(sitecodeValue);

            $("#siteid_mb").val(websiteId);

            $("#nodePath_mb").val(nodePath);

           

            $("#"+targetId).val(nodePath);

             $("#"+targetId).trigger("blur");

            $("#menuContent_mb").hide();

           

            chnlcodeValue = null;

            sitecodeValue = null;

            chnlidValue = null;

            nodePath = null;

            websiteId = null;

         },

         /**

          * 树被展开时执行的事件

          */

         //onExpand(event,treeId,treeNode) {

         // alert(treeNode.tId + "," + treeNode.level + "," + treeNode.name);

         //}

      };

 

      /**

       * 站点栏目树

       */

      var setting = {// 栏目树的配置

         async : {

            treeId:"website-channel-tree",//zTree 的唯一标识,初始化后,等于 用户定义的 zTree 容器的 id属性值

            enable : true,//设置zTree是否开启异步加载模式

            //autoParam:["id","isSite"],

            url : basePath + '/common/getWebsiteTree.action',//注意这里是调用后台的逻辑

            // 提交的参数

            autoParam: ["id","pid"],//异步加载时需要自动提交父节点属性的参数,这里的idpid是传递给上面的getWebsiteTree的参数

               dataFilter: function(treeId, parentNode, childNodes) {

                   if (!childNodes) return null;

                   for ( var i = 0, l = childNodes.length; i < l; i++) {

                    if (childNodes[i].isSite == 1) {

                       childNodes[i].icon = "/app-tpl-webapp/images/tree-icon/web.jpg";

                       childNodes[i].iconOpen = "/app-tpl-webapp/images/tree-icon/web.jpg";

                       childNodes[i].iconClose = "/app-tpl-webapp/images/tree-icon/web.jpg";

                    } else {

                       childNodes[i].icon = "/app-tpl-webapp/images/tree-icon/channel.jpg";

                       childNodes[i].iconOpen = "/app-tpl-webapp/images/tree-icon/channel.jpg";

                       childNodes[i].iconClose = "/app-tpl-webapp/images/tree-icon/channel.jpg";

                    }

                 }

                   return childNodes;

               }

         },

         callback: {

            onCheck: $.treeMb.onCheck, //当树被选中后执行的事件

            onClick: $.treeMb.onClick, //当树被点击后执行的事件

            onExpand:$.treeMb.onExpand //当树被展开后执行的事件

          },

          check: {

            enable: true,

            chkStyle: "radio",      //显示的是radio

            radioType: "all"

         },

          data: {

              simpleData: {

                 enable: true,

                  idKey: "id",     //定义当前显示的节点的id

                  pIdKey: "pid",   //通过定义这个id为了显示层级结构,id代表的节点将在pid的下面。

                  rootPid: "rid",          //自己定义的

                  chnlcode: "chnlcode",   //这里和json中的值相同

                  sitecode: "sitecode",   //这里和json中的值相同

                  rootPId: 0                //开始的时候定义第一级节点的pid的值为0

              }

          },

         view:{

            showIcon:true    //让图标显示

         }

      };

 

        //若有多棵树,要下面的id不同

      $.fn.zTree.init($("#treeDiv_mb"), setting);

     

      //避免js内存溢出

      setting = null;

   })(jQuery);

});

 4使用到的json类似如下(只是调用的接口不一样,json数据是一样的):

http://img.blog.csdn.net/20151126213408756?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

 5、要调用的后台的写法(下面的方式是通过Spring+SpringMVC+MyBatis的实现方式):

package com.ucap.tpl.controller.common;

XXXXXXXXXX

;

 

/**

 * CommonController.java 公用的Controller

 * @attention

 * @author toto

 * @date 2016-5-13

 * @note begin modify by 涂作权 2016-5-13 原始创建

 */

@Controller

@RequestMapping(value = "/common",

              method = {RequestMethod.GET,RequestMethod.POST})

public class CommonController extends BaseController {

 

       /**

        * 获得站点栏目树

        * @param request

        * @return

        * @attention

        * @author toto

        * @date 2016-5-13

        * @note  begin modify by 涂作权 2016-5-13  原始创建

        */

       @RequestMapping(value="/getWebsiteTree")

       @ResponseBody

       public String getWebsiteTree(HttpServletRequest request,HttpServletResponse response,

                     String id,String pid) {

              String websiteTree = null;

             

              //设置消息头信息

              setResponeInfo(response);

             

              try {

                     websiteTree = websiteService.getWebsiteTree(getSessionUserId(request),id,pid);

              } catch (Exception e) {

                     e.printStackTrace();

              }

             

              return websiteTree;

       }

}

6、要调用的第三方系统的接口写法(注意下面的实现方式是Struts2+ibatis+Spring的实现方式):

接口中的写法:

/**

 * 站点服务接口获取站点列表和单个站点信息等。

 *

 * @author toto

 *

 */

@WebService

public interface WebsiteService {

 

/**

    * 获取站点栏目树的信息

    *  

    * @param userId 用户id

    */

   public String getWebsiteTree(String userId,String id,String pid);

}

实现的方式:

@WebService(serviceName = "WebsiteService", endpointInterface = "com.ucap.wcm.WebsiteService")

public class WebsiteServiceImpl extends LoadObjectSupport implements WebsiteService {

 

/**

    * 获取站点栏目信息,用于专题

    * userId       :用户名

    * id           :点击树的时候,被点击的站点或子站点或栏目的ID

    * pid          :表示的是被点击的树节点的父节点的id

    */

   public String getWebsiteTree(String userId,String id,String pid) {     

      try {

         List<Map<String, Object>> treeNodeList = new ArrayList<Map<String, Object>>();

         List<Website> siteList = new ArrayList<Website>();

         //表示点击的是最顶层的站点

         if (Validator.isNotNull(userId) && Validator.isNull(id) && Validator.isNull(pid)) {

            try {

                //获取有权限的站点栏目树   true:表示的是只取其中一级

                siteList = getWebsiteManager().findSubWebsitesByWebsiteId(userId, null, true, null);

            } catch (WebContentManagementException e) {

                e.printStackTrace();

            }

            if (!Validator.isEmpty(siteList)) {

                for (Website website : siteList) {

                   //1:未发布;2:已签发;3:已发布;4:已删除;5:栏目撤销中;6:栏目发布失败;7:栏目撤销发布失败;8:发布中;

                   //如果删除了

                   if ("4".equals(website.getStatus())) {continue;}

                   //只取已发布的

                   //if(!"3".equals(website.getStatus())){continue;}

                   Map<String, Object> map = new HashMap<String, Object>();

                   if (website.getCodeName().equals("default")) {

                      continue;

                   }

                  

                   map.put("id", website.getWebsiteId());

                   map.put("name", website.getName());

                   map.put("pid", website.getParentWebsiteId());

                   map.put("isParent", true);

                   map.put("sitecode", website.getCodeName());

                   map.put("isSite", 1);

                   map.put("icon", "images/web.jpg");

                   map.put("iconOpen", "images/web.jpg");

                   map.put("iconClose", "images/web.jpg");

                   map.put("nocheck", "true");

 

                   treeNodeList.add(map);

                }

            }

         } else {

            List<Channel> channles = null;

           

            try {

                //若是0表示的顶层的

                if ("0".equals(pid)) {

                   //如果是顶层的,直接获得第一级的栏目列表

                   channles = getChannelManager().getAllChannelsByWebsitId(id, userId, false);

                   //channles = getChannelManager().getTopChannelsByWebsiteId(userId, id, true);

                } else {

                   channles = getChannelManager().getSubChannels(userId, id, true);

                }

                //channles = getChannelManager().getAllChannelsByWebsiteId(userId, id);

                //channles = getChannelManager().getChannel

            } catch (WebContentManagementException e1) {

                e1.printStackTrace();

            }

            if(!Validator.isEmpty(channles)){

                for (Channel channel : channles) {

                   //取出删除掉的栏目

                   if ("4".equals(channel.getStatus())) {continue;}

                   //if(!"3".equals(channel.getStatus())){continue;}//只取已发布的

                   Map<String, Object> map = new HashMap<String, Object>();

                   map.put("id", channel.getChannelId());

                   if (null == channel.getParentId() || channel.getParentId().equals("")) {

                      map.put("pid", channel.getWebsite().getWebsiteId());

                   } else {

                      map.put("pid", channel.getParentId());

                   }

 

                   map.put("name", channel.getChannelName());

                   map.put("siteid", channel.getWebsiteId());

                   map.put("isSite", 0);

                   map.put("chnlcode", channel.getCodeName());

                   map.put("sitecode", channel.getWebsite().getCodeName());

                   treeNodeList.add(map);

                }

            }

           

            QueryCondition queryCondition = new QueryCondition();

            List<Website> websites;

            try {

                websites = getWebsiteManager().findSubWebsitesByWebsiteId(userId, id, true, queryCondition);

                if (!Validator.isEmpty(websites)) {

                   for (Website website : websites) {

                      //只去掉已经删除了的

                      if ("4".equals(website.getStatus())) {continue;}

                     

                      //只取已发布的站点

                      //if(!"3".equals(website.getStatus())){continue;}

                     

                      Map<String, Object> map = new HashMap<String, Object>();

                      if (website.getCodeName().equals("default")) {

                         continue;

                      }

                      map.put("id", website.getWebsiteId());

                      map.put("name", website.getName());

                      map.put("isParent", true);

                      map.put("sitecode", website.getCodeName());

                      map.put("isSite", 1);

                      map.put("nocheck", "true");

                      treeNodeList.add(map);

                   }

                }

            } catch (WebContentManagementException e) {

                e.printStackTrace();

            }

         }

        

         return JSONArray.fromObject(treeNodeList).toString();

      } catch (Exception e) {

         e.printStackTrace();

      }

      return JSONArray.fromObject("").toString();

   }

}



目录
相关文章
|
2天前
|
前端开发 Java Apache
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
本文详细讲解了如何整合Apache Shiro与Spring Boot项目,包括数据库准备、项目配置、实体类、Mapper、Service、Controller的创建和配置,以及Shiro的配置和使用。
34 1
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
|
15天前
|
Java 数据库连接 数据库
spring复习05,spring整合mybatis,声明式事务
这篇文章详细介绍了如何在Spring框架中整合MyBatis以及如何配置声明式事务。主要内容包括:在Maven项目中添加依赖、创建实体类和Mapper接口、配置MyBatis核心配置文件和映射文件、配置数据源、创建sqlSessionFactory和sqlSessionTemplate、实现Mapper接口、配置声明式事务以及测试使用。此外,还解释了声明式事务的传播行为、隔离级别、只读提示和事务超时期间等概念。
spring复习05,spring整合mybatis,声明式事务
|
3天前
|
前端开发 Java 数据库连接
表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
本文是一份全面的表白墙/留言墙项目教程,使用SpringBoot + MyBatis技术栈和MySQL数据库开发,涵盖了项目前后端开发、数据库配置、代码实现和运行的详细步骤。
8 0
表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
|
3天前
|
Java 数据库连接 mybatis
Springboot整合Mybatis,MybatisPlus源码分析,自动装配实现包扫描源码
该文档详细介绍了如何在Springboot Web项目中整合Mybatis,包括添加依赖、使用`@MapperScan`注解配置包扫描路径等步骤。若未使用`@MapperScan`,系统会自动扫描加了`@Mapper`注解的接口;若使用了`@MapperScan`,则按指定路径扫描。文档还深入分析了相关源码,解释了不同情况下的扫描逻辑与优先级,帮助理解Mybatis在Springboot项目中的自动配置机制。
Springboot整合Mybatis,MybatisPlus源码分析,自动装配实现包扫描源码
|
15天前
|
存储 缓存 Java
在Spring Boot中使用缓存的技术解析
通过利用Spring Boot中的缓存支持,开发者可以轻松地实现高效和可扩展的缓存策略,进而提升应用的性能和用户体验。Spring Boot的声明式缓存抽象和对多种缓存技术的支持,使得集成和使用缓存变得前所未有的简单。无论是在开发新应用还是优化现有应用,合理地使用缓存都是提高性能的有效手段。
15 1
|
15天前
|
XML Java 关系型数据库
springboot 集成 mybatis-plus 代码生成器
本文介绍了如何在Spring Boot项目中集成MyBatis-Plus代码生成器,包括导入相关依赖坐标、配置快速代码生成器以及自定义代码生成器模板的步骤和代码示例,旨在提高开发效率,快速生成Entity、Mapper、Mapper XML、Service、Controller等代码。
springboot 集成 mybatis-plus 代码生成器
|
15天前
|
SQL XML Java
springboot整合mybatis-plus及mybatis-plus分页插件的使用
这篇文章介绍了如何在Spring Boot项目中整合MyBatis-Plus及其分页插件,包括依赖引入、配置文件编写、SQL表创建、Mapper层、Service层、Controller层的创建,以及分页插件的使用和数据展示HTML页面的编写。
springboot整合mybatis-plus及mybatis-plus分页插件的使用
|
15天前
|
XML Java 数据库连接
springboot中整合mybatis及简单使用
这篇文章介绍了如何在Spring Boot项目中整合MyBatis,包括依赖引入、配置数据源、创建测试表、编写Mapper接口和XML文件、以及创建Service和Controller层的步骤。
springboot中整合mybatis及简单使用
|
5月前
|
设计模式 前端开发 Java
了解 Spring MVC 架构、Dispatcher Servlet 和 JSP 文件的关键作用
Spring MVC 是 Spring 框架的一部分,是一个 Web 应用程序框架。它旨在使用 Model-View-Controller(MVC) 设计模式轻松构建Web应用程序。
94 0
|
3天前
|
存储 设计模式 前端开发
什么是SpringMVC?简单好理解!什么是应用分层?SpringMVC与应用分层的关系? 什么是三层架构?SpringMVC与三层架构的关系?
文章解释了SpringMVC的概念和各部分功能,探讨了应用分层的原因和具体实施的三层架构,以及SpringMVC与三层架构之间的关系和联系。
10 1
什么是SpringMVC?简单好理解!什么是应用分层?SpringMVC与应用分层的关系? 什么是三层架构?SpringMVC与三层架构的关系?

热门文章

最新文章

  • 1
    若依修改,集成mybatisplus报错,若依集成mybatisplus,总是找不到映射是怎么回事只要是用mp的方法就找报,改成mybatisPlus配置一定要改
    126
  • 2
    MyBatisPlus如何根据id批量查询?Required request parameter ‘id‘ for method 解决方法是看青戈大佬MybatisPlus的教程
    194
  • 3
    MybatisPlus--IService接口基本用法,MP提供了Service接口,save(T) 这里的意思是新增了一个T, saveBatch 是批量新增的意思,saveOrUpdate是增或改
    93
  • 4
    MybatisPlus介绍新增用户,根据id查询,引入MybatisPlus的起步依赖,增删改查最简单的写法
    46
  • 5
    MybatisPlus3---常用注解,驼峰转下滑线作为表明 cteateTime 数据表中的 cteate_time,@TableField,与数据库字段冲突要使用转义字符“`order`“,is
    90
  • 6
    条件构造器,MybatisPlus支持各种复杂的where条件,其实就是Wrapper,eq是等于的意思,相当于等于那个数值,ne就是不等于,gt大于的意思,ge大于等于,QueryWrapper是做
    54
  • 7
    自定义SQL,可以利用MyBatisPlus的Wrapper来构建复杂的Where条件,如何自定义SQL呢?利用MyBatisPlus的Wrapper来构建Wh,在mapper方法参数中用Param注
    128
  • 8
    支付系统----微信支付20---创建案例项目--集成Mybatis-plus的补充,target下只有接口的编译文件,xml文件了,添加日志的写法
    50
  • 9
    支付系统----微信支付19---集成MyBatis-plus,数据库驱动对应的依赖版本设置问题,5没版本没有cj这个依赖,mysql驱动默认的是版本8,这里是一个父类,数据库都有,写个父类,继承就行
    441
  • 10
    MybatisPlus添加数据数据库没有数据,数据消失,使用Navicate看不到数据,Navicate中Mysql的数据与idea的数据不一定同步,Navicate与idea的数据库同步,其实有分页
    493