系统动态导航条

需求:

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

系统动态导航条_第1张图片

系统的每个模块都共用一个导航条,所以这个系统导航条不是写死的。

系统每个模块的菜单其实都是树型的结构,每一个菜单都定义一个唯一的标识,菜单名称,序列号,相应的连接。

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");

这样,可以存可以取了。

你可能感兴趣的:(jsp,servlet,list,String,application,encoding)