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规范或习惯 ...
随机推荐
- 详解EBS接口开发之供应商导入(补充)--错误信息处理
check reject details on records of AP_SUPPLIER_INT SELECT s.parent_table,s.reject_lookup_code,S.LAST ...
- javascript之内置函数
1.常规函数 (1)alert函数:显示一个警告对话框,包括一个OK按钮. (2)confirm函数:显示一个确认对话框,包括OK.Cancel按钮. (3)escape函数:将字符转换成Unicod ...
- EBS总账(GL)模块常用表
select * from gl_sets_of_books 总帐 select * from gl_code_combinations gcc wheregcc.summary_flag='Y ...
- TCP连接建立系列 — 客户端接收SYNACK和发送ACK
主要内容:客户端接收SYNACK.发送ACK,完成连接的建立. 内核版本:3.15.2 我的博客:http://blog.csdn.net/zhangskd 接收入口 tcp_v4_rcv |--&g ...
- javascript之页面打印
WebBrowser组件是IE内置的浏览器控件,使用时,首先要在<body>标签的下面用<object>...</object>标记声明WebBrowser组件,代 ...
- Android初级教程通过简要分析“土司”源码,来自实现定义土司理论探讨
由于系统自带的土司瞬间即逝,而且非常难看.因此我们就希望自定义自己的土司风格.有些实例就是基于自定义土司完成的,例如金山卫士的火箭发射,基本原理就是个土司.但是在做出自己的土司风格之前,还是要简要分析 ...
- 【Android应用开发】Android Studio 简介 (Android Studio Overview)
一. Intelij IDEA 环境简介 Android Studio 来源 : Android Studio 是 Intelij IDEA 的免费版本 + Android SDK 集成的; -- I ...
- 一个ExtJS实例
聊聊ExtJS 这几天接触了一个项目 前台用的是extjs 发现这个东西还是有点意思的 就把前台的部分 剥离了下来 有兴趣的朋友可以当做模板学习 不多说先上效果图 这篇文章 可以看作是ext知识的一 ...
- Linux 64位下一键安装scipy等科学计算环境
Linux 64位下一键安装scipy等科学计算环境 采用scipy.org的各种方法试过了,安装还是失败.找到了一键式安装包Anaconda,基本python要用到的库都齐了,而且还可以选择安装到其 ...
- 网页搜索之后的APP搜索
搜索技术是互联网最核心的技术之一.但是移动互联网迅猛发展的今天,互联网产生的数据已经不是简单的网页搜索所能涵盖的了.比如微信公众号,产生了许多优质的内容,如果这些公众号仅仅将这些内容发布到微信平台,那 ...