tomcat-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Craig R. McClanahan" <craig...@apache.org>
Subject Re: Is there a way to get the "docBase" property from within a servlet?
Date Wed, 05 Sep 2001 22:00:11 GMT


On Wed, 5 Sep 2001, Rick Mann wrote:

> Date: Wed, 05 Sep 2001 14:38:07 -0700
> From: Rick Mann <rmann@latencyzero.com>
> To: tomcat user jakarta.apache.org <tomcat-user@jakarta.apache.org>,
>      Craig R. McClanahan <craigmcc@apache.org>
> Subject: Re: Is there a way to get the "docBase" property from within a
>     servlet?
>
> on 9/1/01 9:48 PM, Craig R. McClanahan at craigmcc@apache.org wrote:
>
> >> Is there a Servlet spec-compliant way to get the webapp's directory's path
> >> programmatically, from within a servlet?
> >
> > No.
> >
> >> Something like calling
> >> ServletConfig.getInitParameter("docBase"), but something that's standard,
> >> and that does not require me to specify the path explicitly in a
> >> configuration file?
> >>
> >
> > You are starting from an incorect assumption, that there *is* such a thing
> > as a portable "directory path" to a web application.  It is entirely legal
> > for a servlet container to run a web application directly from a WAR file
> > (in which case there is no expanded directory), or by storing its static
> > resources in some other sort of structure (such as being BLOB objects in a
> > database).
>
> Okay. I get that. How does one access a resource, then, whether it's a file
> in a directory or a file in a WAR file? For example, we have properties
> files that specify certain things for our web app. Currently, I provide a
> full path, from root, to this file as an init param to a servlet that gets
> loaded at context startup.
>
> I'd like to be able to refer to this file relative to the web app's
> directory (or within the web app's) .WAR file. Can you tell me how I'd go
> about doing this, or what concepts to search for in the documentation to
> answer this question?
>

The API calls for this are ServletContext.getResource() and
ServletContext.getResourcesAsStream().  The path you specify is context
relative, and must start with a slash ("/") character.  Details are in the
servlet specification, available at:

  http://java.sun.com/products/servlet/download.html

For example, let's assume you wanted to parse the web app deployment
descriptor for your application.  You can access it like this:

  InputStream is =
    getServletContext().getResourceAsStream("/WEB-INF/web.xml");

The /WEB-INF directory is a good place to put resource files like this,
because the servlet container will refuse to serve them in response to a
direct request from a client.  Plus, this call will work no matter how
your servlet container deploys your application (in a directory, in a WAR
file, or whatever).  It also doesn't matter what context path your app
ends up with, because the path is only relative to the context.

In Servlet 2.3 (i.e. Tomcat 4.0), a new call was added that acts like the
list() method of the java.io.File class.  For instance, to see the names
of all the resources in the "/WEB-INF" directory, you can say:

  Set paths =
   getServletContext().getResourcePaths("/WEB-INF");

and process all of them.  Tomcat 4 uses this, for example, to do directory
listings when there is no welcome file in the selected directory.


> As always, thanks for your help,
>
> ------------------------------------------------------------
> Roderick Mann               rmann @ latencyzero.com.sansspam
>
>
>

Craig



Mime
View raw message