index.jsp重定向到mainMenu.html,但其实mainMenu.html并不是一个真正的存在的Html页面。在appfuse中,Struts的Action的后缀使用的是不是常见的.do,而使用的是.html。见Web.xml: <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.html</url-pattern> </servlet-mapping>因此,查看struts-config.xml,发现/menuMenu只是简单地Forward到/WEB-INF/pages/mainMenu.jsp。所以,在此处显示的内容是mainMenu.jsp的内容。mainMenu.jsp页面中的内容不多,只有一个简单的列表,包含两个链接:编辑信息、上传文件。
现在需要仔细研究一下菜单的显示了。可以看到在menuMenu.jsp和login.jsp中都没有菜单的定义和显示。其实菜单的定义和显示还是在前面说到的default.jsp中。default.jsp中如下一段代码:
<c:set var="currentMenu" scope="request"><decorator:getProperty property="meta.menu"/></c:set> <c:if test="${currentMenu == 'AdminMenu'}"> <div id="sub"> <menu:useMenuDisplayer name="Velocity" config="WEB-INF/classes/cssVerticalMenu.vm" permissions="rolesAdapter"> <menu:displayMenu name="AdminMenu"/> </menu:useMenuDisplayer> </div> </c:if>
<div id="nav"> <div class="wrapper"> <h2 class="accessibility">Navigation</h2> <jsp:include page="/common/menu.jsp"/> </div> <hr /> </div><!-- end nav -->
首先从页面中取出meta.menu的值,这个值在login.jsp中是: <meta name="menu" content="Login"/>在mainMenu.jsp中是:<meta name="menu" content="MainMenu"/>所以,login.jsp中 test="${currentMenu == 'AdminMenu'}" 都不通过。每一部分的内容在这两个页面中都不显示。
下面的一部分是common/menu.jsp,主要是一个menu:useMenuDisplayer显示的菜单第一个进行了判断,<c:if test="${empty pageContext.request.remoteUser}">查看Jsp容器中维护的认证中当前用户是否为空,如果成功登录,则这个值即为登录用户名,否则为空。也就是说,如果没有成功登录,则会显示登录菜单<li><a href="<c:url value="/login.jsp"/>" class="current"><fmt:message key="login.title"/></a></li>。除了刚才的第一个登录项以外,还有5条菜单菜单项,这5个菜单项使用的是struts-menu的标准用法,而不是象刚才那样直接HTML的输出。 <menu:displayMenu name="MainMenu"/> <menu:displayMenu name="UserMenu"/> <menu:displayMenu name="FileUpload"/> <menu:displayMenu name="AdminMenu"/> <menu:displayMenu name="Logout"/>查看menu-config.xml,可以发现,只有第一的菜单项MainMenu没有定义角色
因此,在login.jsp页面也能显示此菜单项。而剩下需要角色的菜单,就需要登录后,根据角色的设置来显示相应的菜单了。比如:mraible用户是admin角色,可以显示全部菜单。tomcat用户是user角色,就看不到AdminMenu了。
Powered by: BlogJava Copyright © 云自无心水自闲