树形菜单的实现.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实现带复选框的树形菜单展⽰的具体代码,供⼤家参考,具体内容如下代码:<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树型

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树形菜单完整代码及截图

<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)如果你需要的也是这种效果,那你就来对地方了!目前,我们这个树形菜单展现出来的功能如下: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的位置又要被刷新一次,甚至多次,性能影响不说,第二次计算的位置已经不是正确的位置了。

  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进行测试。

相关文档
最新文档