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规范或习惯 ...
随机推荐
- 如何在控制台切换Xcode的版本
打开控制台,输入 xcode-select -p 你可以看到当前Xcode所使用的版本路径,比如本猫的输出为: /Applications/Xcode-beta.app/Contents/Develo ...
- 一个整数数组,有n个整数,如何找其中m个数的和等于另外n-m个数的和?
int getSum(int* arr, int len) { int sum = 0; for (int i = 0; i < len; ++i) { sum += arr[i]; } ret ...
- 递归的神奇之处在于你会发现问题竟然解决了--解N皇后谜题有感
看sicp看到8皇后谜题, 突然兴致来了,尝试独立解决(scheme代码的好处在于,即使你瞟了眼答案, 也不会有任何收获, 除了知道那儿有一坨神秘的括号和英文字符外但Python代码就不同了),成功了 ...
- JAVA通过继承Thread来创建线程
创建一个线程的第二种方法是创建一个新的类,该类继承Thread类,然后创建一个该类的实例. 继承类必须重写run()方法,该方法是新线程的入口点.它也必须调用start()方法才能执行. 实例 // ...
- 无需超级用户mpi多机执行
在之前的一篇博文中(Linux下mpi环境配置与执行步骤(Ubuntu为例) ),有讨论过如何使用MPI在两个不同的机器上执行程序,在那篇博文中使用了超级用户权限.不幸的是,有些情况下,我们不能拥有操 ...
- Android动态换肤(三、安装主题apk方式)
相比之前免安装的方式,这种方法需要用户下载并安装皮肤apk,程序写起来比免安装的要简单很多,像很多系统主题就是通过这种方式实现的. 这种方式的思路是,从所有已安装的应用程序中遍历出皮肤程序(根据特定包 ...
- 学习TensorFlow,保存学习到的网络结构参数并调用
在深度学习中,不管使用那种学习框架,我们会遇到一个很重要的问题,那就是在训练完之后,如何存储学习到的深度网络的参数?在测试时,如何调用这些网络参数?针对这两个问题,本篇博文主要探索TensorFlow ...
- linux iio子系统
//============================================================================\\ || 系 统:W ...
- Oracle使用游标查询指定数据表的所有字段名称组合而成的字符串
应用场合:参考网上查询数据表的所有字段名代码,使用游标生成指定单个表的所有字段名跟逗号组成的用于select 逗号隔开的字段名列表 from字符串等场合. 查询结果输出如下: 当前数据表TB_UD_ ...
- UNIX网络编程——非阻塞connect
当在一个非阻塞的TCP套接字上调用connect时,connect将立即返回一个EINPROGRESS错误,不过已经发起的TCP三次握手继续进行.我们接着使用select检测这个连接或成功或失败的已建 ...