tomcat-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Mark Thomas <>
Subject Re: The best place for implementing context specific behavior?
Date Wed, 24 Jun 2009 21:19:44 GMT
Jonathan Mast wrote:
> Andre, its one single, physical app/docBase, mapped to multiple contexts
> (which happen to located on different virtual hosts).  This is a
> requirement.
> The /META-INF/context.xml approach is ruled out by this requirement.
> My goal is to have a layer of code takes a the current host (eg.
> looks it up in a database where it is linked to
> host-specific content.  After this stage, the showFruit.jsp will display an
> Apple and so on.
>> - 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
> But where do I find this elusive init() method?

Use a context listener.

Other tips you might find useful:
- make sure each virtual host has its own work directory
- rename your app ROOT.war rather than fruit.war (or ROOT rather than
fruit if deployed as a dir) to prevent double deployment
- turn off unpackWARs for all the hosts if deploying as a WAR


> On Wed, Jun 24, 2009 at 5:01 PM, André Warnier <> wrote:
>> Hi.
>> 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 :
>> but
>>> 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
>> Initialization.
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail:
>> For additional commands, e-mail:

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

View raw message