系统动态导航条

本文介绍了一个基于XML配置的动态导航条设计方案,通过定义菜单对象类、读取XML配置文件及处理导航条逻辑实现动态生成导航条。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求:

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

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

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

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

这样,可以存可以取了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值