云自无心水自闲

天平山上白云泉,云自无心水自闲。何必奔冲山下去,更添波浪向人间!
posts - 288, comments - 524, trackbacks - 0, articles - 6
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

appfuse 1.9.4 学习心得 III

Posted on 2007-03-08 09:51 云自无心水自闲 阅读(1617) 评论(0)  编辑  收藏 所属分类: Java心得体会Appfuse

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没有定义角色

< MenuConfig >
    
< Displayers >
        
< Displayer  name ="Velocity"  type ="net.sf.navigator.displayer.VelocityMenuDisplayer" />
    
</ Displayers >
    
< Menus >
        
< Menu  name ="MainMenu"  title ="mainMenu.title"  page ="/mainMenu.html" />
        
< Menu  name ="UserMenu"  title ="menu.user"  description ="User Menu"  forward ="editProfile"  roles ="admin,user" />
        
< Menu  name ="FileUpload"  title ="menu.selectFile"  description ="File Upload"  width ="100"  forward ="selectFile"  roles ="admin,user" />
        
< Menu  name ="AdminMenu"  title ="menu.admin"  description ="Admin Menu"  roles ="admin"  width ="120"  forward ="viewUsers" >
            
< Item  name ="ViewUsers"  title ="menu.admin.users"  forward ="viewUsers" />
            
< Item  name ="ActiveUsers"  title ="mainMenu.activeUsers"  action ="activeUsers" />
            
< Item  name ="ReloadContext"  title ="menu.admin.reload"  action ="reload" />
            
< Item  name ="FlushCache"  title ="menu.flushCache"  action ="flush" />
            
< Item  name ="Clickstream"  title ="menu.clickstream"  page ="/clickstreams.jsp" />
        
</ Menu >
        
< Menu  name ="Logout"  title ="user.logout"  page ="/logout.jsp"  roles ="admin,user" />
    
</ Menus >
</ MenuConfig >


因此,在login.jsp页面也能显示此菜单项。
而剩下需要角色的菜单,就需要登录后,根据角色的设置来显示相应的菜单了。

比如:mraible用户是admin角色,可以显示全部菜单。tomcat用户是user角色,就看不到AdminMenu了。

 




只有注册用户登录后才能发表评论。


网站导航: