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框架组合)的更多相关文章

  1. AJAX跨域问题解决方法(3)——被调用方解决跨域

    被调用方解决跨域是指在HTTP响应头中增加指定的字段,允许调用方调用 可以在两种地方增加1.apache/nginx(HTTP服务器)2.tomcat(应用服务器) 浏览器如何判断跨域?仔细观察可以发 ...

  2. AJAX跨域问题解决方法(4)——调用方解决跨域

    调用方解决跨域的方法只有一种,那就是隐藏跨域. 何为隐藏跨域? 隐藏跨域的核心思路是通过反向代理隐藏跨域以欺骗浏览器 什么是反向代理?反向代理是指通过中间服务器使得访问同一个域名的两个不同url最终会 ...

  3. System.Web.Http.Cors配置跨域访问的两种方式

    System.Web.Http.Cors配置跨域访问的两种方式 使用System.Web.Http.Cors配置跨域访问,众多大神已经发布了很多文章,我就不在详细描述了,作为小白我只说一下自己的使用心 ...

  4. ArcGIS API for Silverlight 调用WebService出现跨域访问报错的解决方法

    原文:ArcGIS API for Silverlight 调用WebService出现跨域访问报错的解决方法 群里好几个朋友都提到过这样的问题,说他们在Silverlight中调用了WebServi ...

  5. 转载]PhpCms V9调用指定栏目子栏目文章的两种方法

    PhpCms V9调用指定栏目子栏目文章的两种方法 第一种.直接写子栏目id ,用cat in {pc:get sql="SELECT * from v9_news where status ...

  6. shell中调用R语言并传入参数的两种步骤

    shell中调用R语言并传入参数的两种方法 第一种: Rscript myscript.R R脚本的输出 第二种: R CMD BATCH myscript.R # Check the output ...

  7. struts2+spring的两种整合方式

    也许有些人会因为学习了struts1,会以为struts2.struts1与spring的整合也是一样的,其实这两者相差甚远.下面就来讲解一下struts2与spring的整合两种方案.(部分转载,里 ...

  8. [Mugeda HTML5技术教程之16]案例分析:制作跨屏互动游戏

    本节我们将要做一个跨屏互动应用的案例分析,该应用时给一家商场做活动使用的,是一个跨屏爱消除游戏.PC端页面显示在连接在PC的大屏幕上,参与活动的玩家可以用自己的手机扫描PC端页面上的二维码,连接成功后 ...

  9. 通过微信Android和iOS版,看两大系统的差异

    由于设计师或者产品经理使用的移动设备大部分是iPhone,所以在做设计时,容易忽略Android和iOS的差异,按照自己的使用习惯进行设计,导致大部分设计师或产品经理做出的设计都是基于iOS规范或习惯 ...

随机推荐

  1. 如何在控制台切换Xcode的版本

    打开控制台,输入 xcode-select -p 你可以看到当前Xcode所使用的版本路径,比如本猫的输出为: /Applications/Xcode-beta.app/Contents/Develo ...

  2. 一个整数数组,有n个整数,如何找其中m个数的和等于另外n-m个数的和?

    int getSum(int* arr, int len) { int sum = 0; for (int i = 0; i < len; ++i) { sum += arr[i]; } ret ...

  3. 递归的神奇之处在于你会发现问题竟然解决了--解N皇后谜题有感

    看sicp看到8皇后谜题, 突然兴致来了,尝试独立解决(scheme代码的好处在于,即使你瞟了眼答案, 也不会有任何收获, 除了知道那儿有一坨神秘的括号和英文字符外但Python代码就不同了),成功了 ...

  4. JAVA通过继承Thread来创建线程

    创建一个线程的第二种方法是创建一个新的类,该类继承Thread类,然后创建一个该类的实例. 继承类必须重写run()方法,该方法是新线程的入口点.它也必须调用start()方法才能执行. 实例 // ...

  5. 无需超级用户mpi多机执行

    在之前的一篇博文中(Linux下mpi环境配置与执行步骤(Ubuntu为例) ),有讨论过如何使用MPI在两个不同的机器上执行程序,在那篇博文中使用了超级用户权限.不幸的是,有些情况下,我们不能拥有操 ...

  6. Android动态换肤(三、安装主题apk方式)

    相比之前免安装的方式,这种方法需要用户下载并安装皮肤apk,程序写起来比免安装的要简单很多,像很多系统主题就是通过这种方式实现的. 这种方式的思路是,从所有已安装的应用程序中遍历出皮肤程序(根据特定包 ...

  7. 学习TensorFlow,保存学习到的网络结构参数并调用

    在深度学习中,不管使用那种学习框架,我们会遇到一个很重要的问题,那就是在训练完之后,如何存储学习到的深度网络的参数?在测试时,如何调用这些网络参数?针对这两个问题,本篇博文主要探索TensorFlow ...

  8. linux iio子系统

    //============================================================================\\ || 系            统:W ...

  9. Oracle使用游标查询指定数据表的所有字段名称组合而成的字符串

    应用场合:参考网上查询数据表的所有字段名代码,使用游标生成指定单个表的所有字段名跟逗号组成的用于select  逗号隔开的字段名列表 from字符串等场合. 查询结果输出如下: 当前数据表TB_UD_ ...

  10. UNIX网络编程——非阻塞connect

    当在一个非阻塞的TCP套接字上调用connect时,connect将立即返回一个EINPROGRESS错误,不过已经发起的TCP三次握手继续进行.我们接着使用select检测这个连接或成功或失败的已建 ...