Raible's Wiki
Raible Designs AppFuseHomepage- Korean - Chinese - Italian - Japanese QuickStart Guide User Guide Tutorials Other ApplicationsStruts ResumeSecurity Example Struts Menu
Set your name in
UserPreferences
Referenced by
JSPWiki v2.2.33
Hide Menu |
This is version 11.
It is not the current version, and thus it cannot be edited. I did some refactorings on Struts Menu in the last few days and thought I'd document them here as it's a bit more convenient than via e-mail. Also, I have a couple issues that might be better exposed here vs. a mailing list. Refactorings
page="/velocity.jsp?test=${test}In this example, the variable 'test' is searched for using pageContext.findAttribute("test"). You could easily set this parameter using JSTL and <c:set var="test" value="value" />. I also added support for request parameters if not found in the pageContext.
context.put("formatter", new VelocityFormatter(context)); context.put("now", Calendar.getInstance().getTime()); context.put("ctxPath", request.getContextPath()); // see if a name and property were passed in if (!StringUtils.isEmpty(name)) { Object val1 = RequestUtils.lookup(pageContext, name, null, null); if (val1 != null) { context.put(name, val1); } } // request-scope attributes Enumeration enum = request.getAttributeNames(); while (enum.hasMoreElements()) { String name = (String) enum.nextElement(); Object value = request.getAttribute(name); context.put(name, value); } context.put("request", request); context.put("session", request.getSession()); context.put("menu", menu); context.put("displayer", this); Here is a sample velocity template for rendering a simple menu. It shouldn't be too hard to re-create the existing using Velocity templates. ## Evaluates other macros. #macro(eval $_macro)$_macro#end #macro( displayMenu $menu $level ) #if ($menu.components.size() > 0) ## display top menu #menuItem($menu $level) #foreach ($menu in $menu.components) #local ($menu $level) #set ($level = $level+1) #if ($menu.components.size() > 0) #eval("#displayMenu($menu $level)") #else #menuItem($menu $level) #end #end #end #else #menuItem($menu $level) #end #end #macro( menuItem $menu $level ) #foreach ($i in [0..$level]) #end #if ($menu.url) <a href="$menu.url" title="$menu.title"> $menu.title</a> #else $menu.title #end <br /> #end #displayMenu($menu 0) This is configured in your JSP using: <menu:useMenuDisplayer name="Velocity" config="/table.html" bundle="org.apache.struts.action.MESSAGE"> <menu:displayMenu name="indexMenu"/> </menu:useMenuDisplayer> Where config points to a file relative to your webapp. You can also use config="table.html" where table.html is under WEB-INF/classes. Issues
UPDATE: I solved all of these issues by implementing Velocity's WebappLoader rather than the one from Roller. Here's the code I used to initialize it: /** * Key used to access the ServletContext in the Velocity application attributes. */ public static final String SERVLET_CONTEXT_KEY = ServletContext.class.getName(); //~ Methods ================================================================ public void init(PageContext pageContext, MenuDisplayerMapping mapping) { super.init(pageContext, mapping); this.pageContext = pageContext; // MR: Copied from VelocityViewServlet to initialize WebappLoader Velocity.setApplicationAttribute(SERVLET_CONTEXT_KEY, pageContext.getServletContext()); // default to servletlogger, which logs to the servlet engines log Velocity.setProperty(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS, ServletLogger.class.getName()); // by default, load resources with webapp resource loader Velocity.setProperty(RuntimeConstants.RESOURCE_LOADER, "webapp"); Velocity.setProperty("webapp.resource.loader.class", WebappLoader.class.getName()); // now all is ready - init Velocity try { ResourceBundle rb = ResourceBundle.getBundle("velocity"); Properties props = new Properties(); for (Enumeration keys = rb.getKeys();keys.hasMoreElements();) { String key = (String) keys.nextElement(); props.put(key, rb.getString(key)); } // only initialized the first time it's called, from: // http://jakarta.apache.org/velocity/developer-guide.html // it's ignored for subsequent calls Velocity.init(props); } catch (Exception e) { log.error("Error initializing Velocity: " + e.getMessage()); e.printStackTrace(); }} TODO
Comments, suggestions or questions are most welcome. If not here, doing it on one of the mailing lists is probably most appropriate. Update: I just thought of something that would be pretty cool. Allow the name in <menu:displayMenu name="indexMenu"/> to refer to the name of a tiles definition that defines a menu. That'd be slick!
|