需求:
给系统首页加上动态的导航条
系统的每个模块都共用一个导航条,所以这个系统导航条不是写死的。
系统每个模块的菜单其实都是树型的结构,每一个菜单都定义一个唯一的标识,菜单名称,序列号,相应的连接。
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方法
}
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 >
< 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---------------------------
}
}
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;
}
}
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 >
< 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 >
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;
}
}
* 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");
这样,可以存可以取了。