树形菜单的实现.doc

合集下载

html js树形折叠菜单实例

html js树形折叠菜单实例

html js树形折叠菜单实例HTML JS Treeview 可以帮助您在网站上创建一个树形折叠菜单。

以下是一个简单的示例:HTML代码:```html<!DOCTYPE html><html><head><title>Treeview Example</title><style>ul.treeview {list-style-type: none;padding: 0;margin: 0;}ul.treeview li {padding: 5px;position: relative;}ul.treeview li.expandable:before {content: '\25B6';position: absolute;left: -10px;}ul.treeview li.collapsible:before {content: '\25BC';position: absolute;left: -10px;}ul.treeview li ul {display: none;margin-left: 20px;}</style></head><body><ul class="treeview"><li class="expandable">Item 1<ul><li>Sub-item 1</li><li>Sub-item 2</li><li>Sub-item 3</li></ul></li><li class="expandable">Item 2<ul><li>Sub-item 1</li><li>Sub-item 2</li></ul></li><li>Item 3</li></ul><script>var expandableItems = document.querySelectorAll('.expandable');for (var i = 0; i < expandableItems.length; i++) {expandableItems[i].addEventListener('click', function() {var submenu = this.querySelector('ul');if (submenu.style.display === "block") {submenu.style.display = "none";this.classList.remove('collapsible');this.classList.add('expandable');} else {submenu.style.display = "block";this.classList.remove('expandable');this.classList.add('collapsible');}});}</script></body></html>```上述示例中,我们首先在`<ul>`元素上添加了一个名为`treeview`的类。

java实现遍历树形菜单两种实现代码分享

java实现遍历树形菜单两种实现代码分享

java实现遍历树形菜单两种实现代码分享⽂本主要向⼤家分享了java实现遍历树形菜单的实例代码,具体如下。

OpenSessionView实现:package org.web;import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import org.dao.BaseHibernateDao;import org.hibernate.Hibernate;import org.hibernate.Session;import org.hibernate.Transaction;public class OpenSessionView extends BaseHibernateDao implements Filter {/**(⾮ Javadoc)* <p>Title: destroy</p>* <p>Description(描述): </p>* @see javax.servlet.Filter#destroy()*/@Overridepublic void destroy() {// TODO Auto-generated method stub}/**(⾮ Javadoc)* <p>Title: doFilter</p>* <p>Description(描述): </p>* @param arg0* @param arg1* @param arg2* @throws IOException* @throws ServletException* @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)*/@Overridepublic void doFilter(ServletRequest arg0, ServletResponse arg1,FilterChain arg2) throws IOException, ServletException {Session session = null;Transaction tx = null;try {session = getSession();tx = session.beginTransaction();arg2.doFilter(arg0, arg1);mit();}catch (Exception e) {e.printStackTrace();tx.rollback();}finally{closeSession();}}/**(⾮ Javadoc)* <p>Title: init</p>* <p>Description(描述): </p>* @param arg0* @throws ServletException* @see javax.servlet.Filter#init(javax.servlet.FilterConfig)*/@Overridepublic void init(FilterConfig arg0) throws ServletException {// TODO Auto-generated method stub}}TreeAction实现package org.web;import net.sf.json.JSONArray;import net.sf.json.JSONObject;import org.Service.IVoteTreeService;import org.Service.impl.VoteTreeServiceImpl;import com.alibaba.fastjson.JSON;import com.opensymphony.xwork2.ActionSupport;public class TreeAction extends ActionSupport {private JSONArray treejson;private IVoteTreeService voteService = new VoteTreeServiceImpl();public String getTree(){treejson = voteService.getTreeJson();return SUCCESS;}public JSONArray getTreejson() {return treejson;}public void setTreejson(JSONArray treejson) {this.treejson = treejson;}}总结以上就是本⽂关于java实现遍历树形菜单两种实现代码分享的全部内容,希望对⼤家有所帮助。

Vue2实现树形菜单(多级菜单)功能模块

Vue2实现树形菜单(多级菜单)功能模块

Vue2实现树形菜单(多级菜单)功能模块结构⽰意图1. ├── index.html2. ├── main.js3. ├── router4. │└── index.js # 路由配置⽂件5. ├── components # 组件⽬录6. │├── App.vue # 根组件7. │├── Home.vue # ⼤的框架结构组件8. │├── TreeView.vue9. │├── TreeViewItem.vue10. │└── TreeDetail.vue11. ├── store12. ├── index.js # 我们组装模块并导出 store 的地⽅13. ├── modules # 模块⽬录14. └── menusModule.js # 菜单模块这个多级菜单实现的功能如下:1、可展⽰多级菜单,理论上可以展⽆限级菜单2、当前菜单⾼亮功能3、刷新后依然会⾃动定位到上⼀次点击的菜单,即使这个是⼦菜单,并且⽗菜单会⾃动展开4、⼦菜单的显⽰隐藏有收起、展开,同时带有淡⼊效果这个例⼦⽤到的知识点:路由、状态管理、组件。

状态管理安装:1. npm install --save vuex更多关于 vuex 的介绍可以看官⽅⽂档:。

我们先来看看效果演⽰图:程序员是⽤代码来沟通的,所以费话不多说,直接上码:index.html1. <!DOCTYPE html>2. <html>3. <head>4. <meta charset="utf-8">5. <meta name="viewport" content="width=device-width,initial-scale=1.0">6. <title>Vue 实现树形菜单(多级菜单)功能模块- 云库⽹</title>7. </head>8. <body>9. <div id="app"></div>10. </body>11. </html>main.js1. import Vue from 'vue'2. import App from './components/App'3. import router from './router'4. import store from './store/index'5. Vue.config.productionTip = false6. /* eslint-disable no-new */7. new Vue({8. el: '#app',9. router,10. store,11. components: {12. App13. },14. template: '<App/>'15. })在 main.js 中引⼊路由和状态管理配置App.vue1. <template>2. <div id="app">3. <Home></Home>4. </div>5. </template>6. <script>7. import Home from "./Home";8. export default {9. components: {10. Home11. },12. name: "App"13. };14. </script>15. <style>16. * {17. padding: 0;18. margin: 0;19. }20. #app {21. font-family: "Avenir", Helvetica, Arial, sans-serif;22. -webkit-font-smoothing: antialiased;23. -moz-osx-font-smoothing: grayscale;24. color: #2c3e50;25. }26. html,27. body,28. #app,29. .home {30. height: 100%;31. }32. html,33. body {34. overflow: hidden;35. }36. </style>Home.vue1. <template>2. <div class="home">3. <div class="side-bar">4. <Tree-view></Tree-view>5. </div>6. <div class="continer">7. <router-view></router-view>8. </div>9. </div>10. </template>11. <script>12. import TreeView from "./TreeView";13. export default {14. components: {15. TreeView16. },17. name: "Home"18. };19. </script>20. <style scoped>21. .side-bar {22. width: 300px;23. height: 100%;24. overflow-y: auto;25. overflow-x: hidden;26. font-size: 14px;27. position: absolute;28. top: 0;29. left: 0;30. }31. .continer {32. padding-left: 320px;33. }34. </style>这个 Home.vue 主要是⽤来完成页⾯的⼤框架结构。

unitreemenu的创建与使用

unitreemenu的创建与使用

一、单位树形菜单的定义单位树形菜单是一种用于展示组织结构或分类信息的界面元素,通常呈现为树状结构,方便用户查看和操作。

在实际应用中,单位树形菜单常用于企业管理系统、组织架构展示、文件目录结构等场景。

二、单位树形菜单的创建1. 数据准备在创建单位树形菜单之前,首先需要准备好相应的数据。

这些数据通常包括单位的名称、单位的编号、单位的上级单位编号等信息。

根据具体情况,还可以包括单位的层级关系、单位的扩展信息等内容。

2. 数据结构设计根据准备好的数据,需要设计单位树形菜单所需的数据结构。

通常可以采用树形结构,利用父子关系来组织单位的层级结构。

3. 数据库建模将设计好的数据结构映射到数据库中,创建相应的表格和字段,存储单位树形菜单所需的数据。

4. 后端接口开发在后端系统中,需要开发相应的接口,用于查询、新增、编辑、删除单位信息,并支持树形结构的展示和操作。

5. 前端界面开发在前端界面中,需要创建相应的组件或界面元素,用于展示单位树形菜单,并实现对单位信息的增删改查等操作。

6. 数据关联将后端接口和前端界面进行关联,实现数据的双向绑定,以便实现单位树形菜单的展示和操作。

三、单位树形菜单的使用1. 数据加载与展示在页面加载时,通过后端接口查询单位的数据,并根据数据结构构建树形菜单。

通常可以采用递归的方式,遍历整个单位数据树,生成对应的界面元素。

2. 节点操作用户可以通过点击单位节点来展开或收起子级节点,实现对单位层级结构的查看和导航。

3. 编辑操作单位树形菜单通常会提供编辑功能,允许用户新增、编辑或删除单位信息。

用户可以通过右键菜单或相应的操作按钮来进行相关操作。

四、单位树形菜单的优化1. 数据异步加载当单位数据较大时,可以采用异步加载的方式,根据用户操作动态加载数据,提升页面加载速度和交互体验。

2. 数据缓存可以对单位数据进行缓存,减少对后端接口的频繁请求,提高系统的响应速度。

3. 数据筛选与搜索为了方便用户查找特定的单位信息,可以提供筛选条件和搜索功能,帮助用户快速定位目标单位。

js实现树级递归,通过js生成tree树形菜单(递归算法)

js实现树级递归,通过js生成tree树形菜单(递归算法)
} const treeData = toTreeByRecursion(jsonData, 'id', 'parentId', null, 'children', treeOption) console.log(treeData)
说明:
parentIdNoneValue 父级标识空值这个参数如果跟你数据无父级时的值不一致时,就配置这个参数。比如:这里默认值为null,你根节点parentId的值为-1或''。 treeOption 参数可以不传,如果要绑定tree树形控件(一般都会有key、value、title这三个字段),那就需要配置这个参数,如果参数默认的配置跟你的不一样,那就通过参数覆盖的方式重新定 义。 treeOption 的三个绑定字段是指绑定你数据中的字段,实质就是把原数据字段绑定的tree树形控件需要的三个字段key、value、title。 想到了再补充。。。
return parent[parentIdField] === parentIdNoneValue // 返回第一层 }) }
使用示例:
var jsonData = [ { id: '1', name: '1', parentId: null, rank: 1 }, { id: '2', name: '1-1', parentId: '1', rank: 1 }, { id:ห้องสมุดไป่ตู้'3', name: '1-2', parentId: '1', rank: 1 },
const treeOption = { enable: false, // 是否开启转tree插件数据 keyField: 'key', // 标识字段名称 valueField: 'value', // 值字段名称 titleField: 'title', // 标题字段名称 keyFieldBind: 'id', // 标识字段绑定字段名称 valueFieldBind: 'id', // 值字段名称绑定字段名称 titleFieldBind: 'name' // 标题字段名称绑定字段名称

基于ExtJS的权限树形菜单实现

基于ExtJS的权限树形菜单实现

v i s u a l p a g e d i s p l a y f o r m, Ex OS a s a e x c e l l e n t p r e s e n t a t i o n l a y e r t e c h n i q u e , c a n i mp l e me n t i r c h f r o n t p a g e e f e c t . T h i s p a p e r a n ly a s e a n d d e s i g n s y s t e m p e m i r s s i o n, a n d u s e E x dS t o i mp l e me n t a p e r mi s s i o n t r e e me n u i n e x a m s y s t e m. Ke y wo r d s :E x dS t e c h n o l o g y; P e m i r s s i o n; T r e e Me n u; E x a m S y s t e m
1 引 一 直 是 应 用 系 统 中 不 可 缺 少 的 一 个 部 分 ,系 统 用 户 很 多 ,系 统 功 能 也 很 多 ,不 同用 户 对 系 统 功 能 的需 求 不 同 ,出 于 安 全 等 考 虑 ,关 键 的 、 重 要 的 系 统 功 能 需 限 制 部 分 用 户 的 使 用 , 出 于 方 便 性 考 虑 .系 统 功 能 需 要 根 据 不 同 的用 户 而 进 行 定 制 。
非常麻烦[ 3 1 。E x O S中提 供 了现 存 的树 控 件 ,通 过 这 些 控 件 可 以在 B , s应用 中快 速 开 发 出包 含 树 结 构 信 息 的应 用 .并 且 通 过 对E x O S的简 单 配 置 ,使 得 应 用 程 序 能 够 方 便 灵 活 地 兼 容 各 种 浏览器。

vue实现带复选框的树形菜单

vue实现带复选框的树形菜单

vue实现带复选框的树形菜单本⽂实例为⼤家分享了vue实现带复选框的树形菜单展⽰的具体代码,供⼤家参考,具体内容如下代码:<template><div id="checkTree"><div class="tree-box"><div class="zTreeDemoBackground left"><ul id="treeDemo" class="ztree"></ul></div></div></div></template><script>export default {name: 'checkTree',components:{},data:function(){return{setting:{check: {enable: true,nocheckInherit: false},data: {simpleData: {enable: true}}},zNodes:[{ id:1,pid:0,name:"⼤良造菜单",open:true,nocheck:false,children: [{ id:11,pid:1,name:"当前项⽬"},{ id:12,pid:1,name:"⼯程管理",open:true,children: [{ id:121,pid:12,name:"我的⼯程"},{ id:122,pid:12,name:"施⼯调度"},{ id:1211,pid:12,name:"材料竞价"}]},{ id:13,pid:1,name:"录⼊管理",open:true,children: [{ id:131,pid:13,name:"⽤⼯录⼊"},{ id:132,pid:13,name:"商家录⼊"},{ id:1314,pid:13,name:"机构列表"}]},{ id:14,pid:1,name:"审核管理",open:true,children: [{ id:141,pid:14,name:"⽤⼯审核"},{ id:142,pid:14,name:"商家审核"},{ id:145,pid:14,name:"机构审核"}]},{ id:15,pid:1,name:"公司管理",open:true,children: [{ id:1517,pid:15,name:"我的⼯程案例"},{ id:1518,pid:15,name:"联系⼈设置"},{ id:1519,pid:15,name:"⼴告设置"}]},{ id:16,pid:1,name:"业务管理",open:true,children: [{ id:164,pid:16,name:"合同范本"},{ id:165,pid:16,name:"合同列表"},{ id:166,pid:16,name:"需求调度"}]},{ id:17,pid:1,name:"订单管理",open:true,children: [{ id:171,pid:17,name:"商品订单"},{ id:172,pid:17,name:"⽤⼯订单"},{ id:175,pid:17,name:"供应菜单"}]},{ id:18,pid:1,name:"我的功能",open:true,children: [{ id:181,pid:18,name:"免费设计"},{ id:182,pid:18,name:"装修报价"},{ id:1817,pid:18,name:"项⽬⽤⼯"}]},{ id:19,pid:1,name:"分润管理",open:true,children: [{ id:191,pid:19,name:"分润列表"}]},{ id:110,pid:1,name:"运营管理",open:true,children: [{ id:1101,pid:110,name:"代理列表"},{ id:1102,pid:110,name:"代售商品"}]},]}]}},methods:{},mounted(){$.fn.zTree.init($("#treeDemo"), this.setting, this.zNodes);}}</script><style>@import '../../../plugins/ztree/zTreeStyle.css';</style>以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

vue3element树型

vue3element树型

Vue3 Element树型菜单实现方式如下:1. 安装Element UI库```shellnpm install element-plus --save```2. 引入Element UI库```import { createApp } from 'vue'import App from './App.vue'import ElementPlus from 'element-plus'import 'element-plus/lib/theme-chalk/index.css'const app = createApp(App)e(ElementPlus)app.mount('#app')```3. 在组件中使用Element UI树形菜单组件el-tree。

```html<template><el-tree :data="treeData" node-key="id"></el-tree></template><script>export default {data() {return {treeData: [{ id: 1, label: '节点1', children: [{ id: 4, label: '子节点1-1' }] },{ id: 2, label: '节点2', children: [{ id: 5, label: '子节点2-1' }, { id: 6, label: '子节点2-2' }] },{ id: 3, label: '节点3', children: [{ id: 7, label: '子节点3-1' }] }]}}}</script>以上代码中,`el-tree`组件的`data`属性用于设置树形菜单的数据,`node-key`属性用于指定节点的唯一标识符。

jsp树形菜单完整代码及截图

jsp树形菜单完整代码及截图

<html><head><style>#d1{width:200;height:400;background-color:#cccccc;border:2px solid black;left:30;top:30;position:absolute;}#d1_head{height:30;background-color:blue;color:white;font-size:20pt;}#d1_body{background-color:#cccccc;}.list li{list-style-type:none}.image image:向下.png;</style><script>function doAction(index){var obj = document.getElementById('u' + index);if(obj.style.display == 'none'){obj.style.display = 'block';if(index=='1'){document.getElementById("img1").src='向下.png';}else{document.getElementById("img2").src='向下.png';}}else{obj.style.display = 'none';if(index=='1'){document.getElementById("img1").src='向右.png';}else{document.getElementById("img2").src='向右.png';}}}function test(){var obj = document.getElementById('l1');alert(obj.innerHTML);}</script></head><body style="font-size:20pt;"><div id="d1"><div id="d1_head">树形菜单</div><ul class="list"><li><span onclick="doAction(1);"><img src="向右.png" id="img1"/>羽绒专区</span> </li><ul style="display:none;" id="u1"><li><a href="#">羽绒服</a></li><li><a href="#">羽绒夹克</a></li></ul><li><span onclick="doAction(2);"><img src="向右.png" id="img2"/>靴子专区</span> </li><ul style="display:none;" id="u2"><li><a href="#">雪地靴</a></li><li><a href="#">登山靴</a></li></ul></ul></div></div></body></html>下载两个指向不同的小图标用于区分。

Unity UGUI自定义树形菜单(TreeView)

Unity UGUI自定义树形菜单(TreeView)

Unity UGUI自定义树形菜单(TreeView)如果你需要的也是这种效果,那你就来对地方了!目前,我们这个树形菜单展现出来的功能如下:1、可以动态配置数据源;2、点击每个元素的上下文菜单按钮(也就是图中的三角形按钮),可以收缩或展开它的子元素;3、可以单独判断某一元素的复选框是否被勾选,或者直接获取当前树形菜单中所有被勾选的元素;4、树形菜单统一控制其下所有子元素按钮的事件分发;5、可自动调节的滚动视野边缘,根据当前可见的子元素数量进行横向以及纵向的伸缩;一、首先,我们先制作子元素的模板(Template),也就是图中菜单的单个元素,用它来根据数据源动态克隆出多个子元素,这里的话,很显然我们的模板是由两个Button加一个Toggle和一个Text组成的,如下:二、我们的每个子元素都会携带一个TreeViewItem脚本,用于描述自身在整个树形菜单中与其他元素的父子关系,而整个树形菜单的控制由TreeViewControl来实现,首先,TreeViewControl会根据提供的数据源来生成所有的子元素,当然,改变数据源之后进行重新生成的时候也是这个方法,干的事情很简单,就是用模板不停的创建元素,并给他们建立父子关系:[csharp] view plain copy/// <summary>/// 生成树形菜单/// </summary>public void GenerateTreeView(){//删除可能已经存在的树形菜单元素if (_treeViewItems != null){for (int i = 0; i < _treeViewItems.Count; i++){Destroy(_treeViewItems[i]);}_treeViewItems.Clear();}//重新创建树形菜单元素_treeViewItems = new List<GameObject>();for (int i = 0; i < Data.Count; i++){GameObject item = Instantiate(Template);if (Data[i].ParentID == -1){item.GetComponent<TreeViewItem>().SetHierarchy(0);item.GetComponent<TreeViewItem>().SetParent(null);}else{TreeViewItem tvi = _treeViewItems[Data[i].ParentID].GetComponent<TreeViewItem>();item.GetComponent<TreeViewItem>().SetHierarchy(tvi.GetHierarchy() + 1);item.GetComponent<TreeViewItem>().SetParent(tvi);tvi.AddChildren(item.GetComponent<TreeViewItem>());} = "TreeViewItem";item.transform.FindChild("TreeViewText").GetComponent<Text>().text = Data[i].Name;item.transform.SetParent(TreeItems);item.transform.localPosition = Vector3.zero;item.transform.localScale = Vector3.one;item.transform.localRotation = Quaternion.Euler(Vector3.zero);item.SetActive(true);_treeViewItems.Add(item);}}三、树形菜单生成完毕之后此时所有元素虽然都记录了自身与其他元素的父子关系,但他们的位置都是在Vector3.zero的,毕竟我们的菜单元素在创建的时候都是一股脑儿的丢到原点位置的,创建君可不管这么多元素挤在一堆会不会憋死,好吧,之后规整列队的事情就交给刷新君来完成了,刷新君玩的一手好递归,它会遍历所有元素并剔除不可见的元素(也就是点击三角按钮隐藏了),并将它们一个一个的重新排列整齐,子排在父之后,孙排在子之后,以此类推......它会遍历每个元素的子元素列表,发现子元素可见便进入子元素列表,发现孙元素可见便进入孙元素列表:[csharp] view plain copy/// <summary>/// 刷新树形菜单/// </summary>public void RefreshTreeView(){_yIndex = 0;_hierarchy = 0;//复制一份菜单_treeViewItemsClone = new List<GameObject>(_treeViewItems);//用复制的菜单进行刷新计算for (int i = 0; i < _treeViewItemsClone.Count; i++){//已经计算过或者不需要计算位置的元素if (_treeViewItemsClone[i] == null || !_treeViewItemsClone[i].activeSelf){continue;}TreeViewItem tvi = _treeViewItemsClone[i].GetComponent<TreeViewItem>();_treeViewItemsClone[i].GetComponent<RectTransform>().localPosition = new Vector3(tvi.GetHierarchy() * HorizontalItemSpace, _yIndex,0);_yIndex += (-(ItemHeight + VerticalItemSpace));if (tvi.GetHierarchy() > _hierarchy){_hierarchy = tvi.GetHierarchy();}//如果子元素是展开的,继续向下刷新if (tvi.IsExpanding){RefreshTreeViewChild(tvi);}_treeViewItemsClone[i] = null;}//重新计算滚动视野的区域float x = _hierarchy * HorizontalItemSpace + ItemWidth;float y = Mathf.Abs(_yIndex);transform.GetComponent<ScrollRect>().content.sizeDelta = new Vector2(x, y);//清空复制的菜单_treeViewItemsClone.Clear();}/// <summary>/// 刷新元素的所有子元素/// </summary>void RefreshTreeViewChild(TreeViewItem tvi){for (int i = 0; i < tvi.GetChildrenNumber(); i++){tvi.GetChildrenByIndex(i).gameObject.GetComponent<RectTransform>().localPosition = new Vector3(tvi.GetChildrenByIndex(i).GetHierarchy() * HorizontalItemSpace, _yIndex, 0);_yIndex += (-(ItemHeight + VerticalItemSpace));if (tvi.GetChildrenByIndex(i).GetHierarchy() > _hierarchy){_hierarchy = tvi.GetChildrenByIndex(i).GetHierarchy();}//如果子元素是展开的,继续向下刷新if (tvi.GetChildrenByIndex(i).IsExpanding){RefreshTreeViewChild(tvi.GetChildrenByIndex(i));}int index = _treeViewItemsClone.IndexOf(tvi.GetChildrenByIndex(i).gameObject);if (index >= 0){_treeViewItemsClone[index] = null;}}}我这里将所有的元素复制了一份用于计算位置,主要就是为了防止在进行一轮刷新时某个元素被访问两次或以上,因为刷新的时候会遍历所有可见元素,如果第一次访问了元素A(元素A的位置被刷新),根据元素A的子元素列表访问到了元素B(元素B的位置被刷新),一直到达子元素的底部后,当不存在更深层次的子元素时,那么返回到元素A之后的元素继续访问,这时在所有元素列表中元素B可能在元素A之后,也就是说元素B已经通过父元素访问过了,不需要做再次访问,他的位置已经是最新的了,而之后根据列表索引很可能再次访问到元素B,如果是这样的话元素B的位置又要被刷新一次,甚至多次,性能影响不说,第二次计算的位置已经不是正确的位置了。

多叉树结合JavaScript树形控件实现无限级树形菜单(一种构建多级有序树形结构JSON(或XML)数据源的方法)

多叉树结合JavaScript树形控件实现无限级树形菜单(一种构建多级有序树形结构JSON(或XML)数据源的方法)

多叉树结合JavaScript树形控件实现无限级树形菜单(一种构建多级有序树形结构JSON(或XML)数据源的方法)一、问题研究的背景和意义在Web应用程序开发领域,基于AJAX技术的JavaScript树形控件已经被广泛使用,它用来在Html页面上展现具有层次结构的数据项。

目前市场上常见的JavaScript框架及组件库中均包含自己的树形控件,例如JQuery、Dojo、Yahoo UI、Ext JS等,还有一些独立的树形控件,例如dhtmlxtree等,这些树形控件完美的解决了层次数据的展示问题。

展示离不开数据,树形控件主要利用AJAX技术从服务器端获取数据源,数据源的格式主要包括JSON、XML等,而这些层次数据一般都存储在数据库中。

“无限级树形菜单”,顾名思义,没有级别的限制,它的数据通常来自数据库中的无限级层次数据,这种数据的存储表通常包括id和parentId这两个字段,以此来表示数据之间的层次关系。

现在问题来了,既然树形控件的数据源采用JSON或XML等格式的字符串来组织层次数据,而层次数据又存储在数据库的表中,那么如何建立起树形控件与层次数据之间的关系,换句话说,如何将数据库中的层次数据转换成对应的层次结构的JSON或XML格式的字符串,返回给客户端的JavaScript 树形控件?这就是我们要解决的关键技术问题。

本文将以目前市场上比较火热的Ext JS框架为例,讲述实现无限级树形菜单的方法,该方法同样适用于其它类似的JS树形控件。

Ext JS框架是富客户端开发中出类拔萃的框架之一。

在Ext的UI控件中,树形控件无疑是最为常用的控件之一,它用来实现树形结构的菜单。

TreeNode用来实现静态的树形菜单,AsyncTreeNode用来实现动态的异步加载树形菜单,后者最为常用,它通过接收服务器端返回来的JSON格式的数据,动态生成树形菜单节点。

动态生成树有两种思路:一种是一次性生成全部树节点,另一种是逐级加载树节点(利用AJAX,每次点击节点时查询下一级节点)。

BootStrapJstree树形菜单的增删改查的实现源码

BootStrapJstree树形菜单的增删改查的实现源码

BootStrapJstree树形菜单的增删改查的实现源码1.⾸先需下载jstree的插件点击打开链接2.在页⾯引⼊插件js⽂件css⽂件<link rel="stylesheet" href="plugins/jstree/themes/classic/style.css" rel="external nofollow" ><script type="text/javascript" src="plugins/jstree/_lib/jquery.js"></script><script type="text/javascript"src="plugins/jstree/_lib/jquery.cookie.js"></script><script type="text/javascript"src="plugins/jstree/_lib/jquery.hotkeys.js"></script><script type="text/javascript" src="plugins/jstree/jquery.jstree.js"></script>3.初始化控件1)html<div id="demo2" class="demo" style="height:100px;"></div>2)js 使⽤ demo2来初始化树形控件<script type="text/javascript" class="source below">$(function() {$("#demo2").jstree({"json_data" : {"ajax" : {"url" : "http://localhost:8080/MemberManager/DepartmentTreeJson","data" : function(n) {// the result is fed to the AJAX request `data` optionreturn {"operation" : "get_children","id" : n.attr ? n.attr("id").replace("node_",""): 1};}}},"plugins" : ["themes","json_data","ui","crrm","contextmenu","search" ],}).bind("loaded.jstree",function(event, data) {}).bind("select_node.jstree",function(event, data) {if (data.rslt.obj.attr("id") != undefined) {}}).bind("remove.jstree",function(e, data) {data.rslt.obj.each(function() {$.ajax({async : false,type : 'POST',url : "http://localhost:8080/MemberManager/CreateNodeForDepartment",data : {"operation" : "remove_node","id" : this.id.replace("node_", "")},success : function(r) {if (!r.status) {data.inst.refresh();}}});});}).bind("remove.jstree",function(e, data) {data.rslt.obj.each(function() {$.ajax({async : false,type : 'POST',url : "http://localhost:8080/MemberManager/CreateNodeForDepartment", data : {"operation" : "remove_node","id" : this.id.replace("node_","")},success : function(r) {if (!r.status) {data.inst.refresh();}}});});}).bind("create.jstree",function(e, data) {$.post("http://localhost:8080/MemberManager/CreateNodeForDepartment",{"operation" : "create_node","id" : data.rslt.parent.attr("id").replace("node_",""),"position" : data.rslt.position,"title" : ,"type" : data.rslt.obj.attr("rel")},function(r) {if (r.status) {$(data.rslt.obj).attr("id", "node_" + r.id);} else {data.inst.refresh();$.jstree.rollback(data.rlbk);}});}).bind("rename.jstree",function(e, data) {$.post("http://localhost:8080/MemberManager/CreateNodeForDepartment",{"operation" : "rename_node","id" : data.rslt.obj.attr("id").replace("node_",""),"title" : data.rslt.new_name},function(r) {if (!r.status) {data.inst.refresh();$.jstree.rollback(data.rlbk);}});})// 1) the loaded event fires as soon as data is parsed and inserted// 2) but if you are using the cookie plugin or the core `initially_open` option:.one("reopen.jstree",function(event, data) {})// 3) but if you are using the cookie plugin or the UI `initially_select` option:.one("reselect.jstree",function(event, data) {});});</script></pre>4.代码解析<p></p><p><pre name="code" class="java">import java.util.List;public class Department {// 部门idprivate String departmentid;// 部门名称private String name;// ⽗级部门IDprivate String parentid;//同级之间的排序。

word中插入树状图的两种方法

word中插入树状图的两种方法

word中插入树状图的两种方法相信很多人在日常生活中都见到过树状图,在我们工作生活学习中也会用这种树状图来归纳概括理清一些东西,因此掌握在电脑办公软件中插入这样的图示就显得非常重要,那么下面就由店铺给大家分享下word中插入树状图的技巧,希望能帮助到您。

word中插入树状图方法一:步骤一:打开word,在最上面的标题里找到“插入”,然后在“插入”中找到“smartart”。

步骤二:点击”smartart“后会出现这样的界面,然后根据自己的需要去找到相应的格式,本文以做树形图为例子。

步骤三:找到“层次结构”然后找到相应的理想形状。

步骤四:根据我所选的形状出现这样界面步骤五:如果你对系统默认的形状不满意,可以点击相应的对话框,鼠标右键,会出现这样的菜单,找到图片表明地方,可以选择形状步骤六:有时候我们需要增加他的长短,可以点击相应的对话框,鼠标右键,会出现这样的菜单,找到图片表明地方,可以选择步骤七:选择增加“前面”,就是在这个格子的上面平级增加,同理“后面”就是在格子的下面平级增加(图中为“前面”)步骤八:选择增加“上方”,就是在这个格子的前面增加,同理“下方”就是在格子的后面增加(图中为“上方”)word中插入树状图方法二:步骤一:打开word2003,选择顶部的插入,在下拉菜单中找到图示步骤二:点击打开图示选项卡,找到如下图所示的图形,这个就是树状图,选择,确定插入。

步骤三:显然,现在插入的树状图分支数量和层次数量都还无法满足我们的要求。

我们需要进一步编辑。

步骤四:假如我们现在要在顶部第一个框下设置4个次分支,我们选中顶部这个框在组织结构图工具框中点击插入图形,每点击一次就会增加一个次分支。

步骤五:假如我们要在次分支下增加三级分枝,我们选中要增加三级分枝的那个次分支,同样点击组织结构图工具框中点击插入图形。

如果继续分级,方法相同。

步骤六:假如我们要在某一级分支的某一项中加入分支对其进行补充说明,可以选中这一项所在的方框,在组织结构图工具框中打开插入图形下拉菜单。

Vue2组件tree实现无限级树形菜单

Vue2组件tree实现无限级树形菜单

Vue2组件tree实现⽆限级树形菜单⼀直打算偷懒使⽤个现成的树组件,但是在github上找了⼀⼤圈没有找到真正满⾜应⽤开发的树组件,所以没办法只能⾃⼰写了⼀个,开源出来希望可以帮助到需要的⼈,同时如果⼤家觉得好⽤,我可以顺带骗骗★(希望喜欢的朋友对我体⼒的肯定可以点下★),由于我也算刚接触vue,所以难免有所考虑不周的地⽅,希望⼤家在issue⾥⾯指正。

组件重点是⽗⼦组件数据的共享和状态保持,我是利⽤了下vuex的思路,采⽤⼀个控制仓库完成。

github 地址How to run demonpm installnpm run dev效果图⽰例<template><div style="width:300px;"><tree ref ='tree' :treeData="treeData" :options="options" @node-click='handleNode'/></div></template><script>import Tree from '../components/tree/tree.vue'export default {name: 'test',data () {return {options: {showCheckbox: true,search: {useInitial: true,useEnglish: false,customFilter: null}},treeData: [{id: 1,label: '⼀级节点',open: true,checked: false,parentId: null,visible: true,searched: false,children: [{id: 2,label: '⼆级节点-1',checked: false,parentId: 1,searched: false,visible: true},{label: '⼆级节点-2',open: true,checked: false,id: 3,parentId: 1,visible: true,searched: false,children: [{id: 4,parentId: 3,label: '三级节点-1',visible: true,searched: false,checked: false},{id: 5,label: '三级节点-2',parentId: 3,searched: false,visible: true,checked: false}]},{label: '⼆级节点-3',open: true,checked: false,id: 6,parentId: 1,visible: true,searched: false,children: [{id: 7,parentId: 6,label: '三级节点-4',checked: false,searched: false,visible: true},{id: 8,label: '三级节点-5',parentId: 6,checked: false,searched: false,visible: true}]}]}]}},components: {Tree}}</script>属性options: {showCheckbox: true, //是否⽀持多选search: {useInitial: true, //是否⽀持⾸字母搜索 useEnglish: false, //是否是英⽂搜索customFilter: null // ⾃定义节点过滤函数 }/* 节点元素 */{id: 1, //节点标志label: '⼀级节点', //节点名称open: true, // 是否打开节点checked: false, //是否被选中parentId: null, //⽗级节点Idvisible: true, //是否可见searched: false, //是否是搜索值children: [] //⼦节点}⽅法事件以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

基于AJAX的动态树状菜单的设计及实现

基于AJAX的动态树状菜单的设计及实现
重 载 等 待 时 间和 服 务 器 负担 . 而提 高 了 系统 性 能 。 从
关 键 词 : jx 异 步 ;JvSr t 动 态树 状 菜单 Aa ; aaci ; p
中 图分 类 号 :T 3 11 P 1. 文 献 标 识 码 :A 文 章 编 号 :1 7 — 2 6 2 1 1 — 0 2 0 6 4 6 3 ( 01 )2 0 5 — 4
合 作 单 位数 据 表 结 构 如表 1 示 。 所
表 1 合 作 单 位 数 据 表 结 构
Ta b.1 Da a t l t u t e o o p r to n tt io s t ab e s r c ur fc o e a i n i s ut n i
代 码
页 面 的 功 能 。 而 减 轻 服 务 器 负 担 和 带 宽 压 力 。 高 了 响 应 从 提
速度 。
3 文 档 对 象模 型 D M 是 提供 给 HT L和 X ) O M ML使 用 的

Aa 是 异步 JvSr t X jx aaei 和 ML的 简 称 。当用 户 浏 览 器 在 p
l a i g Th p l a in r s l h w a h c e e u e a e v r a e i n mea d s r e u d n n r v o d n . e a p i t e u t s o t t e s h me rd c d p g so e l d d wat gt n e v rb r e ,a d i o e c o s h t o i i mp t e p r r n eo es s m. h ef ma c f h y t o t e
的可 视 化 样 式 的 定 义 方 法 。 方便 统 一 修 改 用 户 的 界 面 样 式 。 1 Aa . 2 j x技 术 实现 树 状 菜 单工 作 原 理 由于 传 统 的 We b应 用 采 用 同 步 交 互 过 程 , 要 经 过 “ 都 请 求一 理 一 处 响应 一 新 ” 刷 过程 [ 3 1 。当服 务 器 正在 处 理 树 状菜 单 操 作 事 件 时 ,用 户 一 直 处 于 等 待 状 态 亦 或 随 着 操 作 事 件 被 处 理 . 页 面不 断 被刷 新 . 方 面 影 响 了用 户 人性 化 We 一 b的 体验 , 一 另

js实现树级递归,通过js生成tree树形菜单(递归算法)

js实现树级递归,通过js生成tree树形菜单(递归算法)

js实现树级递归,通过js⽣成tree树形菜单(递归算法)1、效果图需求:⾸先这是⼀个数据集—js的类型,我们需要把⽣成⼀个tree形式的对象 :var data = [{ id: 1, name: "办公管理", pid: 0 },{ id: 2, name: "请假申请", pid: 1 },{ id: 3, name: "出差申请", pid: 1 },{ id: 4, name: "请假记录", pid: 2 },{ id: 5, name: "系统设置", pid: 0 },{ id: 6, name: "权限管理", pid: 5 },{ id: 7, name: "⽤户⾓⾊", pid: 6 },{ id: 8, name: "菜单设置", pid: 6 },];id,与pid之间的对应关系,当pid不存在,或pid:0的时候,这⼀项,应该为树的顶端,那么我们需要去重新建⼀次索引,怎么建呢,,,以原数据集的id的值,重新⽣成⼀个数据如下:var data = [{id: 1, name: "办公管理", pid: 0 ,children:[{ id: 2, name: "请假申请", pid: 1,hildren:[{ id: 4, name: "请假记录", pid: 2 },],},{ id: 3, name: "出差申请", pid: 1},]},{id: 5, name: "系统设置", pid: 0 ,children:[{ id: 6, name: "权限管理", pid: 5,hildren:[{ id: 7, name: "⽤户⾓⾊", pid: 6 },{ id: 8, name: "菜单设置", pid: 6 },]},]},];js转换为上⾯数据集,实现数树级递归⽅法:<script>function toTree(data) {// 删除所有 children,以防⽌多次调⽤data.forEach(function (item) {delete item.children;});// 将数据存储为以 id 为 KEY 的 map 索引数据列var map = {};data.forEach(function (item) {map[item.id] = item;});// console.log(map);var val = [];data.forEach(function (item) {// 以当前遍历项,的pid,去map对象中找到索引的idvar parent = map[item.pid];// 好绕啊,如果找到索引,那么说明此项不在顶级当中,那么需要把此项添加到,他对应的⽗级中if (parent) {(parent.children || ( parent.children = [] )).push(item);} else {//如果没有在map中找到对应的索引ID,那么直接把当前的item添加到 val结果集中,作为顶级val.push(item);}});return val;}console.log(toTree(data))</script>使⽤jquery,⽣成上述效果图的完整实例:<!DOCTYPE html><html xmlns="/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title><script src="jquery-1.8.3.min.js"></script></head><body><script type="text/javascript">$(function () {var data = [{ id: 1, name: "办公管理", pid: 0 },{ id: 2, name: "请假申请", pid: 1 },{ id: 3, name: "出差申请", pid: 1 },{ id: 4, name: "请假记录", pid: 2 },{ id: 5, name: "系统设置", pid: 0 },{ id: 6, name: "权限管理", pid: 5 },{ id: 7, name: "⽤户⾓⾊", pid: 6 },{ id: 8, name: "菜单设置", pid: 6 },];GetData(0, data);$("body").append(menus);});//菜单列表htmlvar menus = '';//根据菜单主键id⽣成菜单列表html//id:菜单主键id//arry:菜单数组信息function GetData(id, arry) {var childArry = GetParentArry(id, arry);if (childArry.length > 0) {menus += '<ul>';for (var i in childArry) {menus += '<li>' + childArry[i].name;GetData(childArry[i].id, arry);menus += '</li>';}menus += '</ul>';}}//根据菜单主键id获取下级菜单//id:菜单主键id//arry:菜单数组信息function GetParentArry(id, arry) {var newArry = new Array();for (var i in arry) {if (arry[i].pid == id)newArry.push(arry[i]);}return newArry;}</script></body></html>。

2020-4-14树形菜单复选框父子节点不关联实现父子节点联动回显

2020-4-14树形菜单复选框父子节点不关联实现父子节点联动回显

2020-4-14树形菜单复选框⽗⼦节点不关联实现⽗⼦节点联动回显原先的elementUI中tree组件原⽣的check-strictly未false属性只能实现⼦节点选中时⽗节点默认选中,然后在保存的时候需要getHalfCheckedKeys()⽅法去获取半选中状态的⽗节点,然后在页⾯渲染的时候,⽗节点由半选中变成了全选中,导致页⾯菜单显⽰错误(保存的时候⼦节点没有全部选中,保存重新渲染会变成⼦节点全部默认选中)因此只能通过不关联,然后⾃⼰实现关联。

代码如下:<el-tree :data="item.childAuthItem" show-checkbox ref="tree" node-key="id" @check="clickTree" :expand-on-click-node="false" :check-strictly="true" :props="defaultProps" ></el-tree> clickTree(curData, treeStatus) {const me = this;me.clickCheck(curData, treeStatus, me.$refs.tree)},/*** 树形菜单复选框⽗⼦节点不关联实现⽗⼦节点联动回显** @see selectedParent - 处理⽗节点为选中* @see uniteChildSame - 处理⼦节点为相同的勾选状态* @see removeParent - ⼦节点全没选中取消⽗级的选中状态** @param {Object} currentObj - 当前勾选节点的对象* @param {Object} treeStatus - 树⽬前的选中状态对象* @param {Object} ref - this.$refs.xxx**/clickCheck(currentObj, treeStatus, ref) {// ⽤于:⽗⼦节点严格互不关联时,⽗节点勾选变化时通知⼦节点同步变化,实现单向关联。

ElementUIel-tree树形菜单子级取消选中后父级选中效果不变

ElementUIel-tree树形菜单子级取消选中后父级选中效果不变

ElementUIel-tree树形菜单⼦级取消选中后⽗级选中效果不变⽹上搜了很多案例,但没有符合要求的,根据其中⼀个案例改编如下:主要实现效果图:主要逻辑如下:⽗级点击选中或取消时,⼦级全部选中或取消。

⼦级选中后所有的⽗级是选中效果,⼦级取消选中后,⽗级仍是选中效果。

主要代码⽰例如下:<el-treeref="treeFrom":data="treeData"show-checkboxnode-key="id"check-on-click-node:default-expand-all="true":check-strictly="true":expand-on-click-node="false"@node-click="nodeClick"></el-tree>数据格式如下:treeData: [{id: 1,label: '⼀级 1',children: [{id: 4,label: '⼆级 1-1',children: [{id: 9,label: '三级 1-1-1',children: [{id: 11,label: '四级 1-1-1',}]}, {id: 10,label: '三级 1-1-2'}, {id: 12,label: '三级 1-1-3'},]}]}, {id: 2,label: '⼀级 2',children: [{id: 5,label: '⼆级 2-1'}, {id: 6,label: '⼆级 2-2'}]}, {id: 3,label: '⼀级 3',children: [{id: 7,label: '⼆级 3-1'}, {id: 8,label: '⼆级 3-2'}]}],主要⽅法如下:methods:{nodeClick(data, node){this.childNodesChange(node);this.parentNodesChange(node);//获取所有选中节点console.log(this.$refs.treeFrom.getCheckedNodes()) },// ⼦级操作递归childNodesChange(node){let len = node.childNodes.length;if(len > 0){for(let i = 0; i < len; i++){if(!node.checked){node.childNodes[i].checked = false;}else{node.childNodes[i].checked = true;}this.childNodesChange(node.childNodes[i]);}}},// ⽗级递归parentNodesChange(node){if(node.parent){for(let key in node){if(key == "parent"){node[key].checked = true;this.parentNodesChange(node[key]);}}}},}修改组件⾃定义样式(不写此样式,选中效果⽆效)<style>.el-tree-node__label{position: relative;}.el-tree-node__label:before{content:'';width:20px;height: 20px;display: block;position:absolute;top:0px;left:-24px;z-index:999;}.el-checkbox__inner{top:0;}</style>。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

JSP树形菜单的实现(转载)(2009-04-20 15:21:03)转载标签:分类:技术讲解杂谈1。

原理简介dtree是一个免费的javascript脚本,只需定义有限的几个参数,就可以做出漂亮的树型菜单。

下载目录:/javascripts/tree/以下是dtree的用法示例:1)初始化菜单<script type="text/javascript"><!--var Tree = new Array; Tree[0] = "1|0|Page 1|#";Tree[1] = "2|1|Page 1.1|#";Tree[2] = "3|1|Page 1.2|#";Tree[3] = "4|3|Page 1.2.1|#";</script>2)调用函数<div class="tree"><script type="text/javascript"><!--createTree(Tree,1,7); // starts the tree at the top and open it at node nr. 7//--></script></div>显然,如果用动态的脚本来初始化菜单数组(asp,jsp均可),那就可以很方便的实现动态的树型菜单了。

2。

jsp动态实现分以下步骤实现动态的树型菜单:1)在数据库建tree_info表,有nodeId,parentNodeId,nodeName,nodeUrl四个字段,来存储节点信息。

2)编写java类,用于从数据库找出节点信息,并且生成javascript脚本。

3)编写tag类。

用于封装逻辑,简化jsp的开发。

4)建一个web程序进行测试。

3。

详细过程1)在数据库建表,脚本如下:CREATE TABLE `test`.`tree_info` (`node_id` INTEGER UNSIGNED NOT NULL DEFAULT -1,`parent_id` INTEGER UNSIGNED NOT NULL DEFAULT -1,`node_name` VARCHAR(45) NOT NULL,`ref_url` VARCHAR(45) NOT NULL,PRIMARY KEY(`node_id`))我使用mysql数据库,如果脚本细节有出入,请自行修改按照上面的dTree示例插入数据2)编写TreeInfo.java,这个类用于封装节点信息package com.diegoyun.web.tree;public class TreeInfo {private int nodeId = -1;//node idprivate int parentId = -1;//parentIdprivate String nodeName = null;//node nameprivate String url = null;//url referencespublic int getNodeId() {return nodeId;}public void setNodeId(int nodeId) {this.nodeId = nodeId;}public int getParentId() {return parentId;}public void setParentId(int parentId) {this.parentId = parentId;}public String getNodeName() {return nodeName;}public void setNodeName(String nodeName) { this.nodeName = nodeName;}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}}编写TreeUtil.java,用于从数据库得到节点信息,封装到TreeInfo对象,并生成javascript 脚本TreeUtil.javapackage com.diegoyun.web.tree;import java.util.Collection;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.Connection;import java.sql.DriverManager;public class TreeUtil {public static List retrieveNodeInfos(){List coll = new ArrayList();String driverName = "com.mysql.jdbc.Driver";String host = "localhost";String port = ":3306";String serverID = "test";String userName = "root";String userPwd = "root";String url = "jdbc:mysql://" + host + port + "/" + serverID ;Connection conn = null ;PreparedStatement ps = null;ResultSet rs = null;try{Class.forName(driverName).newInstance();conn = DriverManager.getConnection(url , userName , userPwd); String sql = "select * from tree_info";ps = conn.prepareStatement(sql);rs = ps.executeQuery();TreeInfo info = null;while(rs!=null && rs.next()){info = new TreeInfo();info.setNodeId(rs.getInt(1));info.setParentId(rs.getInt(2));info.setNodeName(rs.getString(3));info.setUrl(rs.getString(4));coll.add(info);}// if(rs!=null){// rs.close();// rs=null;// }// if(ps!=null){// ps.close();// ps=null;// }}catch(Exception e){System.out.println(e);}return coll;}public static String createTreeInfo(List alist){StringBuffer contents = new StringBuffer();contents.append("<!--\n");contents.append("var Tree = new Array;");//create a array in javascript TreeInfo info =null;for(int max = alist.size(),i=0;i<max;i++){info = (TreeInfo)alist.get(i);//define elements of arraycontents.append("Tree[");contents.append(i);contents.append("]=\"");contents.append(info.getNodeId());contents.append("|");contents.append(info.getParentId());contents.append("|");contents.append(info.getNodeName());contents.append("|");contents.append(info.getUrl());contents.append("\";");}contents.append("docment.writer(Tree);");contents.append("//-->");return contents.toString();}public static void main(String[]args){List alist = TreeUtil.retrieveNodeInfos();// TreeInfo info = null;// for(Iterator i = c.iterator();i.hasNext();){// info = (TreeInfo)i.next();// System.out.println("*****" + info.getNodeName());// }System.out.println(TreeUtil.createTreeInfo(alist));}}3)编写标签类InitTreeTag.javapackage com.diegoyun.web.taglibs;import com.diegoyun.web.tree.TreeUtil;import javax.servlet.jsp.tagext.TagSupport;import javax.servlet.jsp.JspException;import java.io.IOException;public class InitTreeTag extends TagSupport{public int doEndTag() throws JspException {StringBuffer tree = new StringBuffer();tree.append("<script type=\"text/javascript\">\n");tree.append(TreeUtil.createTreeInfo(TreeUtil.retrieveNodeInfos())); tree.append("</script>\n");try{pageContext.getOut().println(tree.toString());}catch(IOException ioe){ioe.printStackTrace();}return super.doEndTag();}}ShowTreeTag.java :package com.diegoyun.web.taglibs;import javax.servlet.jsp.tagext.TagSupport;import javax.servlet.jsp.JspException;import java.io.IOException;public class ShowTreeTag extends TagSupport{ public int doEndTag() throws JspException {StringBuffer buffer = showTree();try {pageContext.getOut().println(buffer.toString()); }catch (IOException ioe) {ioe.printStackTrace();}return super.doEndTag();}private StringBuffer showTree(){StringBuffer sb = new StringBuffer();sb.append("<div class=\"tree\">\n");sb.append("<script type=\"text/javascript\">\n"); sb.append("<!--\n");sb.append("createTree(Tree);\n");sb.append("//-->\n");sb.append("</script>\n");sb.append("</div>\n");return sb;}}标签的tld如下:<?xml version="1.0" encoding="ISO-8859-1" ?><!DOCTYPE taglibPUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "/dtd/web-jsptaglibrary_1_2.dtd"><taglib><tlib-version>1.0</tlib-version><jsp-version>1.2</jsp-version><short-name>tree</short-name><!--initTreeTag--><tag><name>init</name><tag-class>com.diegoyun.web.taglibs.InitTreeTag</tag-class><body-content>empty</body-content></tag><!--ShowTreeTag--><tag><name>show</name><tag-class>com.diegoyun.web.taglibs.ShowTreeTag</tag-class><body-content>empty</body-content></tag></taglib>4)建立web过程,编写jsp进行测试。

相关文档
最新文档