abdera-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From James M Snell <jasn...@gmail.com>
Subject Re: Passing an Object from the servlet through to the provider?
Date Wed, 14 May 2008 14:52:18 GMT


Glen Daniels wrote:
> Hi James!
> 
> James M Snell wrote:
>> RequestContext.setAttribute(Scope scope, String name, Object value) 
>> ... where Scope == Scope.REQUEST or Scope.SESSION
>>
>> Does that work for what you need?
> 
> Nope, because that implies you have access to the RequestContext, which 
> I don't.  Even if I subclass AbderaServlet, there's no hook in service() 
> that lets me get at the ServletRequestContext in between creation and 
> passing it to the Provider/TargetResolver.
> 

You can create a Filter.  The filters are invoked immediately before the 
Provider.  I've used them to set properties on the RequestContext prior 
to passing it off to the Provider for handling.

> To be clear, here's my situation:
> 
> class Servlet1 {
>   init() {
>     Object thing = createObject(); // Here's my thing
>     servletContext.setAttribute("thing", thing);  // Store it somewhere
>   }
> }
> 
> class MyServlet extends AbderaServlet {
>   service(request, response) {
>     // I can't get at the ServletContext from within Abdera, so...
>     Object thing = servletContext.getAttribute("thing");
>     // ...put it somewhere I *can* get to
>     request.setAttribute("thing", thing);
>     super.service(request, response);
>   }
> }
> 
> If AbderaServlet made the ServletContext available in the same way it 
> makes the HttpServletRequest available, I wouldn't need the subclassed 
> servlet or the per-request overhead.

True. Ok, I'll see what I can do... unless, of course, you want to 
submit a patch :-)

- James

> 
> --Glen
> 
>> Glen Daniels wrote:
>>> Hey Abderites:
>>>
>>> So here's my situation.  I've got an Abdera server (i.e. 
>>> AbderaServlet in Tomcat) running that needs to share some information 
>>> with another servlet.  In particular, the non-AbderaServlet (let's 
>>> call it Servlet1) needs to create an Object and then in an ideal 
>>> world pass that through to the AbderaServlet in such a way that the 
>>> Provider instance that gets created has access to it.  Make sense?
>>>
>>> The best solution for me would be to put something into the 
>>> ServletContext, and then somehow get access to that later - but I 
>>> can't seem to do that currently.
>>>
>>> Since the initialization step doesn't really need to be done until 
>>> the first actual request, and I've already got a solid connection 
>>> between my Provider and my TargetResolver, I figured one way would be 
>>> something like (pseudocode):
>>>
>>> TargetResolver.resolve(Request request) {
>>>   ServletRequestContext context = (ServletRequestContext)request;
>>>   if (thing == null) {
>>>     thing = context.getServletContext().getAttribute("thing");
>>>   }
>>> }
>>>
>>> A patch that would just carry the ServletContext in addition to the 
>>> HttpServletRequest in each ServletRequestContext would be very easy 
>>> to do in Abdera, and would get me what I need.  Am happy to 
>>> contribute same.
>>>
>>> Is there a better way to do this?  I noticed the ManagedProvider 
>>> stuff but it looks like you can only pass Strings in there, and only 
>>> in very specific ways.  Perhaps some kind of more general 
>>> initialization context that I'm missing?  The above patch would solve 
>>> my problem later but not in v0.4.0.
>>>
>>> The solution I've come up with for now is to subclass the 
>>> AbderaServlet, and add the ServletContext to every HttpRequest as an 
>>> attribute - that lets me do basically the same trick, but it seems... 
>>> less than optimal.
>>>
>>> Thoughts/comments?
>>>
>>> Thanks,
>>> --Glen
>>>
>>
> 

Mime
View raw message