需求:
给系统首页加上动态的导航条

系统的每个模块都共用一个导航条,所以这个系统导航条不是写死的。
系统每个模块的菜单其实都是树型的结构,每一个菜单都定义一个唯一的标识,菜单名称,序列号,相应的连接。
1,根据这些,可以定义菜单对象类SysBar.java:

public class SysBar ...{
private String barName; //导航条名称
private String barCode; //导航条序号
private String barFlag; //导航条标识
private String barTier; //导航条层数
private String barUrl; //导航条连接

public SysBar()...{
}
//生成get/set方法
}2,写相应菜单的xml文件,以便系统加载的时候加在application里面。
<?xml version="1.0" encoding="gbk"?>
<root>
<menu>
<name>内部审核</name>
<mark>f</mark>
<node>$0</node>
<url></url>
</menu>
<menu>
<name>基础数据维护</name>
<mark>f1</mark>
<node>$f</node>
<url></url>
</menu>
<menu>
<name>年度审核计划</name>
<mark>f30</mark>
<node>$f</node>
<url></url>
</menu>
<menu>
<name>年度审核计划列表</name>
<mark>f2</mark>
<node>$f30$f</node>
<url></url>
</menu>
<menu>
<name>新建年度审核计划</name>
<mark>f3</mark>
<node>$f30$f</node>
<url></url>
</menu>
<menu>
<name>我的年度计划审核</name>
<mark>f8</mark>
<node>$f30$f</node>
<url></url>
</menu>
<menu>
<name>内审实施计划</name>
<mark>f40</mark>
<node>$f</node>
<url></url>
</menu>
<menu>
<name>内审实施计划列表</name>
<mark>f4</mark>
<node>$f40$f</node>
<url></url>
</menu>
<menu>
<name>新建内审实施计划</name>
<mark>f5</mark>
<node>$f40$f</node>
<url></url>
</menu>
<menu>
<name>我的实施计划审核</name>
<mark>f9</mark>
<node>$f40$f</node>
<url></url>
</menu>
<menu>
<name>审核报告</name>
<mark>f50</mark>
<node>$f</node>
<url></url>
</menu>
<menu>
<name>审核报告列表</name>
<mark>f7</mark>
<node>$f50$f</node>
<url></url>
</menu>
<menu>
<name>我的审核报告审核</name>
<mark>f12</mark>
<node>$f50$f</node>
<url></url>
</menu>
<menu>
<name>检查单</name>
<mark>f60</mark>
<node>$f</node>
<url></url>
</menu>
<menu>
<name>我的检查单编写审核</name>
<mark>f10</mark>
<node>$f60$f</node>
<url></url>
</menu>
<menu>
<name>我的检查单填写审核</name>
<mark>f11</mark>
<node>$f60$f</node>
<url></url>
</menu>
<menu>
<name>检查单列表</name>
<mark>f6</mark>
<node>$f60$f</node>
<url></url>
</menu>
<menu>
<name>不合格项</name>
<mark>f70</mark>
<node>$f</node>
<url></url>
</menu>
<menu>
<name>不合格项统计</name>
<mark>f13</mark>
<node>$f70$f</node>
<url></url>
</menu>
<menu>
<name>不合格项列表</name>
<mark>f21</mark>
<node>$f70$f</node>
<url></url>
</menu>
<menu>
<name>管理评审计划</name>
<mark>f80</mark>
<node>$f</node>
<url></url>
</menu>
<menu>
<name>管理评审计划列表</name>
<mark>f14</mark>
<node>$f80$f</node>
<url></url>
</menu>
<menu>
<name>新建管理评审计划</name>
<mark>f15</mark>
<node>$f80$f</node>
<url></url>
</menu>
<menu>
<name>我的管理评审计划审核</name>
<mark>f16</mark>
<node>$f80$f</node>
<url></url>
</menu>
<menu>
<name>管理评审报告</name>
<mark>f90</mark>
<node>$f</node>
<url></url>
</menu>
<menu>
<name>管理评审报告列表</name>
<mark>f17</mark>
<node>$f90$f</node>
<url></url>
</menu>
<menu>
<name>新建管理评审报告</name>
<mark>f18</mark>
<node>$f90$f</node>
<url></url>
</menu>
<menu>
<name>我的管理评审报告审核</name>
<mark>f19</mark>
<node>$f90$f</node>
<url></url>
</menu>
<menu>
<name>资料上传</name>
<mark>f20</mark>
<node>$f</node>
<url></url>
</menu>
</root> 3,写系统的初始化类。

public class InitServlet extends HttpServlet ...{

public void init(ServletConfig config) throws ServletException ...{
ServletContext context = config.getServletContext();
WebApplicationContext appContext = WebApplicationContextUtils
.getWebApplicationContext(context);
// lw add start-------------------------
try ...{
//zhangfan start
ReadXML readXML = new ReadXML();
//内审模块菜单
String pathinsdadt = config.getServletContext().getRealPath("WEB-INF/insdadtmenu.xml");
List insdadtMenuList = readXML.getMeduList(pathinsdadt);
context.setAttribute("insdadtmenu",insdadtMenuList);
//zhangfan end
} catch (Exception e) ...{
e.printStackTrace();
}
// lw add end---------------------------
}

}
4,写读取xml文件的类:

public class ReadXML ...{
private File xmlFile;
List list = new ArrayList();

public List readFile(String path)...{

try...{
xmlFile=new File(path);
SAXReader reader=new SAXReader();
Document document=reader.read(xmlFile);
Element root = document.getRootElement(); // 这个list就是你想要的
Element foo;
for (Iterator i = root.elementIterator("menu"); i.hasNext();) ...{
foo = (Element) i.next();
SysBar sysBar = new SysBar();
sysBar.setBarName(foo.elementText("name"));
sysBar.setBarCode(foo.elementText("node"));
sysBar.setBarFlag(foo.elementText("mark"));
sysBar.setBarUrl(foo.elementText("url"));
list.add(sysBar);
}

}catch(Exception e)...{
System.out.print(e.getMessage());
}
return list;
}

public List getMeduList(String path)...{
ReadXML OB = new ReadXML();
List list1 = OB.readFile(path);
return list1;
}
}
5,web-inf里面配置初始化:
<servlet>
<servlet-name>InitServlet</servlet-name>
<servlet-class>com.common.util.InitServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet> 6,最好把代码写在jsp页面里。
<%
List insdadtMeduList = (List)application.getAttribute("insdadtmenu");
String barflag = "f16";
GetSysBar gsb = new GetSysBar();
String sysbar = gsb.operSysBar(insdadtMeduList,barflag);
String real = gsb.getRealSysBar(sysbar);
session.setAttribute("sysbar",real);
%>
<script>
window.parent.parent.parent.sysbar.location.reload();
</script>这样进入这个jsp就从application里面把东西取出来,f16是此菜单唯一的标识。
7,差点忘了,写一个处理导航条的类

/** *//**
* zhangfan
*
*/

public class GetSysBar ...{

/** *//**
* 得到系统的导航条
* List flmngMeduList 是从acclipcation里面取出的相应模块的菜单list
* String menuflag 是当前选中的菜单标识
*/
public String operSysBar(List flmngMeduList,String menuflag) throws Exception ...{
String barCodeTemp = "";
String sysbar = "";

for(int i=0;i<flmngMeduList.size();i++)...{
SysBar sysBar = (SysBar)flmngMeduList.get(i);
String barflag = sysBar.getBarFlag();
if(menuflag.equalsIgnoreCase(barflag))...{
String barName = sysBar.getBarName();
String barurl = sysBar.getBarUrl();
String barCode = sysBar.getBarCode();
sysbar += "-"+barName + ";" + barurl + ";" + barflag + ";" + barCode + "#";
barCodeTemp = barCode;
break;
}
}

if(!barCodeTemp.equals(""))...{
String[] barCodeArray = barCodeTemp.split("/$");
for(int j=0;j<barCodeArray.length;j++)...{
String barflag = barCodeArray[j];
for(int z=0;z<flmngMeduList.size();z++)...{
SysBar sysBar = (SysBar)flmngMeduList.get(z);
String barflag2 = sysBar.getBarFlag();
if(barflag2.equalsIgnoreCase(barflag))...{
String barName = sysBar.getBarName();
String barurl = sysBar.getBarUrl();
String barCode = sysBar.getBarCode();
sysbar += "-"+barName + ";" + barurl + ";" + barflag2 + ";" + barCode + "#";
}else if(barflag.equals("0"))...{ //如果code序号为0,证明是根菜,直接写上相应的根菜单标识查找即可。
for(int y=0;y<flmngMeduList.size();y++)...{
SysBar sysRootBar = (SysBar)flmngMeduList.get(y);
String rootFlag = sysRootBar.getBarFlag();
String rootFlagTemp = menuflag.substring(0,1);
if(rootFlag.equals(rootFlagTemp))...{
String rootName = sysRootBar.getBarName();
String rootCode = sysRootBar.getBarCode();
String rootUrl = sysRootBar.getBarUrl();
sysbar += "-"+rootName + ";" + rootUrl + ";" + rootFlag + ";" + rootCode + "#";
break;
}
}
}
}
}
}
return sysbar;
}

/** *//**
* 获得真正的系统导航方法
*/
public String getRealSysBar(String sysbartemp) throws Exception ...{
String realsysbar = "";
if(!sysbartemp.equals(""))...{
String[] sysbarArray = sysbartemp.split("/#");
for(int i=(sysbarArray.length-1);i>=0;i--)...{
String sysbarone = sysbarArray[i];
String[] sysbaroneArray = sysbarone.split(";");
String name = sysbaroneArray[0];
String url = sysbaroneArray[1];
realsysbar += "-"+name;
}
}
return realsysbar;
}
}这样就可以设计出系统动态导航条了。当然这个是没有连接的,要想加连接功能,也很好解决,把url一起带回来再处理就行了。
最后,还有一个地方说一下:
在action里面取得application的方法:
ServletContext servlet = request.getSession().getServletContext();
List flmngMeduList = (List)servlet.getAttribute("flmngmenu");
这样,可以存可以取了。
本文介绍了一个基于XML配置的动态导航条设计方案,通过定义菜单对象类、读取XML配置文件及处理导航条逻辑实现动态生成导航条。
681

被折叠的 条评论
为什么被折叠?



