gdufo

           

          Struts Menu 祥解

          http://blog.csdn.net/phevose/archive/2007/06/02/1635563.aspx

          官方英文版向導(http://struts-menu.sourceforge.net/userguide.html

          一、從1.X升級到2.X需要做以下事情:
          1、改變你的taglib聲明中的URI。
           <% at taglib uri="" prefix="menu" %>
          2、改變<plug-in>,使用新的包名"net.sf.navigator." 。
           <plug-in className="net.sf.navigator.menu.MenuPlugIn">
          3、改變你的menu-config.xml文件,使用新的包名"net.sf.navigator." 。
           <Displayer name="Simple"
             type="net.sf.navigator.displayer.SimpleMenuDisplayer"/>
          http://struts-menu.sf.net/tag

          二、快速開始:
          1、下載最新的struts-menu版本;
          2、解包到本地目錄;
          3、下載Tomcat或者其它Servlet容器;
          4、把struts-menu.war包放入Tomcat安裝目錄的wabapps目錄下,并重啟Tomcat服務。
          5、打開htpp://localhost:8080/struts-menu/

          三、把Struts Menu整合到你的應用程序中:
          Struts Menu能夠被輕易的整合到你的Struts應用程序中,它也可以整合到一個非Struts的應用程序中,但是我不喜歡這樣做,所以在此沒有提供相應的教程。這里將一步步的帶你整合這個標簽庫。
          你需要把struts-menu.jar放到你的WEB-INF/lib目錄下。然后使用URI標簽聲明你的JSP文件中想使用的這個標簽庫。
          如果使用Struts Menu 2.1,你還需要 Jakarta's Standard Tag Library JAR包放入你的WEB-INF/lib目錄下。下載地址:http://ibiblio.org/maven/taglibs/jars/standard-1.0.4.jar,這個文件包括例程WAR包文件和二進制發布包。
          1、放入struts-menu.jar包到你的應用程序的WEB-INF/lib目錄中。
          2、在你的struts-config.xml文件中加入plug-in設置。

           <plug-in className="net.sf.navigator.menu.MenuPlugIn">
             
          <set-property property="menuConfig"
               value
          ="/WEB-INF/menu-config.xml"/>
           
          </plug-in>


          3、你將需要在你的應用程序的/WEB-INF/menu-config.xml文件中定義你的菜單,這里提供一個簡單的片斷:

           <Menu name="contactMenu" title="Contact" location="?Contact">
             
          <Item name="email" title="E-Mail" location="?EMail"/>
             
          <Item name="phone" title="Phone" location="?Phone"/>
           
          </Menu>


            更多全面的例程,請查看應用程序的web/WEB-INF目錄中的menu-config.xml文件,你可以截取一段作為你需要的菜單。完整的屬性列表,可以查看MenuBase class's javadocs(http://struts-menu.source......avigator/menu/MenuBase.html)。
          4、在你的JSP文件的頂部加入taglib聲明:
           

          <% at taglib uri="" prefix="menu" %>


          5、在你的JSP文件中要放置菜單的位置加入taglib代碼:

           <menu:useMenuDisplayer name="TabbedMenu"
             bundle
          ="org.apache.struts.action.MESSAGE">
             
          <menu:displayMenu name="Home"/>
             
          <menu:displayMenu name="About"/>
           
          </menu:useMenuDisplayer>


          屬性name="TabbedMenu"被定義在menu-config.xml文件的頂部:

           <Displayer name="TabbedMenu"
          type
          ="net.sf.navigator.displayer.TabbedMenuDisplayer"/>

          http://struts-menu.sf.net/tag

          (譯注:其實到此步即可在你的JSP文件中添加相應的菜單了,只不過是沒有結合Velocity。在menu-config.xml文件的頭部可以定義多個Displayer,每個Displayer都有name和type屬性,name屬性與JSP文件中menu:useMenuDisplayer標簽的name屬性相對應,即表明使用何種樣式,具體的樣式定義便在type屬性中定義,type屬性中是一個class。在menu-config.xml文件中的菜單定義中的name屬性則與JSP文件中的menu:displayMenu標簽的name屬性相對應。)

          使用定制的Velocity模版實施你的菜單,你需要整合Velocity到你的WEB應用程序中。如果需要這樣做的話,請完成下面的步驟:
          1、確定你的menu-config.xml文件有“Velocity”的displayer定義:

           <Displayer name="Velocity" 
               type
          ="net.sf.navigator.displayer.VelocityMenuDisplayer"/>


          2、加入Velocity的JARs包到你的WEB-INF/lib目錄中,下載velocity-1.4-rc1.jar(http://www.ibiblio.org/ma......y/jars/velocity-1.4-rc1.jar)和velocity-tools-view-1.0.jar(http://www.ibiblio.org/ma......velocity-tools-view-1.0.jar)。
          3、加入globalMacros.vm(http://cvs.sourceforge.net/viewcvs.py/*checkout*/struts-menu/navigator/web/WEB-INF/classes/globalMacros.vm?content-type=text%2Fplain&rev=1.1(右鍵另存為))到你的WEB-INF/lib目錄中。
          4、改變你的JSP文件中displayer的值為“Velocity”,“config”屬性指向一個文件(如config="/templates/tabs.html")或者如果tabs.htm在你的WEB-INF/classes目錄中的話,則可設config="tabs.html"。

          這里提供了一些使用Velocity的displayer例子,可在sample application(http://demo.raibledesigns.com/struts-menu/index.jsp)中查看。它總是在你的菜單需要的時候顯示CSS,JavaScript和圖像文件。下面有一些在當前的Struts Menu中用到的Velocity模版的例子的鏈接:
           CoolMenus: Demo(http://demo.raibledesigns......menu/velocity-coolmenu4.jsp),
          Template(http://struts-menu.sourceforge.net/templates/coolmenus.html
           NiceTabs: Demo, Template
           Tabs: Demo, Template
           XTree: Demo, Template

          所有相關的有用的文件如果你需要的話都可以在下面的站點上下載:
           Images (http://struts-menu.sourceforge.net/menu-images/
           Stylesheets (http://struts-menu.sourceforge.net/styles/
           Scripts (http://struts-menu.sourceforge.net/scripts/
           Templates (http://struts-menu.sourceforge.net/templates/

          更多的基于roles的顯示/隱藏菜單的信息,請查看FAQs(http://struts-menu.sourceforge.net/faq.html)。

          四、在Struts之外使用Struts Menu:
          在2.2版中,Menu Repository能夠使用MenuContextListener載入:

           <!--
              - Loads the menu-config.xml for struts-menu at startup,
              - by default from "/WEB-INF/menu-config.xml".
              - To override this, add a context-param named "menuConfigLocation"
              - web.xml file.
              
          -->
           
          <listener>
               
          <listener-class>net.sf.navigator.menu.MenuContextListener</listener-class>
           
          </listener>

           

          或者如果你使用Spring,甚至更容易。僅僅需要加入下面的部分到你的applicationContext.xml文件中:

           <bean id="menu" class="net.sf.navigator.menu.MenuLoader">
             
          <property name="menuConfig">
               
          <value>/WEB-INF/menu-config.xml</value>
             
          </property>
           
          </bean>
           
          <!-- The menuConfig property is an optional attribute.  It is set to
               /WEB-INF/menu-config.xml by default. 
          -->


          感謝Dan Luputan提供MenuLoader類的源代碼。

          五、從源文件編譯:
          要從源文件編譯這個項目,執行下面的步驟:
          1、下載并安裝Maven(http://maven.apache.org/);
          2、創建一個環境變量MAVEN_HOME指出你的Maven的安裝目錄,然后添加$MAVEN_HOME/bin到你的PATH變量中;
          3、操縱這個目錄你可以擴展源代碼,執行“maven.jar”創建target/struts-menu.jar。

          要展開struts-menu例程,需要下面的步驟:
          1、下載和安裝Tomcat;
          2、創建一個環境變量CATALINA_HOME指出你的Tomcat的安裝目錄;
          3、執行“maven deploy”把應用程序展開到Tomcat中;
          4、打開http://localhost:8080/struts-menu在你喜愛的瀏覽器中。

          如果你喜歡使用Eclipse開發項目,請參考此份開發向導(http://struts-menu.sourceforge.net/devguide.html)。

           

          struts-menu2.3做動態菜單

          1 web.xml
          struts-menu2.3版本不用建立在struts框架之上,但需要struts的jar包
          要做的是在web.xml文件中配置一個監聽

           

              <context-param>
                  
          <param-name>menuConfigLocation</param-name>
                  
          <param-value>/WEB-INF/menu-config.xml</param-value>
              
          </context-param>
              
          <listener>
                  
          <listener-class>net.sf.navigator.menu.MenuContextListener</listener-class>
              
          </listener>


          其中context-param是可選的,/WEB-INF/menu-config.xml是struts-menu的默認配置文件的路徑,如果要改變文件的名字或路徑要改寫context-param

          2 menu-config.xml

          需要配置菜單的顯示樣式,如下:

           

          <?xml version="1.0" encoding="UTF-8" ?>

          <MenuConfig>

            
          <Displayers>
              
          <Displayer   name="DropDown"
                           type
          ="net.sf.navigator.displayer.DropDownMenuDisplayer"/>
              
          <Displayer   name="Simple"
                           type
          ="net.sf.navigator.displayer.SimpleMenuDisplayer"/>
              
          <Displayer   name="CoolMenu"
                           type
          ="net.sf.navigator.displayer.CoolMenuDisplayer"/>
              
          <Displayer   name="CoolMenu4"
                           type
          ="net.sf.navigator.displayer.CoolMenuDisplayer4"/>
              
          <Displayer   name="MenuForm"
                           type
          ="net.sf.navigator.example.PermissionsFormMenuDisplayer"/>
              
          <Displayer   name="ListMenu"
                           type
          ="net.sf.navigator.displayer.ListMenuDisplayer"/>
              
          <Displayer   name="TabbedMenu"
                           type
          ="net.sf.navigator.displayer.TabbedMenuDisplayer"/>
              
          <Displayer   name="Velocity"
                           type
          ="net.sf.navigator.displayer.VelocityMenuDisplayer"/>
            
          </Displayers>

          </MenuConfig>


          3 dynamicmenu.jsp

          menu的數據結構
              MenuRepository:包含了所有的菜單數據,它的里面保存菜單的形式是二維表的形式。一個菜單就是一條記錄
              MenuComponent: 代表一個菜單,也就是二維表中的一條記錄,父菜單和子菜單在這里區分,如果它的getParent()方法返回為空,那么它就是頂級菜單,它下面的子菜單設置它為父菜單方法:setParent(MenuComponent parent),該菜單的下面還可以有子菜單。
              最后要做的是把所有設置好的菜單項,用repository.addMenu(mc) 方法加入到repository中。那么一個級聯菜單就做好了,示例代碼:

           

          MenuRepository repository=new MenuRepository();
              MenuComponent mc
          =new MenuComponent();
              mc.setName(
          "myMenu");
              mc.setTitle(
          "File");
              MenuComponent copy
          =new MenuComponent();
              copy.setTitle(
          "copy");
              copy.setParent(mc);
              MenuComponent open
          =new MenuComponent();
              
              open.setTitle(
          "Open");
              open.setParent(mc);
              MenuComponent close
          =new MenuComponent();
              close.setTitle(
          "New");
              close.setParent(mc);
              MenuComponent case1 
          = new MenuComponent();
              case1.setParent(close);
              case1.setTitle(
          "case1");
              repository.addMenu(mc);
              repository.addMenu(open);
              repository.addMenu(close);
              repository.addMenu(copy);

          下面是菜單的顯示:

           MenuRepository defaultRepository = (MenuRepository)
              application.getAttribute(MenuRepository.MENU_REPOSITORY_KEY);
              repository.setDisplayers(defaultRepository.getDisplayers());

          上面代碼的含義:
              取得菜單的顯示樣式,設置給repository,也就是上面menu-config.xml中設置的八種樣式。

              pageContext.setAttribute("net.sf.navigator.menu.MENU_REPOSITORY",repository);
          把菜單裝入到.jsp文件中,賦值給屬性"net.sf.navigator.menu.MENU_REPOSITORY" 然后jsp的menu標簽就會從該屬性中取得菜單的顯示樣式和數據

          =================
          使用Struts Menu實現權限管理


          Struts Menu也是Matt Raible的作品,我以前一直在找能夠在Java里面指定實現頁面上樹形菜單和下拉菜單的東西,我去年找到一個JS的東西,可以從XML文件中讀取結構,我使用XSLT來生成顯示的菜單,后來感覺不靈活,也沒有用到項目上,2004年11月開始接觸AppFuse,發現里面有個Struts Menu,從例子看起來外觀還不錯,用起來,發現更不錯,可以在配置文件中指定那些角色可以看到當前的鏈接,如果roles中沒有指定的角色進入系統后,則自動隱藏。我在去年的一個小項目用了一下,發現還行,至少不用我把邏輯嵌入到一堆JS里面。

          因為今年上半年要對以前的一個系統進行升級,要根據用戶或者角色的權限把一些菜單隱藏起來,如果使用Struts Menu的roles的話,則角色是寫死在代碼里面的,就是"硬編碼"(hardcode),而且這里的角色是Application Server上配置的,在Tomcat上配置還算簡單,在WebLogic等大型的服務器程序上配置,必須使用他們提供的Console軟件,否則,要自己寫好幾個文件,比較繁瑣,而且這些角色是在安裝是就指定的,如果用戶以后想添加新的角色名字,還要修改應用服務器的配置文件(不管是手工,還是代碼處理)。

          如果你的系統負責處理權限,如生成用戶、角色,還要為角色、用戶指定有操作哪些模塊的哪些操作,一個系統很可能有幾十個或者上百個角色(往極端情況去想,呵呵),那么如果能夠動態的控制顯示哪些菜單項是我們系統中必須解決的問題,而Struts Menu完全勝任這樣的要求,具體實現可以參看Struts Menu的下載文件中的文檔,需要重點看的是http://demo.raibledesigns.com/struts-menu/dynamicMenu.jsp(動態構建菜單結構)和http://struts-menu.sourceforge.net/security.html(這篇文章我視而不見,以為沒有用處,謝謝倦兔的提醒,^_^)。這兩篇文章的用法是獨立的,并不一定都要實現,如果你的菜單項是固定的,短期不會有所變動,那么可以寫死到配置文件中,然后用第二篇文章中說的那樣,寫一個類,實現接口PermissionsAdapter,isAllowed方法中傳入菜單項的名字,然后決定是否顯示該項菜單,

          String[] menus = request.getParameterValues("menuNames");

          注釋:menuNames是從數據庫中讀出的記錄的集合(數組),你也可以用其他機構,

          然后放入使用request.setAttribute("menuNames", String[] 變量) 放入request中。

          PermissionsAdapter permissions = new SimplePermissionsAdapter(menus);//menus是菜單名字的數組
          request.getSession().setAttribute("YourAdapter", permissions);} //"YourAdapter"隨便起的名字,

          posted on 2008-06-26 21:16 gdufo 閱讀(5034) 評論(0)  編輯  收藏 所屬分類: Appfuse

          導航

          統計

          常用鏈接

          留言簿(6)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          收藏夾

          Hibernate

          友情鏈接

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 宕昌县| 雅江县| 都江堰市| 余干县| 辽宁省| 淮南市| 库尔勒市| 板桥市| 左权县| 莱芜市| 菏泽市| 铁岭市| 安陆市| 拉孜县| 临桂县| 哈尔滨市| 临清市| 双流县| 葵青区| 霍林郭勒市| 商丘市| 吉木乃县| 德格县| 怀宁县| 西安市| 罗田县| 洛南县| 华安县| 赞皇县| 江西省| 千阳县| 阿克陶县| 东明县| 安顺市| 综艺| 定州市| 山西省| 双辽市| 静乐县| 泽州县| 阿鲁科尔沁旗|