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规范或习惯 ...
随机推荐
- Android 6.0出现的init: cannot execve(‘XXX’):Permission denied问题:禁止SELINUX的权限设置
最近在开发MTK的相关项目,需要将一些可执行文件添加到init.rc文件里去,但是开机后发现,这个bin文件没有权限不能执行,于是我就在init.rc中对相应的bin文件增加了权限.后来发现,改了也没 ...
- 【完整的App项目】颖火虫笔记
这是本人花大概一个星期开发出来的一款App,这是一款类似印象笔记的App,随时记录您的生活点滴.首先说一下自己为何要开发这款App,因为自己手机系统自带的笔记应用功能太low,界面不够漂亮,所以自己就 ...
- EBS业务学习之应付INVOICE类型
INVOICE类型 类 型 描 述 标准INVOICE 是指由于采购货物或接受劳务,从供应商处取得的INVOICE (标准INVOICE,既可以和订单匹配,也可以不匹配) ...
- 安卓Button-TextView-EditText综合运用
1.如何使用安卓中的按键Button? 1.先从控件库拖一个按钮button的控件,在XML设置好宽高等参数 对应的就是Button这个图标,直接拖出来即可; 以下是设置这个按钮对应的XML代码: & ...
- ZAB协议
zookeeper依赖zab协议来实现分布式数据一致性.基于该协议,zookeeper实现了一种主备模式的系统架构来保持ZooKeeper为高可用的一致性协调框架,自然的ZooKeeper也有着一致性 ...
- ORACLE数据库学习之备份与恢复
oracle数据库的备份与恢复 第一部分:数据库的备份 备份的必要性 因为各种人为或外界的因素可能会造成数据库中灾难性的数据丢失,为了保证数据库中数据的安全,必须采取备份措施保证RDBMS中包含 ...
- 06 Activity OnNewIntent方法
OnNewIntent方法:该方法体现在Activity的启动模式上 如sigleTop上: X这个Activity启动模式为sigleTop,Y这个Activity启动模式为stdanderd 那么 ...
- Android的AdapterView及其子类简介-android学习之旅(二十三)
AdapterView简介 AdapterView组件是一类非常重要的组件,AdapterView本身是一根抽象基类,继承于ViewGroup,用法十分相似,只是显示形式不一样,因此同意讲解. Ada ...
- JPA(三)之实体关系一对多(多对一)
1.背景介绍: 对于购买商品时,订单信息(Order)和订单商品信息(OrderItem)的关系就是一对多的关系. 2.实体bean: Order.java代码 ? 1 2 3 4 5 6 7 ...
- Aandroid TV 基于Leanback支持最新MD设计的TV开发框架
原文地址:http://blog.csdn.net/sk719887916 作者:skay 基于6.0最新的API 支持TV的框架 Android 6.0已完美支持TV开发,之前的5.0后Recycl ...