gdufo

           

          Struts Menu 祥解

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

          官方英文版向?qū)В?a >http://struts-menu.sourceforge.net/userguide.html

          一、從1.X升級(jí)到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服務(wù)。
          5、打開htpp://localhost:8080/struts-menu/

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

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


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

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


            更多全面的例程,請(qǐng)查看應(yīng)用程序的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

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

          使用定制的Velocity模版實(shí)施你的菜單,你需要整合Velocity到你的WEB應(yīng)用程序中。如果需要這樣做的話,請(qǐng)完成下面的步驟:
          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”屬性指向一個(gè)文件(如config="/templates/tabs.html")或者如果tabs.htm在你的WEB-INF/classes目錄中的話,則可設(shè)config="tabs.html"。

          這里提供了一些使用Velocity的displayer例子,可在sample application(http://demo.raibledesigns.com/struts-menu/index.jsp)中查看。它總是在你的菜單需要的時(shí)候顯示CSS,JavaScript和圖像文件。下面有一些在當(dāng)前的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

          所有相關(guān)的有用的文件如果你需要的話都可以在下面的站點(diǎn)上下載:
           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的顯示/隱藏菜單的信息,請(qǐng)查看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類的源代碼。

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

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

          如果你喜歡使用Eclipse開發(fā)項(xiàng)目,請(qǐng)參考此份開發(fā)向?qū)В?a >http://struts-menu.sourceforge.net/devguide.html)。

           

          struts-menu2.3做動(dòng)態(tài)菜單

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

           

              <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的默認(rèn)配置文件的路徑,如果要改變文件的名字或路徑要改寫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的數(shù)據(jù)結(jié)構(gòu)
              MenuRepository:包含了所有的菜單數(shù)據(jù),它的里面保存菜單的形式是二維表的形式。一個(gè)菜單就是一條記錄
              MenuComponent: 代表一個(gè)菜單,也就是二維表中的一條記錄,父菜單和子菜單在這里區(qū)分,如果它的getParent()方法返回為空,那么它就是頂級(jí)菜單,它下面的子菜單設(shè)置它為父菜單方法:setParent(MenuComponent parent),該菜單的下面還可以有子菜單。
              最后要做的是把所有設(shè)置好的菜單項(xiàng),用repository.addMenu(mc) 方法加入到repository中。那么一個(gè)級(jí)聯(lián)菜單就做好了,示例代碼:

           

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

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

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

          =================
          使用Struts Menu實(shí)現(xiàn)權(quán)限管理


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

          因?yàn)榻衲晟习肽暌獙?duì)以前的一個(gè)系統(tǒng)進(jìn)行升級(jí),要根據(jù)用戶或者角色的權(quán)限把一些菜單隱藏起來,如果使用Struts Menu的roles的話,則角色是寫死在代碼里面的,就是"硬編碼"(hardcode),而且這里的角色是Application Server上配置的,在Tomcat上配置還算簡單,在WebLogic等大型的服務(wù)器程序上配置,必須使用他們提供的Console軟件,否則,要自己寫好幾個(gè)文件,比較繁瑣,而且這些角色是在安裝是就指定的,如果用戶以后想添加新的角色名字,還要修改應(yīng)用服務(wù)器的配置文件(不管是手工,還是代碼處理)。

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

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

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

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

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

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

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(6)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          收藏夾

          Hibernate

          友情鏈接

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 五家渠市| 元江| 铁力市| 临颍县| 长白| 同仁县| 镇沅| 改则县| 凌云县| 资兴市| 驻马店市| 闽侯县| 介休市| 柳州市| 伊春市| 盐津县| 苍南县| 长顺县| 沛县| 涪陵区| 交城县| 通许县| 勐海县| 航空| 莱芜市| 涪陵区| 左贡县| 连南| 巨鹿县| 沂南县| 禹城市| 林州市| 安丘市| 宝丰县| 嘉定区| 调兵山市| 固阳县| 古交市| 保山市| 金乡县| 扎赉特旗|