- 浏览: 55831 次
- 性别:
最新评论
-
zxjlwt:
学习了。http://surenpi.com
Parse-轻松构建移动APP的后台服务(1) -
a420144030:
你好,先万分感谢我有一个IKAnalyzer3.2.8.jar ...
Maven -
弹着钢琴设计:
编程的确很好玩,但不能成为生活的主要。
程序员的乐趣 -
halk:
尽管Ruby的作者是个日本人。===============爱 ...
程序员的乐趣 -
newyounger:
...
程序员的乐趣
DisplayerMapping
AbstractDisplayer.java
/* * MenuDisplayerMapping.java * * Created on February 6, 2001, 5:24 PM */ package net.sf.navigator.displayer; import java.io.Serializable; /** * * @author ssayles * @version */ public class MenuDisplayerMapping implements Serializable { //~ Instance fields ======================================================== /** Holds value of property name. */ private String name; /** Holds value of property type. */ private String type; /** Holds value of property config. */ private String config; //~ Methods ================================================================ /** Getter for property name. * @return Value of property name. */ public String getName() { return name; } /** Setter for property name. * @param name New value of property name. */ public void setName(String name) { this.name = name; } /** Getter for property type. * @return Value of property type. */ public String getType() { return type; } /** Setter for property type. * @param type New value of property type. */ public void setType(String type) { this.type = type; } /** Getter for property config. * @return Value of property config. */ public String getConfig() { return config; } /** Setter for property config. * @param config New value of property config. */ public void setConfig(String config) { this.config = config; } }
AbstractDisplayer.java
/* * AbstractMenuDisplayer.java * * Created on March 30, 2002, 3:34 PM */ package net.sf.navigator.displayer; import net.sf.navigator.menu.MenuComponent; import net.sf.navigator.menu.PermissionsAdapter; import net.sf.navigator.util.MessageResources; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.PageContext; import java.io.IOException; /** * Abstract implementation of <code>MenuDisplayer</code> that can be used as * a basis for other menu displayers. * * @author ssayles * @version */ public abstract class AbstractMenuDisplayer implements MenuDisplayer { //~ Instance fields ======================================================== protected final transient Log log = LogFactory.getLog(getClass()); protected String name; protected MessageResources displayStrings; protected JspWriter out; protected String target; /** Holds value of property permissionsAdapter. */ protected PermissionsAdapter permissionsAdapter; protected MenuDisplayerMapping mapping; //~ Methods ================================================================ public String getName() { return name; } public void setName(String name) { this.name = name; } public String getConfig() { String config = null; if (displayStrings != null) { config = displayStrings.getConfig(); } return config; } public void setConfig(String config) { displayStrings = MessageResources.getMessageResources(config); } public String getTarget() { return target; } /** * Convenience method that will first return the target for the displayer * if it is not null. If the displayer target is null, then it will * return <code>menu.getTarget()</code>. * * @return the target for the menu link. */ protected String getTarget(MenuComponent menu) { String theTarget = null; if (target == null) { if (menu.getTarget() != null) { theTarget = menu.getTarget(); } } else { theTarget = target; } return theTarget; } public void setTarget(String target) { this.target = target; } /** * Getter for property permissionsAdapter. * @return Value of property permissionsAdapter. */ public PermissionsAdapter getPermissionsAdapter() { return this.permissionsAdapter; } /** * Setter for property permissionsAdapter. * @param permissionsAdapter New value of property permissionsAdapter. */ public void setPermissionsAdapter(PermissionsAdapter permissionsAdapter) { this.permissionsAdapter = permissionsAdapter; } /** * Lifecycle method that should be called when the <code>MenuDisplayer</code> * is being prepared for use. * * @param pageContext The JSP pageContext to give the displayer access * to any resources it may need. * @param mapping The menu displayer mapping used to embody the xml * definition. */ public void init(PageContext pageContext, MenuDisplayerMapping mapping) { this.out = pageContext.getOut(); this.mapping = mapping; } public abstract void display(MenuComponent menu) throws JspException, IOException; public void end(PageContext pageContext) {} /** * Returns <code>true</code> if the specified component is usable. * If <code>permissionsAdapter</code> is not defined, this method will * return <code>true</code>. Otherwise, the adapter will be used to check * permissions on the menu. * * @return <code>true</code> if the menu component is usable. * @param menu The menu component. */ public boolean isAllowed(MenuComponent menu) { return permissionsAdapter == null || permissionsAdapter.isAllowed(menu); } }
package net.sf.navigator.menu; /** * @author DEPeart * */ public interface Component { String getName(); void setName(String name); }
package net.sf.navigator.menu; /** * * @author ssayles * @author mraible * @version */ public abstract class MenuBase implements Component { //~ Instance fields ======================================================== /** Holds value of property action, that is, Struts Logical Action Name. */ protected String action; /** Align menu 'left','right','top','bottom' ...and other alignment of particular menu system */ protected String align; /** Holds value of property altImage. */ protected String altImage; /** Holds value of property description. */ protected String description; /** Holds value of property forward. */ protected String forward; /** Holds value of property height. */ protected String height; /** Holds value of property image. */ protected String image; /** Holds value of property location. */ protected String location; /** Holds value of property name. */ protected String name; /** Holds value of property onclick. */ protected String onclick; /** Holds value of property ondblclick. */ protected String ondblclick; /** Holds value of property onmouseout. */ protected String onmouseout; /** Holds value of property onmouseover. */ protected String onmouseover; /** Holds value of property page. */ protected String page; /** Holds value of property roles. */ protected String roles; /** Holds value of property target. */ protected String target; /** Holds value of property title. */ protected String title; /** Holds value of property toolTip. */ protected String toolTip; /** Holds value of property width. */ protected String width; /** Holds parsed (with variables) url that is used to render a link */ private String url; /** Holds value of property onContextMenu */ protected String onContextMenu; /** * Holds value of property module; a Struts module prefix that overrides the current module. * * <p>The default module is specified by <code>""</code>. Any non-default module should begin with <code>"/"</code>. */ protected String module; //~ Methods ================================================================ /** * Sets the value for action. * @param action New value of property action. */ public void setAction(String action) { this.action = action; } /** * Returns the value for action. * @return Value of property action. */ public String getAction() { return this.action; } /** * Returns the value for align. * @return Value of property align. */ public String getAlign() { return align; } /** * Sets the value for align. * @param align New value of property align. */ public void setAlign(String align) { this.align = align; } /** Setter for property altImage. * @param altImage New value of property altImage. */ public void setAltImage(String altImage) { this.altImage = altImage; } /** Getter for property altImage. * @return Value of property altImage. */ public String getAltImage() { return altImage; } /** Setter for property description. * @param description New value of property description. */ public void setDescription(String description) { this.description = description; } /** Getter for property description. * @return Value of property description. */ public String getDescription() { return description; } /** * Sets the forward. * @param forward The forward to set */ public void setForward(String forward) { this.forward = forward; } /** * @return String */ public String getForward() { return forward; } /** * @param height */ public void setHeight(String height) { this.height = height; } /** * @return */ public String getHeight() { return height; } /** Setter for property image. * @param image New value of property image. */ public void setImage(String image) { this.image = image; } /** Getter for property image. * @return Value of property image. */ public String getImage() { return image; } /** Setter for property location. * @param location New value of property location. */ public void setLocation(String location) { this.location = location; } /** Getter for property location. * @return Value of property location. */ public String getLocation() { return location; } /** Setter for property name. * @param name New value of property name. */ public void setName(String name) { this.name = name; } /** Getter for property name. * @return Value of property name. */ public String getName() { return name; } /** Setter for property onclick. * @param onclick New value of property onclick. */ public void setOnclick(String onclick) { this.onclick = onclick; } /** Getter for property onclick. * @return Value of property onclick. */ public String getOnclick() { return onclick; } /** Setter for property onmouseout. * @param onmouseout New value of property onmouseout. */ public void setOnmouseout(String onmouseout) { this.onmouseout = onmouseout; } /** Getter for property onmouseout. * @return Value of property onmouseout. */ public String getOnmouseout() { return onmouseout; } /** Setter for property onmouseover. * @param onmouseover New value of property onmouseover. */ public void setOnmouseover(String onmouseover) { this.onmouseover = onmouseover; } /** Getter for property onmouseover. * @return Value of property onmouseover. */ public String getOnmouseover() { return onmouseover; } /** * Sets the value for page. * @param page New value of property page. */ public void setPage(String page) { this.page = page; } /** * Returns the value for page. * @return Value of property page. */ public String getPage() { return this.page; } /** * Sets the roles. * @param roles The roles to set */ public void setRoles(String roles) { this.roles = roles; } /** * Returns the roles. * @return String */ public String getRoles() { return roles; } /** Setter for property target. * @param target New value of property target. */ public void setTarget(String target) { this.target = target; } /** Getter for property target. * @return Value of property target. */ public String getTarget() { return target; } /** Setter for property title. * @param title New value of property title. */ public void setTitle(String title) { this.title = title; } /** Getter for property title. * @return Value of property title. */ public String getTitle() { return title; } /** Setter for property toolTip. * @param toolTip New value of property toolTip. */ public void setToolTip(String toolTip) { this.toolTip = toolTip; } /** Getter for property toolTip. * @return Value of property toolTip. */ public String getToolTip() { return toolTip; } /** * @param url */ public void setUrl(String url) { this.url = url; } /** * @return */ public String getUrl() { return url; } /** * Sets the width. * @param width The width to set */ public void setWidth(String width) { this.width = width; } /** * @return String */ public String getWidth() { return width; } /** * @return */ public String getOnContextMenu() { return onContextMenu; } /** * @param string */ public void setOnContextMenu(String string) { onContextMenu = string; } /** * Returns the ondblclick. * @return String */ public String getOndblclick() { return ondblclick; } /** * Sets the ondblclick. * @param ondblclick The ondblclick to set */ public void setOndblclick(String ondblclick) { this.ondblclick = ondblclick; } public String getModule() { return module; } public void setModule(String module) { this.module = module; } }
/* * MenuComponent.java * * Created on January 28, 2001, 8:10 PM */ package net.sf.navigator.menu; import org.apache.commons.lang.StringUtils; import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; /** * This class extends {@link MenuBase} and basically contains helper methods * for adding and fetching children and parents. * * @author Scott Sayles, Matt Raible * @version $Revision: 1.19 $ $Date: 2006/10/17 11:27:09 $ */ public class MenuComponent extends MenuBase implements Serializable, Component { //~ Static fields/initializers ============================================= protected static MenuComponent[] _menuComponent = new MenuComponent[0]; //~ Instance fields ======================================================== protected List menuComponents = Collections.synchronizedList(new ArrayList()); protected MenuComponent parentMenu; private boolean last; private String breadCrumb; //~ Methods ================================================================ public void addMenuComponent(MenuComponent menuComponent) { if ((menuComponent.getName() == null) || (menuComponent.getName().equals(""))) { menuComponent.setName(this.name + menuComponents.size()); } if (!menuComponents.contains(menuComponent)) { menuComponents.add(menuComponent); menuComponent.setParent(this); } } public MenuComponent[] getMenuComponents() { return (MenuComponent[]) menuComponents.toArray(_menuComponent); } public void setMenuComponents(MenuComponent[] menuComponents) { for (int i = 0; i < menuComponents.length; i++) { MenuComponent component = menuComponents[i]; this.menuComponents.add(component); } } public void setParent(MenuComponent parentMenu) { if (parentMenu != null) { // look up the parent and make sure that it has this menu as a child if (!parentMenu.getComponents().contains(this)) { parentMenu.addMenuComponent(this); } } this.parentMenu = parentMenu; } public MenuComponent getParent() { return parentMenu; } /** * Convenience method for Velocity templates * @return menuComponents as a java.util.List */ public List getComponents() { return menuComponents; } /** * This method compares all attributes, except for parent and children * * @param o the object to compare to */ public boolean equals(Object o) { if (!(o instanceof MenuComponent)) { return false; } MenuComponent m = (MenuComponent) o; // Compare using StringUtils to avoid NullPointerExceptions return StringUtils.equals(m.getAction(), this.action) && StringUtils.equals(m.getAlign(), this.align) && StringUtils.equals(m.getAltImage(), this.altImage) && StringUtils.equals(m.getDescription(), this.description) && StringUtils.equals(m.getForward(), this.forward) && StringUtils.equals(m.getHeight(), this.height) && StringUtils.equals(m.getImage(), this.image) && StringUtils.equals(m.getLocation(), this.location) && StringUtils.equals(m.getName(), this.name) && StringUtils.equals(m.getOnclick(), this.onclick) && StringUtils.equals(m.getOndblclick(), this.ondblclick) && StringUtils.equals(m.getOnmouseout(), this.onmouseout) && StringUtils.equals(m.getOnmouseover(), this.onmouseover) && StringUtils.equals(m.getOnContextMenu(), this.onContextMenu) && StringUtils.equals(m.getPage(), this.page) && StringUtils.equals(m.getRoles(), this.roles) && StringUtils.equals(m.getTarget(), this.target) && StringUtils.equals(m.getTitle(), this.title) && StringUtils.equals(m.getToolTip(), this.toolTip) && StringUtils.equals(m.getWidth(), this.width) && StringUtils.equals(m.getModule(), this.module); } /** * Get the depth of the menu * * @return Depth of menu */ public int getMenuDepth() { return getMenuDepth(this, 0); } private int getMenuDepth(MenuComponent menu, int currentDepth) { int depth = currentDepth + 1; MenuComponent[] subMenus = menu.getMenuComponents(); if (subMenus != null) { for (int a = 0; a < subMenus.length; a++) { int depthx = getMenuDepth(subMenus[a], currentDepth + 1); if (depth < depthx) depth = depthx; } } return depth; } /** * Returns the last. * * @return boolean */ public boolean isLast() { return last; } /** * Sets the last. * * @param last The last to set */ public void setLast(boolean last) { this.last = last; } /** * Remove all children from a parent menu item */ public void removeChildren() { for (Iterator iterator = this.getComponents().iterator(); iterator.hasNext();) { MenuComponent child = (MenuComponent) iterator.next(); child.setParent(null); iterator.remove(); } } public String getBreadCrumb() { return breadCrumb; } /** * Build the breadcrumb trail leading to this menuComponent * * @param delimiter type of separator */ protected void setBreadCrumb(String delimiter) { if (getParent() == null) { breadCrumb = name; setChildBreadCrumb(delimiter); } else { MenuComponent parent = getParent(); breadCrumb = parent.getBreadCrumb() + delimiter + name; setChildBreadCrumb(delimiter); } } private void setChildBreadCrumb(String delimiter) { List children = this.getComponents(); for (Iterator iterator = children.iterator(); iterator.hasNext();) { MenuComponent child = (MenuComponent) iterator.next(); child.setBreadCrumb(delimiter); } } public String toString() { return "name: " + this.name; } }
package net.sf.navigator.menu; import net.sf.navigator.util.LoadableResourceException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; /** * This class is designed for use in applications that don't use Struts * but do want to use Struts Menu. You simply need to configure this * listener in your web.xml file with the following syntax:</p> * <pre> * <!-- * - Loads the menu-config.xml for struts-menu at startup, * - by default from "/WEB-INF/menu-config.xml". * - To override this, add a context-param named "menuConfigLocation" * - web.xml file. * --> * <listener> * <listener-class>net.sf.navigator.menu.MenuContextListener</listener-class> * </listener> * </pre> * * @author Matt Raible */ public class MenuContextListener implements ServletContextListener { private static Log log = LogFactory.getLog(MenuContextListener.class); private ServletContext ctx; /** Configuration file for menus */ private String menuConfig = "/WEB-INF/menu-config.xml"; /** * Initialization of the Menu Repository. */ public void contextInitialized(ServletContextEvent sce) { ctx = sce.getServletContext(); if (log.isDebugEnabled()) { log.debug("Starting struts-menu initialization"); } // check for menuConfigLocation context-param String override = sce.getServletContext().getInitParameter("menuConfigLocation"); if (override != null) { if (log.isDebugEnabled()) { log.debug("using menuConfigLocation: " + override); } this.menuConfig = override; } MenuRepository repository = new MenuRepository(); repository.setLoadParam(menuConfig); repository.setServletContext(ctx); try { repository.load(); ctx.setAttribute(MenuRepository.MENU_REPOSITORY_KEY, repository); if (log.isDebugEnabled()) { log.debug("struts-menu initialization successfull"); } } catch (LoadableResourceException lre) { log.fatal("Failure initializing struts-menu: " + lre.getMessage()); } } public void contextDestroyed(ServletContextEvent sce) { if (log.isDebugEnabled()) { log.debug("destroying struts-menu..."); } sce.getServletContext().removeAttribute(MenuRepository.MENU_REPOSITORY_KEY); menuConfig = null; ctx = null; } }
package net.sf.navigator.menu; import net.sf.navigator.util.LoadableResourceException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.context.ApplicationContextException; import org.springframework.web.context.support.WebApplicationObjectSupport; import javax.servlet.ServletException; /** * This loader is available for those that use the Spring Framework. To * use it, simply configure it as follows in your applicationContext.xml file. * </p> * <pre> * <bean id="menu" class="net.sf.navigator.menu.MenuLoader"> * <property name="menuConfig"> * <value>/WEB-INF/menu-config.xml</value> * </property> * </bean> * </pre> * <p>The menuConfig property is an optional attribute. It is set to * /WEB-INF/menu-config.xml by default.</p> * * @author Matt Raible */ public class MenuLoader extends WebApplicationObjectSupport { private static Log log = LogFactory.getLog(MenuLoader.class); /** Configuration file for menus */ private String menuConfig = "/WEB-INF/menu-config.xml"; /** * Set the Menu configuration file * @param menuConfig the file containing the Menus/Items */ public void setMenuConfig(String menuConfig) { this.menuConfig = menuConfig; } /** * Initialization of the Menu Repository. * @throws org.springframework.context.ApplicationContextException if an error occurs */ protected void initApplicationContext() throws ApplicationContextException { try { if (log.isDebugEnabled()) { log.debug("Starting struts-menu initialization"); } MenuRepository repository = new MenuRepository(); repository.setLoadParam(menuConfig); repository.setServletContext(getServletContext()); try { repository.load(); getServletContext().setAttribute(MenuRepository.MENU_REPOSITORY_KEY, repository); if (log.isDebugEnabled()) { log.debug("struts-menu initialization successful"); } } catch (LoadableResourceException lre) { throw new ServletException("Failure initializing struts-menu: " + lre.getMessage()); } } catch (Exception ex) { throw new ApplicationContextException("Failed to initialize Struts Menu repository", ex); } } }
/* * MenuPlugin.java * * Created on March 6, 2002, 10:04 PM */ package net.sf.navigator.menu; import net.sf.navigator.util.LoadableResourceException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.struts.action.ActionServlet; import org.apache.struts.action.PlugIn; import org.apache.struts.config.ModuleConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; /** * Struts plug-in adapter for the menuing module. * * @author ssayles */ public class MenuPlugIn implements PlugIn { //~ Instance fields ======================================================== /** * The <code>Log</code> instance for this class. */ private static Log log = LogFactory.getLog(MenuPlugIn.class); private MenuRepository repository; private String menuConfig = "/WEB-INF/menu-config.xml"; private HttpServlet servlet; //~ Methods ================================================================ public String getMenuConfig() { return menuConfig; } public void setMenuConfig(String menuConfig) { this.menuConfig = menuConfig; } public void init(ActionServlet servlet, ModuleConfig config) throws ServletException { if (log.isDebugEnabled()) { log.debug("Starting struts-menu initialization"); } this.servlet = servlet; repository = new MenuRepository(); repository.setLoadParam(menuConfig); repository.setServletContext(servlet.getServletContext()); try { repository.load(); servlet.getServletContext().setAttribute(MenuRepository.MENU_REPOSITORY_KEY, repository); if (log.isDebugEnabled()) { log.debug("struts-menu initialization successful"); } } catch (LoadableResourceException lre) { throw new ServletException("Failure initializing struts-menu: " + lre.getMessage()); } } public void destroy() { repository = null; servlet.getServletContext().removeAttribute(MenuRepository.MENU_REPOSITORY_KEY); menuConfig = null; servlet = null; } }
/* * MenuRepository.java * * Created on January 29, 2001, 9:51 AM */ package net.sf.navigator.menu; import net.sf.navigator.displayer.MenuDisplayerMapping; import net.sf.navigator.displayer.VelocityMenuDisplayer; import net.sf.navigator.util.LoadableResource; import net.sf.navigator.util.LoadableResourceException; import org.apache.commons.collections.map.LinkedMap; import org.apache.commons.digester.Digester; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import javax.servlet.ServletContext; import java.io.InputStream; import java.io.Serializable; import java.util.*; /** * Holder of Menus and their items. Can be populated programmatically. * * @author ssayles, mraible */ public class MenuRepository implements LoadableResource, Serializable { //~ Static fields/initializers ============================================= public static final String MENU_REPOSITORY_KEY = "net.sf.navigator.menu.MENU_REPOSITORY"; private static Log log = LogFactory.getLog(MenuRepository.class); //~ Instance fields ======================================================== protected String config = null; protected String name = null; protected ServletContext servletContext = null; protected LinkedMap menus = new LinkedMap(); protected LinkedMap displayers = new LinkedMap(); protected LinkedMap templates = new LinkedMap(); private String breadCrumbDelimiter; //~ Methods ================================================================ public Set getMenuNames() { return menus.keySet(); } /** * Convenience method for dynamic menus - returns the top-level menus * only. */ public List getTopMenus() { List topMenus = new ArrayList(); if (menus == null) { log.warn("No menus found in repository!"); return topMenus; } for (Iterator it = menus.keySet().iterator(); it.hasNext();) { String name = (String) it.next(); MenuComponent menu = getMenu(name); if (menu.getParent() == null) { topMenus.add(menu); } } return topMenus; } public MenuComponent getMenu(String menuName) { return (MenuComponent) menus.get(menuName); } public MenuDisplayerMapping getMenuDisplayerMapping(String displayerName) { return (MenuDisplayerMapping) displayers.get(displayerName); } protected Digester initDigester() { Digester digester = new Digester(); digester.setClassLoader(Thread.currentThread().getContextClassLoader()); digester.push(this); //digester.setDebug(getDebug()); // 1 digester.addObjectCreate("MenuConfig/Menus/Menu", "net.sf.navigator.menu.MenuComponent", "type"); digester.addSetProperties("MenuConfig/Menus/Menu"); digester.addSetNext("MenuConfig/Menus/Menu", "addMenu"); // 2 digester.addObjectCreate("MenuConfig/Menus/Menu/Item", "net.sf.navigator.menu.MenuComponent", "type"); digester.addSetProperties("MenuConfig/Menus/Menu/Item"); digester.addSetNext("MenuConfig/Menus/Menu/Item", "addMenuComponent", "net.sf.navigator.menu.MenuComponent"); // 3 digester.addObjectCreate("MenuConfig/Menus/Menu/Item/Item", "net.sf.navigator.menu.MenuComponent", "type"); digester.addSetProperties("MenuConfig/Menus/Menu/Item/Item"); digester.addSetNext("MenuConfig/Menus/Menu/Item/Item", "addMenuComponent", "net.sf.navigator.menu.MenuComponent"); // 4 digester.addObjectCreate("MenuConfig/Menus/Menu/Item/Item/Item", "net.sf.navigator.menu.MenuComponent", "type"); digester.addSetProperties("MenuConfig/Menus/Menu/Item/Item/Item"); digester.addSetNext("MenuConfig/Menus/Menu/Item/Item/Item", "addMenuComponent", "net.sf.navigator.menu.MenuComponent"); // 5 digester.addObjectCreate("MenuConfig/Menus/Menu/Item/Item/Item/Item", "net.sf.navigator.menu.MenuComponent", "type"); digester.addSetProperties("MenuConfig/Menus/Menu/Item/Item/Item/Item"); digester.addSetNext("MenuConfig/Menus/Menu/Item/Item/Item/Item", "addMenuComponent", "net.sf.navigator.menu.MenuComponent"); // 6 digester.addObjectCreate("MenuConfig/Menus/Menu/Item/Item/Item/Item/Item", "net.sf.navigator.menu.MenuComponent", "type"); digester.addSetProperties("MenuConfig/Menus/Menu/Item/Item/Item/Item/Item"); digester.addSetNext("MenuConfig/Menus/Menu/Item/Item/Item/Item/Item", "addMenuComponent", "net.sf.navigator.menu.MenuComponent"); // 7 digester.addObjectCreate("MenuConfig/Menus/Menu/Item/Item/Item/Item/Item/Item", "net.sf.navigator.menu.MenuComponent", "type"); digester.addSetProperties("MenuConfig/Menus/Menu/Item/Item/Item/Item/Item/Item"); digester.addSetNext("MenuConfig/Menus/Menu/Item/Item/Item/Item/Item/Item", "addMenuComponent", "net.sf.navigator.menu.MenuComponent"); digester.addObjectCreate("MenuConfig/Displayers/Displayer", "net.sf.navigator.displayer.MenuDisplayerMapping", "mapping"); digester.addSetProperties("MenuConfig/Displayers/Displayer"); digester.addSetNext("MenuConfig/Displayers/Displayer", "addMenuDisplayerMapping", "net.sf.navigator.displayer.MenuDisplayerMapping"); digester.addSetProperty("MenuConfig/Displayers/Displayer/SetProperty", "property", "value"); return digester; } /** * Adds a new menu. This is called when parsing the menu xml definition. * @param menu The menu component to add. */ public void addMenu(MenuComponent menu) { if (menus.containsKey(menu.getName())) { if (log.isDebugEnabled()) { log.warn("Menu '" + menu.getName() + "' already exists in repository"); } List children = (getMenu(menu.getName())).getComponents(); if (children != null && menu.getComponents() != null) { for (Iterator it = children.iterator(); it.hasNext();) { MenuComponent child = (MenuComponent) it.next(); menu.addMenuComponent(child); } } } menus.put(menu.getName(), menu); } /** * Allows easy removal of a menu by its name. * @param name */ public void removeMenu(String name) { menus.remove(name); } /** * Allows easy removal of all menus, suggested use for users wanting to reload menus without having to perform * a complete reload of the MenuRepository */ public void removeAllMenus() { menus.clear(); } public void addMenuDisplayerMapping(MenuDisplayerMapping displayerMapping) { displayers.put(displayerMapping.getName(), displayerMapping); if (displayerMapping.getType().equals("net.sf.navigator.displayer.VelocityMenuDisplayer")) { if (servletContext == null) { log.error("ServletContext not set - can't initialize Velocity"); } else { VelocityMenuDisplayer.initialize(servletContext); } } } /** * This method is so menu repositories can retrieve displayers from the * default repository specified in menu-config.xml * @return the displayers specified in this repository */ public LinkedMap getDisplayers() { return displayers; } /** * Allow the displayers to be set as a whole. This should only be used * when copying the displayers from the default repository to a newly * created repository. * @param displayers */ public void setDisplayers(LinkedMap displayers) { this.displayers = displayers; } public void load() throws LoadableResourceException { if (getServletContext() == null) { throw new LoadableResourceException("no reference to servlet context found"); } InputStream input = null; Digester digester = initDigester(); try { input = getServletContext().getResourceAsStream(config); digester.parse(input); } catch (Exception e) { e.printStackTrace(); throw new LoadableResourceException("Error parsing resource file: " + config + " nested exception is: " + e.getMessage()); } finally { try { input.close(); } catch (Exception e) { } } } public void reload() throws LoadableResourceException { menus.clear(); displayers.clear(); load(); } public void setLoadParam(String loadParam) { config = loadParam; } public String getLoadParam() { return config; } public void setName(String name) { this.name = name; } public String getName() { return name; } public ServletContext getServletContext() { return servletContext; } public void setServletContext(ServletContext context) { this.servletContext = context; } /** * Method getMenu. Get a subMenu beneath a root or parent menu. Will drill-down as deep as requested * @param menuName - e.g grandParent.parent.menu * @param delimiter - e.g. '.' * @return MenuComponent */ public MenuComponent getMenu(String menuName, String delimiter) { MenuComponent parent = null; StringTokenizer st = new StringTokenizer(menuName, delimiter); boolean firstMenu = true; while (st.hasMoreTokens()) { if (firstMenu) { parent = this.getMenu(st.nextToken()); firstMenu = false; } else { MenuComponent child = null; String name = st.nextToken(); for (int a = 0; a < parent.getComponents().size(); a++) { if (name.equals(((MenuComponent) parent.getComponents().get(a)).getName())) { child = (MenuComponent) parent.getComponents().get(a); a = parent.getComponents().size(); } } if (child != null) { parent = child; } else { parent = null; break; } } } return parent; } /** * Method getMenuDepth. * Get the depth of the deepest sub-menu within the requested top menu * @param menuName - name of the top menu to check the menu depth * @return int. If no menuName found return -1 */ public int getMenuDepth(String menuName) { MenuComponent menu = this.getMenu(menuName); if (menu == null) return -1; if (menu.getMenuComponents() == null) return 1; return menu.getMenuDepth(); } /** * Method getMenuDepth. * Get the depth of the deepest sub-menu throughout all menus held in the repository * @return int. If no menus return -1. */ public int getMenuDepth() { int currentDepth = 0; List topMenus = this.getTopMenus(); if (topMenus == null) return -1; for (Iterator menu = topMenus.iterator(); menu.hasNext();) { int depth = ((MenuComponent) menu.next()).getMenuDepth(); if (currentDepth < depth) currentDepth = depth; } return currentDepth; } /** * Method getTopMenusAsArray. Get menus as array rather than a List * @return MenuComponent[] */ public MenuComponent[] getTopMenusAsArray() { List menuList = this.getTopMenus(); MenuComponent[] menus = new MenuComponent[menuList.size()]; for (int a = 0; a < menuList.size(); a++) { menus[a] = (MenuComponent) menuList.get(a); } return menus; } /** * Get a List of all the top menus' names * @return List */ public List getTopMenusNames() { List menus = this.getTopMenus(); ArrayList names = new ArrayList(); for (Iterator iterator = menus.iterator(); iterator.hasNext();) { MenuComponent menu = (MenuComponent) iterator.next(); names.add(menu.getName()); } return names; } public void setBreadCrumbDelimiter(String string) { breadCrumbDelimiter = string; } public void buildBreadCrumbs() { if (breadCrumbDelimiter == null) { throw new NullPointerException("No breadCrumbDelimiter present"); } ArrayList menus = (ArrayList)this.getTopMenus(); for (Iterator iterator = menus.iterator(); iterator.hasNext();) { MenuComponent menu = (MenuComponent)iterator.next(); menu.setBreadCrumb(breadCrumbDelimiter); } } public void buildBreadCrumbs(String delimiter) { this.breadCrumbDelimiter = delimiter; buildBreadCrumbs(); } }
/* * PermissionsAdapter.java * * Created on April 29, 2002, 10:15 PM */ package net.sf.navigator.menu; /** * Defines a pluggable adapter into the menu framework that is used for * checking permissions on menus. * * @author ssayles */ public interface PermissionsAdapter { /** * If the menu is allowed, this should return true. * * @return whether or not the menu is allowed. */ public boolean isAllowed(MenuComponent menu); }
/* * RolesPermissionsAdapter.java * * Created on December 7, 2002 2:25 PM */ package net.sf.navigator.menu; import javax.servlet.http.HttpServletRequest; import java.util.regex.Pattern; /** * This class used container-managed security to check access * to menus. The roles are set in menu-config.xml. * * @author <a href="mailto:matt@raibledesigns.com">Matt Raible</a> */ public class RolesPermissionsAdapter implements PermissionsAdapter { private Pattern delimiters = Pattern.compile("(?<!\\\\),"); private HttpServletRequest request; public RolesPermissionsAdapter(HttpServletRequest request) { this.request = request; } /** * If the menu is allowed, this should return true. * * @return whether or not the menu is allowed. */ public boolean isAllowed(MenuComponent menu) { if (menu.getRoles() == null) { return true; // no roles define, allow everyone } else { // Get the list of roles this menu allows String[] allowedRoles = delimiters.split(menu.getRoles()); for (int i=0; i < allowedRoles.length; i++) { if (request.isUserInRole(allowedRoles[i])) { return true; } } } return false; } }
/* * AbstractMenuDisplayer.java * * Created on March 30, 2002, 3:34 PM */ package net.sf.navigator.displayer; import net.sf.navigator.menu.MenuComponent; import net.sf.navigator.menu.PermissionsAdapter; import net.sf.navigator.util.MessageResources; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.PageContext; import java.io.IOException; /** * Abstract implementation of <code>MenuDisplayer</code> that can be used as * a basis for other menu displayers. * * @author ssayles * @version */ public abstract class AbstractMenuDisplayer implements MenuDisplayer { //~ Instance fields ======================================================== protected final transient Log log = LogFactory.getLog(getClass()); protected String name; protected MessageResources displayStrings; protected JspWriter out; protected String target; /** Holds value of property permissionsAdapter. */ protected PermissionsAdapter permissionsAdapter; protected MenuDisplayerMapping mapping; //~ Methods ================================================================ public String getName() { return name; } public void setName(String name) { this.name = name; } public String getConfig() { String config = null; if (displayStrings != null) { config = displayStrings.getConfig(); } return config; } public void setConfig(String config) { displayStrings = MessageResources.getMessageResources(config); } public String getTarget() { return target; } /** * Convenience method that will first return the target for the displayer * if it is not null. If the displayer target is null, then it will * return <code>menu.getTarget()</code>. * * @return the target for the menu link. */ protected String getTarget(MenuComponent menu) { String theTarget = null; if (target == null) { if (menu.getTarget() != null) { theTarget = menu.getTarget(); } } else { theTarget = target; } return theTarget; } public void setTarget(String target) { this.target = target; } /** * Getter for property permissionsAdapter. * @return Value of property permissionsAdapter. */ public PermissionsAdapter getPermissionsAdapter() { return this.permissionsAdapter; } /** * Setter for property permissionsAdapter. * @param permissionsAdapter New value of property permissionsAdapter. */ public void setPermissionsAdapter(PermissionsAdapter permissionsAdapter) { this.permissionsAdapter = permissionsAdapter; } /** * Lifecycle method that should be called when the <code>MenuDisplayer</code> * is being prepared for use. * * @param pageContext The JSP pageContext to give the displayer access * to any resources it may need. * @param mapping The menu displayer mapping used to embody the xml * definition. */ public void init(PageContext pageContext, MenuDisplayerMapping mapping) { this.out = pageContext.getOut(); this.mapping = mapping; } public abstract void display(MenuComponent menu) throws JspException, IOException; public void end(PageContext pageContext) {} /** * Returns <code>true</code> if the specified component is usable. * If <code>permissionsAdapter</code> is not defined, this method will * return <code>true</code>. Otherwise, the adapter will be used to check * permissions on the menu. * * @return <code>true</code> if the menu component is usable. * @param menu The menu component. */ public boolean isAllowed(MenuComponent menu) { return permissionsAdapter == null || permissionsAdapter.isAllowed(menu); } }
/* * SimpleMenuDisplayer.java * * Created on February 15, 2001, 11:14 AM */ package net.sf.navigator.displayer; import net.sf.navigator.menu.MenuComponent; import javax.servlet.jsp.JspException; import javax.servlet.jsp.PageContext; import java.io.IOException; /** * * @author ssayles * @version */ public class SimpleMenuDisplayer extends MessageResourcesMenuDisplayer { //~ Static fields/initializers ============================================= protected static final String nbsp = NBSP; //~ Methods ================================================================ public void init(PageContext pageContext, MenuDisplayerMapping mapping) { super.init(pageContext, mapping); try { out.println(displayStrings.getMessage("smd.style")); } catch (Exception e) { log.error(e.getMessage()); } } public void display(MenuComponent menu) throws JspException, IOException { if (isAllowed(menu)) { out.println(displayStrings.getMessage("smd.menu.top")); displayComponents(menu, 0); out.println(displayStrings.getMessage("smd.menu.bottom")); } } protected void displayComponents(MenuComponent menu, int level) throws JspException, IOException { MenuComponent[] components = menu.getMenuComponents(); if (components.length > 0) { out.println(displayStrings.getMessage("smd.menu.item.top", getSpace(level) + displayStrings.getMessage("smd.menu.item.image.bullet") + getMessage(menu.getTitle()))); for (int i = 0; i < components.length; i++) { if (components[i].getMenuComponents().length > 0) { if (isAllowed(components[i])) { displayComponents(components[i], level + 1); } } else { if (isAllowed(components[i])) { out.println(displayStrings.getMessage("smd.menu.item", components[i].getUrl(), super.getMenuTarget(components[i]), super.getMenuToolTip(components[i]), this.getSpace(level + 1) + getImage(components[i]) + this.getMessage(components[i].getTitle()))); } } } } else { out.println(displayStrings.getMessage("smd.menu.item", menu.getUrl(), super.getMenuTarget(menu), super.getMenuToolTip(menu), this.getSpace(level) + getImage(menu) + getMessage(menu.getTitle()))); } } protected String getSpace(int length) { String space = EMPTY; for (int i = 0; i < length; i++) { space = space + nbsp + nbsp; } return space; } protected String getImage(MenuComponent menu) { String imageTag; if ((menu.getImage() == null) || (menu.getImage().equals(EMPTY))) { imageTag = EMPTY; } else { imageTag = displayStrings.getMessage("smd.menu.item.image", menu.getImage(), super.getMenuToolTip(menu)); } return imageTag; } }
package net.sf.navigator.displayer; import net.sf.navigator.menu.MenuComponent; import javax.servlet.jsp.JspException; import java.io.IOException; /** * * @author <a href="mailto:matt@raibledesigns.com">Matt Raible</a> * @version 1.0 */ public class TabbedMenuDisplayer extends ListMenuDisplayer { //~ Methods ================================================================ public void display(MenuComponent menu) throws JspException, IOException { if (isAllowed(menu)) { displayComponents(menu, 0); } } protected void displayComponents(MenuComponent menu, int level) throws JspException, IOException { MenuComponent[] components = menu.getMenuComponents(); if (components.length > 0) { out.print("\t<li>"); String menuClass = "submenu"; if (level >= 1) { menuClass = "deepmenu"; } if (menu.getUrl() == null) { log.info("The Menu '" + getMessage(menu.getTitle()) + "' does not have a location defined, using first submenu's location"); menu.setUrl(components[0].getUrl()); } out.print(displayStrings.getMessage("tmd.menu.tab", menu.getUrl(), super.getMenuToolTip(menu), getExtra(menu), getMessage(menu.getTitle()))); for (int i = 0; i < components.length; i++) { // check the permissions on this component if (isAllowed(components[i])) { if (components[i].getMenuComponents().length > 0) { // and an <li> for submenus (but not deepmenus) if (menuClass.equals("submenu")) { out.print("<li>"); } displayComponents(components[i], level + 1); out.println("</ul></li>"); if (i == (components[i].getMenuComponents().length - 1)) { // last one out.println("</li>"); } } else { out.println(displayStrings.getMessage("tmd.menu.item", components[i].getUrl(), super.getMenuToolTip(components[i]), super.getExtra(components[i]), this.getMessage(components[i].getTitle()))); } } } // close the </ul> for the top menu if (menuClass.equals("submenu")) { out.println("\t</ul>"); } out.print("\t</li>"); } else { out.println(displayStrings.getMessage("tmd.menu.item", menu.getUrl(), super.getMenuToolTip(menu), super.getExtra(menu), getMessage(menu.getTitle()))); } } }
package net.sf.navigator.displayer; import net.sf.navigator.menu.MenuComponent; import javax.servlet.jsp.JspException; import java.io.IOException; /** * * @author <a href="mailto:matt@raibledesigns.com">Matt Raible</a> * @version 1.0 */ public class CSSListMenuDisplayer extends ListMenuDisplayer { //~ Methods ================================================================ public void display(MenuComponent menu) throws JspException, IOException { if (isAllowed(menu)) { out.println(displayStrings.getMessage("ccslm.menu.top", (hasViewableChildren(menu)) ? " class=\"menubar\"" : "")); displayComponents(menu, 0); out.println(displayStrings.getMessage("lmd.menu.bottom")); } } protected void displayComponents(MenuComponent menu, int level) throws JspException, IOException { if (menu.getUrl() == null) { // http://issues.appfuse.org/browse/SM-48 - javascript:void(0) works better than # menu.setUrl("javascript:void(0)"); } MenuComponent[] components = menu.getMenuComponents(); if (components.length > 0) { // if there is a location/page/action tag on base item use it if (components.length == 0){ out.println(displayStrings.getMessage("lmd.menu.item", menu.getUrl(), super.getMenuToolTip(menu), getExtra(menu), this.getMessage(menu.getTitle()))); } else { out.println(displayStrings.getMessage("ccslm.menubar.top", menu.getUrl(), getExtra(menu), this.getMessage(menu.getTitle()))); if (hasViewableChildren(menu)) { out.println("\t\t<ul>"); } } for (int i = 0; i < components.length; i++) { // check the permissions on this component if (isAllowed(components[i])) { if (components[i].getMenuComponents().length > 0) { if (!hasViewableChildren(components[i])) { out.println("<li>"); } else { out.println("<li class=\"menubar\">"); } displayComponents(components[i], level + 1); out.println((hasViewableChildren(components[i]) ? "\t\t</ul>\t</li>\n" : "\t</li>\n")); //out.println(displayStrings.getMessage("lmd.menu.actuator.bottom")); } else { out.println(displayStrings.getMessage("lmd.menu.item", components[i].getUrl(), super.getMenuToolTip(components[i]), getExtra(components[i]), this.getMessage(components[i].getTitle()))); } } } // close the </ul> for the top menu if (level == 0 && hasViewableChildren(menu)) { out.println("</ul>"); } } else { if (menu.getParent() == null) { out.println(displayStrings.getMessage("lmd.menu.standalone", menu.getUrl(), super.getMenuToolTip(menu), getExtra(menu), getMessage(menu.getTitle()))); } else { out.println(displayStrings.getMessage("lmd.menu.item", menu.getUrl(), super.getMenuToolTip(menu), getExtra(menu), 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; } }
发表评论
-
Temp
2010-10-22 14:07 0afvkdsjfkldsajflkjdsf dsafjlkds ... -
KPI PPT and dictionary
2010-02-16 20:47 0KPI PPT and dictionary -
Maven configruation sample with codehaus and surefile
2009-07-19 22:46 1312<project xmlns="http: ... -
Service Configuration
2009-07-12 21:35 0<service-configurations> ... -
Code Generator
2009-05-15 00:12 0package mcfe.tools.codegenera ... -
Velocity Sample
2009-04-15 00:37 1458/* * Licensed to the Apache ... -
Dozer Sample
2009-04-14 01:07 1518Configurable dozer converter: ... -
Maven
2009-03-04 22:58 1776<reporting> <pl ... -
Struts - menu permission
2009-03-03 01:07 2210<?xml version="1.0&qu ... -
Unit Testing
2009-03-02 23:21 930Spring Annotation for Junit ... -
Base Class Sample
2009-02-28 12:54 919protected final transient ... -
Spring request/session scope bean
2009-02-27 22:10 2068Being able to define a bean sco ... -
Configuration file
2009-02-15 23:25 0Configuration file reader: p ... -
Spring的httpsession管理问题?
2008-10-17 23:15 3254现在的有这样一个需求,有一个基于spring mvc的 web ... -
hibernate 如何部分更新需要的字段而不是所有的?
2007-04-11 09:22 4047比如created_user,created_time等字段, ... -
hibernate多对多关联的一个问题
2007-03-31 11:14 3307有这样两张表,部门和雇员 需求:1 每个部门有多个雇员; ...
相关推荐
Struts-menu是一个专门为Apache Struts框架设计的菜单生成和管理工具。它简化了在Web应用中创建动态、可配置的导航菜单的过程。Struts-menu提供了一种声明式的方式来定义菜单结构,使得开发者无需编写大量的HTML和...
Struts-Menu是一个基于Apache Struts框架的菜单生成库,它可以帮助开发者轻松地在Web应用中创建动态、可配置的菜单结构。这个实例教程将深入介绍如何使用Struts-Menu来构建用户界面的导航系统。 1. **Struts框架...
这个例子主要关注的是如何将`struts-menu`与Struts2.3.1进行集成,以便创建一个用户友好的菜单系统。 `struts-menu`是一个开源项目,用于生成基于JSP的动态菜单。它支持多种格式的数据源,如XML、数据库等,可以...
此版本包含核心库`struts-menu-2.4.1.jar`和Web应用包`struts-menu-2.4.1.war`,后者需解压后获取所需文件。 #### 集成Struts-menu 要将Struts-menu集成到现有的Struts应用中,需遵循以下步骤: 1. **放置JAR包**...
struts-menu-2.4.1.jar struts-menu-2.4.1.jar
Struts-menu入门Demo是一个针对Java Web开发人员的实践教程,主要使用了Struts、Hibernate和MySQL这三大核心技术。这个入门示例提供了一个完整的项目结构,包括数据库文件,使得开发者能够直接运行并理解其工作原理...
struts-menu 2.4.3.jar
struts-menu
Struts-menu是一个基于Java的开源项目,用于在Struts框架中生成动态菜单。这个例子是Struts-menu的一个实例,提供给需要了解或使用Struts-menu的开发者参考。下面将详细介绍Struts-menu及其在实际开发中的应用,以及...
Struts-menu是一个基于Java EE平台的开源框架,用于构建企业级Web应用程序。它与Apache Struts框架相结合,提供了一种组织和展示应用菜单结构的方法。这个"Struts-menu例子加视频"的学习资源显然旨在帮助开发者更好...
7. **JSP页面集成**:在JSP页面中,通过`<struts:menu>`标签及其属性(如`useMenuDisplayer`)来指定菜单的显示风格,并根据配置的menu-config.xml生成实际的菜单。 在没有权限控制的情况下,只需要完成以上步骤,...
struts-menu-2.4.jar,构建强大菜单
Struts-menu-2.0是基于Apache Struts框架的一个扩展组件,主要用于构建Web应用程序的菜单系统。这个组件的出现,极大地简化了在Struts应用中创建动态、可配置的菜单的过程,使得开发者能够更加专注于业务逻辑,而...
在实际应用中,`strutsMenu`这个文件可能是整个实例的源码或者示例项目的打包文件。它可能包含了以下内容: - `struts-menu.xml`:配置文件,定义了菜单结构。 - `MenuAction.java`:可能是一个处理菜单逻辑的...
Struts-menu是一个专门为Struts框架设计的权限管理组件,它为Web应用提供了灵活且强大的菜单构建和权限控制功能。在实际的项目开发中,权限控制是必不可少的一部分,它确保了不同用户只能访问他们被授权的功能和数据...
Struts-menu是一个基于Apache Struts框架的菜单管理组件,它为Web应用提供了动态生成和管理菜单的功能。在分析Struts-menu的源码时,我们可以深入理解Struts框架的工作原理、MVC模式的应用以及如何实现自定义标签库...
"struts-menu-2.4.3-src" 是 Struts Menu 的2.4.3版本的源代码包,这对于开发者深入理解其工作原理、进行定制化开发或者修复潜在问题非常有帮助。 在"struts-menu-2.4.3"这个压缩包中,我们可以期待找到以下内容: ...
Struts-menu是一个在Java Web开发中用于生成动态菜单的开源组件,主要应用于基于Struts框架的应用程序。这个组件能够帮助开发者从XML配置文件中提取数据,生成用户界面的菜单结构,使得应用程序的导航部分更加灵活和...
1. struts-menu-2.4.3.jar:这是StrutsMenu的核心库,版本为2.4.3。这个JAR文件包含了所有必要的类和资源,用于在Struts应用中集成并使用菜单功能。它提供了配置和API,允许开发者根据权限、角色和URL映射来动态地...