Raible's Wiki

Raible Designs
Wiki Home
News
Recent Changes

AppFuse

Homepage
  - Korean
  - Chinese
  - Italian
  - Japanese

QuickStart Guide
  - Chinese
  - French
  - German
  - Italian
  - Korean
  - Portuguese
  - Spanish
  - Japanese

User Guide
  - Korean
  - Chinese

Tutorials
  - Chinese
  - German
  - Italian
  - Korean
  - Portuguese
  - Spanish

FAQ
  - Korean

Latest Downloads

Other Applications

Struts Resume
Security Example
Struts Menu

Set your name in
UserPreferences


Referenced by
LeftMenu




JSPWiki v2.2.33

[RSS]


Hide Menu

StrutsMenu


This is version 2. It is not the current version, and thus it cannot be edited.
[Back to current version]   [Restore this version]


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:

  • Migrated to Maven for building and deploying.
  • Renamed package from com.fgm.menu to net.sf.navigator.
  • Checked in as a new module on SourceForge called "navigator". I liked the name and thought it would be a bit cleaner than "struts-menu" going forward. I'd like to use the same project at SF, just have a new name for the package/releases/files.
  • Added the ability to specify dynamic parameters in menu-config.xml. Example:
  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" />. It probably wouldn't be too hard to add support for request parameters too.
  • Added a VelocityMenuDisplayer which puts a bunch of stuff in a VelocityContext for creating of menus with Velocity. This might make for an easy way to use this navigation system and build it from a database. Just put your Tree (or whatever you want to use) into the request, and grab it in the template. Here are all the current variables exposed:
    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])
    &nbsp;&nbsp;
  #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.


TODOs:

  • Use XDoclet to generate the .tld file.
  • Currently, to do recursion in Velocity templates, I had to use a #local declaration which is in the "whiteboard" directory of Velocities CVS. See velocity's mailing list for more information.
  • Improve documentation and examples in Maven docs.
  • Edit Maven files to generate distribution files.
  • Unit Tests!!

Comments, suggestions or questions are most welcome. If not here, doing it on one of the mailing lists is probably most appropriate.



Go to top   More info...   Attach file...
This particular version was published on 06-Nov-2006 13:52:37 MST by MattRaible.