Oh, i should also mention that it's written for VelocityTools 1.3-dev, so it doesn't currently declare that it implements the Configurable or ViewTool interfaces. To work with previous VelocityTools versions, it will need to at least declare that it implements ViewTool.
On 10/18/06, Nathan Bubna <[EMAIL PROTECTED]> wrote:
On 10/18/06, Charles Harvey III <[EMAIL PROTECTED]> wrote: > Ok. I tried this out. And it works... sort of. There are definately > things missing and I can't figure out why. > > As in, I know for sure that I am doing: > > request.setAttribute( "person", person ); > > And "person" isn't in the list of $request.attributeNames. I can't for the > life of me figure out why though. Is there something I am missing? This > is what is getting printed to the page for the $request.attributeNames: > > # javax.servlet.forward.request_uri > # javax.servlet.forward.context_path > # javax.servlet.forward.servlet_path > # javax.servlet.forward.path_info > # org.springframework.web.servlet.DispatcherServlet.THEME > # __acegi_session_integration_filter_applied > # org.springframework.web.servlet.DispatcherServlet.CONTEXT > # __acegi_filterSecurityInterceptor_filterApplied > # org.springframework.web.servlet.DispatcherServlet.LOCALE That's pretty odd. Assuming you're sure that the setAttribute and the getAttributeNames are happening in the same request thread (not subsequent requests or some sort of secondary connection, like with ImportTool), then i'm really not sure why the person attribute would be removed. It's not something that the VVS or VLS would do. > What is even stranger is that it works for the session. > $session.attributeNames: > > # website > # IS_USER_ONLINE_SESSION_BINDING_LISTENER > > Those are definately two values that I specifically put into the > session. All > I can think of is that Spring is doing something to my objects and I guess I > have to go figure out what. might try checking out the exact class of the request object to see if it is being wrapped along the way $request.class.name Also, if you want to hack around, i hacked up a quick ContextTool. I haven't tested it yet (and thus haven't committed it) and it relies on the addition of a new method to VelocityTools' ChainedContext class, but i figure you should be able to get it working without much modification. Let me know what you think... /* * Copyright 2006 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.velocity.tools.view.tools; import java.util.Arrays; import java.util.Enumeration; import java.util.HashSet; import java.util.Iterator; import java.util.Map; import java.util.Set; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import javax.servlet.ServletContext; import org.apache.velocity.context.AbstractContext; import org.apache.velocity.context.Context; import org.apache.velocity.tools.generic.ValueParser; import org.apache.velocity.tools.view.context.ChainedContext; import org.apache.velocity.tools.view.context.ViewContext; /** * <p>View tool for convenient access to all available context keys and values.</p> * <p><pre> * Template example(s): * #foreach( $key in $context.keys ) * $key = $context.get($key) * #end * * Toolbox configuration: * <tool> * <key>context</key> * <scope>request</scope> * <class>org.apache.velocity.tools.view.tools.ContextTool</class> * </tool> * </pre></p> * * <p>This class is only designed for use as a request-scope tool.</p> * * @author <a href="mailto:[EMAIL PROTECTED]">Nathan Bubna</a> * @since VelocityTools 1.3 * @version $Id: ContextTool.java 385122 2006-03-11 18:37:42Z nbubna $ */ public class ContextTool { /** * The key used for specifying whether to hide keys with '.' in them. */ public static final String SAFE_MODE_KEY = "safe-mode"; protected ViewContext context; protected HttpServletRequest request; protected HttpSession session; protected ServletContext application; private boolean safeMode = true; /** * Looks for a safe-mode configuration setting. By default, * safe-mode is true and thus keys with '.' in them are hidden. */ public void configure(Map params) { if (params != null) { ValueParser parser = new ValueParser(params); safeMode = parser.getBoolean(SAFE_MODE_KEY, true); } } /** * Initializes this instance for the current request. * * @param obj the ViewContext of the current request */ public void init(Object obj) { this.context = (ViewContext)obj; this.request = context.getRequest(); this.session = request.getSession(false); this.application = context.getServletContext(); } /** * Return a [EMAIL PROTECTED] Set} of the available reference keys in the current * context. */ public Set getKeys() { Set keys = new HashSet(); // get the tool keys, if there is a toolbox if (this.context instanceof ChainedContext) { Set toolKeys = ((ChainedContext)this.context).getToolKeys(); keys.addAll(toolKeys); } // recurse down the velocity context collecting keys Context velctx = this.context.getVelocityContext(); while (velctx != null) { Object[] ctxKeys = velctx.getKeys(); keys.addAll(Arrays.asList(ctxKeys)); if (velctx instanceof AbstractContext) { velctx = ((AbstractContext)velctx).getChainedContext(); } else { velctx = null; } } // get request attribute keys Enumeration e = request.getAttributeNames(); while (e.hasMoreElements()) { keys.add(e.nextElement()); } // get session attribute keys if we have a session if (session != null) { e = session.getAttributeNames(); while (e.hasMoreElements()) { keys.add(e.nextElement()); } } // get request attribute keys e = application.getAttributeNames(); while (e.hasMoreElements()) { keys.add(e.nextElement()); } // if we're in safe mode, remove keys that contain '.' if (safeMode) { for (Iterator i = keys.iterator(); i.hasNext(); ) { String key = String.valueOf(i.next()); if (key.indexOf('.') >= 0) { i.remove(); } } } // return the key set return keys; } /** * Retrieves the value for the specified reference name (aka context key). */ public Object get(Object refName) { String key = String.valueOf(refName); if (safeMode && key.indexOf('.') >= 0) { return null; } return this.context.getVelocityContext().get(key); } }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]