自己项目中用struts menu 实现的菜单+权限管理

本文介绍Struts2框架中使用自定义DspMenuDisplayer进行菜单及权限管理的方法,包括menu-config配置、权限控制实现及菜单展示的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接上篇:struts2 menu菜单及权限管理

menu.jsp 书写如下:

<div class="con_left">
<menu:useMenuDisplayer name="dspMenu" config="DspMenuDisplayer" permissions="dspMenuPerssion">
<ul  class="list_one">
<menu:displayMenu name="manageMedia"/><!-- 媒体管理 -->
<menu:displayMenu name="manageAd"/><!-- 广告主管理 -->
<menu:displayMenu name="manageOrderList"/><!-- 订单管理 -->
<menu:displayMenu name="manageIdea"/><!-- 创意管理 -->
<menu:displayMenu name="manageLaunch" /><!-- 投放管理 -->
   <menu:displayMenu name="AdminMenu" /> <!-- 系统管理 -->
   </ul>
</menu:useMenuDisplayer>
</div>

解释:

  name="dspMenu":在menu-config里面配置:

<Displayers>
<Displayer name="Velocity"type="net.sf.navigator.displayer.VelocityMenuDisplayer" />
<Displayer name="dspMenu" type="com.geo.dsp.webapp.util.DspMenuDisplayer" />
</Displayers>
   

permissions:用于权限控制,项目中有DspMenuPerssionAdapter这个类,继承了permissionsadapter。(上篇文章中有提到这个类),此方法中有定义:

public static final String DSPMENUPERSSION="dspMenuPerssion";

config="DspMenuDisplayer":指向一个文件。DspMenuDisplayer.properties中有定义的一些在DspMenuDisplayer 使用的字符变量:代码如下:



lmd.menu.bottom=\t</li>
lmd.menu.item=\t<li ></li>\n
lmd.menu.standalone=\t<p><a href="{0}" title="{1}" class="standalone"{2}>{3}</a></p>
ccslm.menu.top=\t<li{0}
ccslm.menubar.top=\t<li class="{0}"><span>-</span><a href="{1}" target="{2}">{3}</a></li>\n
lmd.end=</ul>
lmd.begin=<ul >\n
span.state=<span class="open"></span>\n
a.left=<a class="one_a" href="javascript:;onclick=show({0}) ">
a.right=</a>\n
li.begin=<li id=
u.begin=<ul class="list_two" id="list_{0}">\n
a.begin=<li class="{0}"><span>-</span>{1}</li>
ccslm.menubar.top2=\t<li class="{0}"><span>-</span>{1}</a></li>\n


web.xml中配置菜单的监听器:

    <listener>
        <listener-class>net.sf.navigator.menu.MenuContextListener</listener-class>
    </listener>

MenuContextListener里面会根据menuConfig的路径(自己menu-config配置文件的路径一定要和这个一样)去找到关于menu的配置(也就是自定义的menu-config).然后根据type属性会执行DspMenuDisplayer,拼接出菜单。(定义多个displayer的 话是不是第一个就被覆盖了?)

DspMenuDisplayer 代码如下,需继承CSSListMenuDisplayer!其实只是为了实现menudisplayer。

public class DspMenuDisplayer extends CSSListMenuDisplayer{
    public void display(MenuComponent menu) throws JspException, IOException {
        if (isAllowed(menu)) {
            out.print(displayStrings.getMessage("ccslm.menu.top",
                    (hasViewableChildren(menu)) ? " id=\""+menu.getLocation()+"\"" : "")); 
            out.print(" class=\"list_one_li\"");
            out.print(">");
            out.print(displayStrings.getMessage("a.left",menu.getOnclick()));
            out.print(this.getMessage(menu.getTitle()));
            out.println(displayStrings.getMessage("a.right"));
            out.println(displayStrings.getMessage("u.begin",menu.getOnclick()));
         //   out.println(displayStrings.getMessage("span.state"));
            displayComponents(menu, 0);
            out.println("</ul>");
            out.println("</li>");
         
        }
    }
    protected void displayComponents(MenuComponent menu, int level)
    throws JspException, IOException {
        MenuComponent[] components = menu.getMenuComponents();
        if(components.length>0){
            for (int i = 0; i < components.length; i++) {
                if (isAllowed(components[i])) {
                        displayComponents(components[i], level + 1);
                        out.println((hasViewableChildren(components[i]) ? "\t\t</ul>\t" : ""));
                    } 
                }
        }else{
        out.println(displayStrings.getMessage("ccslm.menubar.top",
                    menu.getImage(),menu.getUrl(),menu.getTarget(),this.getMessage(menu.getTitle())));
        }
    }
    private boolean hasViewableChildren(MenuComponent menu) {
        for (int i = 0; i < menu.getMenuComponents().length; i++) {
            if (isAllowed(menu.getMenuComponents()[i])) {
           
                return true;
            }
        }
        return false;
    }
    public void setConfig(String config) {
        displayStrings = MessageResources.getMessageResources(config);
    }
}



大致如此。自己在整理一下,有点乱。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值