I think there is some kind of fall-back sequence coded in one of the Velocity context implementations where if a key is not found in the context then it is also looked up as a request parameter, session attribute, etc. If I remember correctly it is in the ViewToolContext class.
On Thu, Jan 5, 2012 at 4:15 PM, Christopher Schultz < ch...@christopherschultz.net> wrote: > All, > > On 1/5/12 4:05 PM, Christopher Schultz wrote: > > I found some errors in my log file about a particular 'layout' not being > > found. Coincidentally, I had a request parameter called "layout" with > > some data in it and it seemed to be triggering a change to the layout > > file that VelocityViewServlet attempts to use. > > I am using a custom subclass of VelocityViewServlet that changes the > error handling and also the Context creation by taking the user's Struts > locale and putting it into the Context. Here's the method: > > protected Context createContext(HttpServletRequest request, > HttpServletResponse response) > { > Context ctx = super.createContext(request, response); > > // Don't clobber an existing key > if(!ctx.containsKey("locale")) > { > Locale locale = null; > HttpSession session = request.getSession(false); > if(null != session) > locale = (Locale)session.getAttribute(Globals.LOCALE_KEY); > > if(null == locale) > locale = request.getLocale(); > > ctx.put("locale", locale); > } > > // DEBUG > System.err.println("createContext: 'layout'=" > + ctx.get("layout")); > ctx.put("theContext", ctx); > return ctx; > } > > I added that debugging code at the bottom, and the log confirms that, at > this stage, 'layout' is null in the context. I stuck the 'theContext' > into itself so I could inspect it from the page, like this: > > request: $!request.getParameter('layout') > context: $!theContext.get('layout') > app: $!request.servletContext.getAttribute('layout') > bare layout = $!layout > > The output from this template displays the following: > > request: Help.vm > context: Help.vm > app: > bare layout: Help.vm > > So, somehow the request parameter is in fact being copied into the > velocity context, where it affects VelocityLayoutServlet's rendering of > the page. > > I'll get a stack trace of where the context key is being set, next. > > -chris > >