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è)置。




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




更多全面的例程,請(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聲明:


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






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


(譯注:其實(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定義:


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載入:









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







感謝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是可選的,/WEB-INF/menu-config.xml是struts-menu的默認(rèn)配置文件的路徑,如果要改變文件的名字或路徑要改寫context-param
2 menu-config.xml
需要配置菜單的顯示樣式,如下:

























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)菜單就做好了,示例代碼:























下面是菜單的顯示:



上面代碼的含義:
取得菜單的顯示樣式,設(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