zTree的调用设使用(跨两个系统,两类技术实现的项目案例SpringMVC+Spring+MyBatis和Struts2+Spring+ibatis框架组合)
1、从zTree官网上下载zTree的包,zTree的官方网址是:http://www.ztree.me/v3/main.php#_zTreeInfo
2、引入zTree所需的依赖,例如(jQuery的js自己引入):
|
<%@ 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"],//异步加载时需要自动提交父节点属性的参数,这里的id,pid是传递给上面的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、、要调用的第三方系统的接口写法(注意下面的实现方式是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(); } } |
zTree的调用设使用(跨两个系统,两类技术实现的项目案例SpringMVC+Spring+MyBatis和Struts2+Spring+ibatis框架组合)的更多相关文章
- AJAX跨域问题解决方法(3)——被调用方解决跨域
被调用方解决跨域是指在HTTP响应头中增加指定的字段,允许调用方调用 可以在两种地方增加1.apache/nginx(HTTP服务器)2.tomcat(应用服务器) 浏览器如何判断跨域?仔细观察可以发 ...
- AJAX跨域问题解决方法(4)——调用方解决跨域
调用方解决跨域的方法只有一种,那就是隐藏跨域. 何为隐藏跨域? 隐藏跨域的核心思路是通过反向代理隐藏跨域以欺骗浏览器 什么是反向代理?反向代理是指通过中间服务器使得访问同一个域名的两个不同url最终会 ...
- System.Web.Http.Cors配置跨域访问的两种方式
System.Web.Http.Cors配置跨域访问的两种方式 使用System.Web.Http.Cors配置跨域访问,众多大神已经发布了很多文章,我就不在详细描述了,作为小白我只说一下自己的使用心 ...
- ArcGIS API for Silverlight 调用WebService出现跨域访问报错的解决方法
原文:ArcGIS API for Silverlight 调用WebService出现跨域访问报错的解决方法 群里好几个朋友都提到过这样的问题,说他们在Silverlight中调用了WebServi ...
- 转载]PhpCms V9调用指定栏目子栏目文章的两种方法
PhpCms V9调用指定栏目子栏目文章的两种方法 第一种.直接写子栏目id ,用cat in {pc:get sql="SELECT * from v9_news where status ...
- shell中调用R语言并传入参数的两种步骤
shell中调用R语言并传入参数的两种方法 第一种: Rscript myscript.R R脚本的输出 第二种: R CMD BATCH myscript.R # Check the output ...
- struts2+spring的两种整合方式
也许有些人会因为学习了struts1,会以为struts2.struts1与spring的整合也是一样的,其实这两者相差甚远.下面就来讲解一下struts2与spring的整合两种方案.(部分转载,里 ...
- [Mugeda HTML5技术教程之16]案例分析:制作跨屏互动游戏
本节我们将要做一个跨屏互动应用的案例分析,该应用时给一家商场做活动使用的,是一个跨屏爱消除游戏.PC端页面显示在连接在PC的大屏幕上,参与活动的玩家可以用自己的手机扫描PC端页面上的二维码,连接成功后 ...
- 通过微信Android和iOS版,看两大系统的差异
由于设计师或者产品经理使用的移动设备大部分是iPhone,所以在做设计时,容易忽略Android和iOS的差异,按照自己的使用习惯进行设计,导致大部分设计师或产品经理做出的设计都是基于iOS规范或习惯 ...
随机推荐
- 2016年年终CSDN博客总结
2015年12月1日,结束了4个月的尚观嵌入式培训生涯,经过了几轮重重面试,最终来到了伟易达集团.经过了长达3个月的试用期,正式成为了伟易达集团的助理工程师. 回顾一年来的学习,工作,生活.各种酸甜苦 ...
- Ubuntu14下安装svn仓库,以及权限配置
sudo apt-get update 接下来安装svn apt-get install subversionapt-get install libapache2-svn 检查svn是否安装成功了: ...
- Java通过实现Runnable接口来创建线程
创建一个线程,最简单的方法是创建一个实现Runnable接口的类. 为了实现Runnable,一个类只需要执行一个方法调用run(),声明如下: public void run() 你可以重写该方法, ...
- Linux 高性能服务器编程——IP协议详解
1 IP服务特点 IP协议是TCP/IP协议族的动力,它为上层协议提供无状态.无连接.不可靠的服务. 无状态:IP通信双方不同步传输数据的状态信息,因此IP数据包的发送.传输和接收都是无序的. ...
- mysql进阶(二十七)数据库索引原理
mysql进阶(二十七)数据库索引原理 前言 本文主要是阐述MySQL索引机制,主要是说明存储引擎Innodb. 第一部分主要从数据结构及算法理论层面讨论MySQL数据库索引的数理基础. ...
- sql server中高并发情况下 同时执行select和update语句死锁问题 (二)
SQL Server死锁使我们经常遇到的问题,数据库操作的死锁是不可避免的,本文并不打算讨论死锁如何产生,重点在于解决死锁.希望对您学习SQL Server死锁方面能有所帮助. 死锁对于DBA或是数据 ...
- Android必知必会-Android Studio修改包名
如果移动端访问不佳,请尝试–> Github版 背景 公司做相似产品较多,一般都是以某个产品为基础修改,逐步替换设计图的切图.这个就会导致需要经常为Copy的项目修改包名. 这里是参考一些网上的 ...
- Android View框架总结(二)View焦点
请尊重分享成果,转载请注明出处: http://blog.csdn.net/hejjunlin/article/details/52263256 前言:View框架写到第六篇,发现前面第二篇竟然没有, ...
- C++对象模型的那些事儿之六:成员函数调用方式
前言 C++的成员函数分为静态函数.非静态函数和虚函数三种,在本系列文章中,多处提到static和non-static不影响对象占用的内存,而虚函数需要引入虚指针,所以需要调整对象的内存布局.既然已经 ...
- jquery实战---标签页效果
在前面的博客中,小编主要简单的介绍了jquery的一些基本知识,今天这篇博文,小编继续来学习jquery的相关知识,今天我们来学习一个标签页的小例子,相关源码小编已经上传,有需要的小伙伴可以自己去下载 ...