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 阅读(5014) 评论(0)  编辑  收藏 所属分类: Appfuse

导航

统计

常用链接

留言簿(6)

随笔分类

随笔档案

文章分类

文章档案

收藏夹

Hibernate

友情链接

搜索

最新评论

阅读排行榜

评论排行榜