应用中集成struts menu有三种方式:
1 如果应用中使用了struts,可以把struts menu做为一个struts插件,如下:
1
< plug - in className = " net.sf.navigator.menu.MenuPlugIn " >
2
< set - property property = " menuConfig " value = " /WEB-INF/menu- config.xml " />
3
</ plug - in >
2 在web.xml中配置监听器, (在appfuse中使用的就是此种方式) 如下:
1
< listener >
2
< listener - class > net.sf.navigator.menu.MenuContextListener </ listener - class >
3
</ listener >
3 如果项目中使用到了spring,可以定义一个bean,如下:
1
< bean id = " menu " class = " net.sf.navigator.menu.MenuLoader " >
2
< property name = " menuConfig " >
3
< value >/ WEB - INF / menu - config.xml </ value >
4
</ property >
5
</ bean >
然后在/WEB-INF/下定义了menu-config.xml文件,内容如下:
1
< MenuConfig >
2
< Displayers >
3
< Displayer name = " CoolMenu " type = " net.sf.navigator.displayer.CoolMenuDisplayer4 " />
4
< Displayer name = " ListMenu " type = " net.sf.navigator.displayer.ListMenuDisplayer " />
5
</ Displayers >
6
< Menus >
7
< Menu name = " MainMenu " title = " mainMenu.title " page = " /mainMenu.html " width = " 90 " />
8
< Menu name = " UserMenu " title = " menu.user " description = " User Menu " page = " /editProfile.html " />
9
< Menu name = " FileUpload " title = " menu.selectFile " description = " File Upload " page = " /selectFile.html " />
10
11
< Menu name = " AdminMenu " title = " menu.admin " description = " Admin Menu " roles = " admin " width = " 120 " >
12
< Item name = " ViewUsers " title = " menu.admin.users " page = " /users.html " />
13
< Item name = " ReloadContext " title = " menu.admin.reload " page = " /reload.html " />
14
< Item name = " FlushCache " title = " menu.flushCache " page = " /flushCache.html " roles = " admin " />
15
< Item name = " Clickstream " title = " menu.clickstream " page = " /clickstreams.jsp " roles = " admin " />
16
</ Menu >
17
</ Menus >
18
</ MenuConfig >
Displayers中的displayer 定义了菜单的显示方式. CoolMenu和ListMenu.
Menus 下的Menu定义了具体的菜单,.title是菜单的显示名字(是国际化配置文件中的key).
page是与此菜单 项对应的url请求路径.
roles表示显示此菜单用户应该具有的角色.上例表示只有admin这种角色的用户登 陆才会显示AdminMenu菜单.
在taglibs.jsp定义了struts menu 的tag:
<%@ taglib uri="http://struts-menu.sf.net/tag-el" prefix="menu" %>
在menu.jsp中是tag的具体使用,如下:
1
< menu:useMenuDisplayer name = " CoolMenu " permissions = " rolesAdapter " >
2
< menu:displayMenu name = " MainMenu " />
3
< menu:displayMenu name = " UserMenu " />
4
< menu:displayMenu name = " FileUpload " />
5
< menu:displayMenu name = " AdminMenu " />
6
</ menu:useMenuDisplayer >
在这个菜单中,通过userMenuDisplayer 标签的name制定了菜单的显示样式是"CoolMenu"。
permissions指 定了菜单的显示与否是通过 role来决定的.(在前面的menu-config.xml中指定了AdminMenu菜单只有admin 角色的才显示).struts menu的 role permission 是通过request.isUserInRole来判断是否显示菜 单.appfuse使用了acegi security框架,在用户登陆的时候采用了acegi security的基于form 的认证方式 .在 acegi的org.acegisecurity.wrapper.SecurityContextHolderAwareRequestWrapper 类中有如下方法 :
1
public boolean isUserInRole(String role)
{
2
return isGranted(role);
3
}
4
所以使用了它就可以完成这项工作,acegi security 提供了对struts menu的 role permission的支持.