tomcat-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From André Warnier>
Subject Re: The best place for implementing context specific behavior?
Date Wed, 24 Jun 2009 21:01:46 GMT

I am one of the least Tomcat and Java qualified people that regularly 
lurk on this forum, so don't take my word for any of what follows.
Let's say that I am just trying to apply what I think I have learned here.
And I am eager for contradiction, because it is said that this is how 
one learns.

Jonathan Mast wrote:
> I have a webapp that I would like to behave in a context (actually
> host)-specific manner.  Where is the best place to initialize the
> context/host specific functionality?
> Let me demonstrate what I'm talking about.  Lets say I have a webapp Fruit
> located in folder webapps/fruit.
> I want to define:
> etc  ...
> all of which point to webapps/fruit  (these are hosts with a "/" context
> pointing to "webapps/fruit" as the docBase, to be more precise).

appBase ?

Do you mean all Hosts point to the *same physical* webapps/fruit, or 
does each Host have its own copy in a separate directory ?

> When someone visits they see an apple, when they visit
> they see a banana, and so on.
> Where in the fruit app is the best place for instance of Fruit to introspect
> itself (basically look for what host name it is defined under) and prepare
> accordingly?
> I've looked into using Context Parameters in the server.xml declarations 

That would probably better be in a /META-INF/context.xml, no ?
(at least if these are distinct webapp/fruit)

or see here for more complete info :

> I would like to avoid this if possible b/c this functionally is more
> elegantly determined through introspection (the web-app saying "what host do
> i belong to?").
> Of course I could always call request.getLocalName(), 
I think you want getServerName(), or you'd always get the same DNS 
name/IP, no matter wich virtual Host is called..

but that would be
> inefficient as it would have to be invoked on every request.
> I guess what I'm looking for someplace in the context initialization process
> where i could hook into and do my stuff and have it apply to the entire
> context throughout it's lifecycle.  Can't seem to find it digging around the
> javax.servlet.* javadocs.

I reason as follows :
- a webapp is run by a thread
- a thread is started by a Connector
- I don't think that a thread is Host-specific, in the sense that it can 
run one webapp for one Host, and the next instant run another webapp for 
another Host.

What I'm saying is that I am not sure that above the Request level, you 
will find anything that is "Host-persistent" to keep your stuff in and 
retrieve it (I mean for webapps shared by several Hosts, which is 
probably a bad idea anyway).

To this eager student thus, the correct way to do what I understand you 
want to do, seems to be :
- have each Host have its own appBase (webapp dir), with in each a copy 
of your (identical) webapp code "Fruit".
- have your webapp (actually I guess, the first servlet) in it's init() 
code, get the hostname from getServerName() and perform whatever setup 
it needs to. Then save this in an attribute of the ServletContext
- which should then be available at each subsequent execution of any 
servlet composing the webapp

Inspired by the Servlet Spec 2.5, section 2.3 Servlet lifecyle, 2.3.2 

To unsubscribe, e-mail:
For additional commands, e-mail:

View raw message