版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、动态菜单的构建,即使用ajax异步与服务器通信,实时以局部刷新的方式从数据库取出菜单。这里把我的实现记录下来,以备以后维护升级。1、首先是model层publicclassTreeMenuprivateLongid;privateLongparentID;privateStringmenuName;privateStringurl;setter,getter省略2、Dao层数据库映射数据库的操作主要用到通过角色来取出菜单,判断是否有子菜单的操作按角色取出所有菜单publicListgetTreeMenuByRoleID(longroleID)returngetHibernateTemplate
2、().find(selectbfromRoleajoina.treeMenubwherea.id=?,new_ObjectrolelD);按角色取出根菜单publicListgetFirstLeaveMenuByRoleID(longroleID)returnqetHibernateTemplate().find(selectbfromRoleajoina.treeMenubwherea.id=?andb.parentID=O,newObjectrolelD);判断是否有子菜单publicbooleanhasChild(longid)return!getHibernateTemplate().
3、find(fromTreeMenuawherea.parentID=?,newObjectid).isEmpty();数据库中存的结构如下所示:id|parelitIDjmenuNameurl11JO用户管理NULL2新増用户戸匚ftli-二viewnuth1=viewAjirt|-i2=Cviewuth3=血片r.3c发运计创NULL43计划查看tranePlanViewTvievvAjuth1=1viewAuthS=JvievvAiithj=:.51平台组织机构查看ongani2ationlnit?viewAuth1=2&uiewALrth2=0&viewAuth3=.g1角色查看role
4、ManagerTviewAuth1=0AviewAjth2=flAviewAuthi=44.1萋殖菜单测试NULLg寥级菓单刚试第二簸ANULL鑒级英单测试第二级巳NULL1二寥级菜单测试第三级NULL11C采购管建NULL1211采腐订单查询onderListViewmenu=cgddcxviewrjuthl=44viewnuth2=U11供应商笈货洁单displ-JFhListrrenu=fhqdiview.-juth1=舉血韶Auth2=.3、思路及关键实现下面将要讲到关键的地方,首先就得把思路说一下,思路是先显示parentID为0的菜单,也就是每个菜单的根部。当点击根菜单的时候,再将
5、下面的子菜单通过异步的方式取出。效果如下:用户管理新増用户平台组织柄构查看角芭查看多级栗单测试多级栗单测试笫二驰多级菜草测试第二级R.发运计划釆购管理采购订单查询供应商发赁IB单这里的话,我就自顶向下的方式说明。首先是前台的jsp,主要代码如下:ulid=parentclass=aimgid=downDetailsrc=/images/downDetail.jpgonclick=display(,);align=topheight=10px/表格的第一列存的是菜单,第二列存的是箭头。菜单是通过一个List迭代出来的。这里的关键是用到一个js。js代码如下:varxmlHttp;varcreat
6、eMenuHistory=newArray();varuserIDAllScope;functioncreateXmlHttp()if(window.ActiveXObject)xmlHttp=newActiveXObject(Microsoft.XMLHTTP);elseif(window.XMLHttpRequest)xmlHttp=newXMLHttpRequest();returnxmlHttp;functiondisplay(userID,parentID)userIDAllScope=userID;/alert(userID+parentID);varflag=true;/aler
7、t(createMenuHistory.length);for(vari=0;icreateMenuHistory.length;i+)/alert(isnotfrist);/alert(createMenuHistoryi);if(createMenuHistoryi=parentID)flag=false;break;if(flag=true)/alert(isnotexists+flag);if(createMenuHistory.length=0)/alert(isfrist);createMenuHistory0=parentID;elsecreateMenuHistorycreat
8、eMenuHistory.length=parentID;varqueryString=userID=+userID+&parentID=+parentID;xmlHttp=createXmlHttp();/alert(xmlHttp);xmlHttp.open(POST,jsonSubMenu,true);xmlHttp.setRequestHeader(Content-Type,application/x-www-form-urlencoded);xmlHttp.onreadystatechange=getSubMenuComplete;/alert(itisworked);xmlHttp
9、.send(queryString);else/alert(isexists+flag);vartarget=document.getElementById(parent+parentID);varshowHide=target.className;if(showHide=show|showHide=hide)target.className=a;showHide=a;/alert(target.getAttribute(id)+showHide);/alert(child.length);if(showHide=b)target.className=a;varchild=target.chi
10、ldNodesfor(vari=1;ichild.lenqth;i+)childi.className=show;elseif(showHide=a)target.className=b;varchild=target.childNodesfor(vari=1;ichild.lenqth;i+)if(childi.tagName!=SPAN)childi.className=hide;functionqetSubMenuComplete()if(xmlHttp.readyState=4&xmlHttp.status=200)eval(json=+xmlHttp.responseText+;);
11、/alert(xml HYPERLINK http:/Http.responseTextHttp.responseText);for(vari=0;ijson.menus.length;i+)vartarget=document.getElementById(parent+json.menusi.parentID);varulElmt=document.createElement(UL);varid=parent+json.menusi.id;ulElmt.setAttribute(id,id);ulElmt.setAttribute(class,a);ulElmt.innerHTML=jso
12、n.menusi.appendToHtml;target.appendChild(ulElmt);这里,我们需要一个数组来记录哪些父菜单被展开了,展开一个菜单,把菜单ID放入数组中,这里是createMenuHistory。另外用到一个Class,a和b来表示展开或隐藏的情况。如果要展开菜单,则发送异步请求到jsonSubMenu这个。通过这个,将得到一个数据,格式如下:menus:id:12,parentID:11,name:采购订单查询,hasChild:false,appendToHtml:米购订单查询,id:14,parentID:11,name:供应商发货清单,hasChild:fa
13、lse,appendToHtml:供应商发货清单在该数据中包含了id,父菜单id,菜单名,是否有子菜单,本身的地址信息。然后把这些信息逐个包装成UL,加入到对应的父菜单的UL中。下面我们看一下jsonSubMenu是如何得到这个json数据的:publicvoidgetSubTree()throwsIllegalArgumentException,NoSuchFieldException,NoSuchMethodException,IllegalAccessException,InvocationTargetExceptiontryListtreeMenuBeans=roleManagerSe
14、rvice.getSubTreeMenu(userID,parentID);IteratortreeMenuBeanIt=treeMenuBeans.iterator();while(treeMenuBeanIt.hasNext()TreeMenuBeantreeMenuBean=(TreeMenuBean)treeMenuBeanIt.next();listToJson(menus,treeMenuBean);listToJsonEnd();HttpServletResponseresponse=ServletActionContext.getResponse();response.setC
15、haracterEncoding(UTF-8);tryresponse.getWriter().write(jsonString);catch(IOExceptione)e.printStackTrace();catch(Exceptione)e.printStackTrace();该方法很简单,主要是通过server层的roleManagerService对象的getSubTreeMenu(userID,parentID)方法返回个List。List封装的bean如下:privatelongid;privatelongparentID;privateStringname;privateBoo
16、leanhasChild;privateStringappendToHtml;省略setter和getter该bean比model多了一个是否有子菜单,和标签(记录在appendToHtml成员变量中)。另外,这里有一个listToJson方法,是把list转换成json数据结构的方法,要实现该方法不难,这里不说了。然后,我们看一下roleManagerService中的getSubTreeMenu(userID,parentID)方法,如下:publicListgetSubTreeMenu(StringuserID,longparentID)ListtreeMenuBeans=newArra
17、yList();Useruser=userDao.findUserByUserID(userID);Listroles=roleDao.findRoleByUser(user.getUserID();IteratorroleIt=roles.iterator();while(roleIt.hasNext()Rolerole=(Role)roleIt.next();ListtreeMenus=treeMenuDao.getSubMenuByRoleID(role.getId(),parentID);IteratortreeMenuIt=treeMenus.iterator();while(tre
18、eMenuIt.hasNext()StringBufferappend=newStringBuffer();TreeMenumenu=(TreeMenu)treeMenuIt.next();TreeMenuBeantreeMenuBean=newTreeMenuBean();treeMenuBean.setId(menu.getId();treeMenuBean.setParentID(parentID);treeMenuBean.setName(menu.getMenuName();booleanhasChild=treeMenuDao.hasChild(menu.getId();treeM
19、enuBean.setHasChild(hasChild);if(hasChild)append.append(+menu.getMenuName()+);elseappend.append(+menu.getMenuName()+);treeMenuBean.setAppendToHtml(append.toString();treeMenuBeans.add(treeMenuBean);returntreeMenuBeans;这里主要是从层得到相应的菜单,然后转换成。另外,如果有子菜单的话,这里中的中记录的是菜单名右箭头,如果无子菜单了,给的就是地址菜单名这样的话,动态生成子菜单就完成了。最后别忘了进入页面时应该生成根菜单,生成根菜单可
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年辽宁省盖州市高二生物下册期末考试试卷带答案(B卷)
- 2026年青海省格尔木市高二生物下册期末考试试卷【A卷】附答案
- 2026年福建省永安市高二生物下册期末考试检测卷含答案(轻巧夺冠)
- 2026年云南省弥勒市高二生物下册期末考试检测卷(网校专用)附答案
- 2026年山西省古交市高二生物下册期末考试模拟卷含答案【培优A卷】
- 2026年云南省芒市高二生物下册期末考试试卷及参考答案【典型题】
- 2026年山东省海阳市高二生物下册期末考试试卷及答案【基础+提升】
- 2026年吉林省扶余市高二生物下册期末考试考试卷附参考答案【黄金题型】
- 2026年四川省什邡市高二生物下册期末考试考试卷(基础题)附答案
- 2026年河北省涿州市高二生物下册期末考试考试卷含答案【能力提升】
- 电商和厂家供货合同协议
- 引导接车课件
- 【MOOC】国际名酒知识与品鉴-暨南大学 中国大学慕课MOOC答案
- HG/T 4339-2024 机械设备用涂料(正式版)
- 唐诗宋词人文解读智慧树知到期末考试答案章节答案2024年上海交通大学
- 完美着装智慧树知到期末考试答案章节答案2024年武汉纺织大学
- 小学科学常考的38个实验及结论
- 宁波外国语学校小升初入学考试(附带答案)
- 2024届河北省石家庄市第四十中学数学七下期末检测试题含解析
- 数学与人体解剖学的结合课件
- 《工程项目投资与融资》 课后习题及答案--王乐 第1-11章
评论
0/150
提交评论