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);
}
}
大致如此。自己在整理一下,有点乱。