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 16.
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])
&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. 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!
|
||||||