Recently I migrated my web application from Resin to Tomcat. In one of the filter init methods I had to access the web application context name i.e if the URI is http://foo.com/bar/moo.html then the context name would be bar.
I was using getServletContextName() method of servlet context object. In resin I used to get the application context name. After migrating to Tomcat I started getting the same as null.
Servlet 2.4 api spec says the following regarding getServletContextName():
Returns the name of this web application corresponding to this ServletContext as specified in the deployment descriptor for this web application by the display-name element.
This was a revelation to me as until now I had assumed that getContextName() returns the starting part of the URI. Resin does do this. Resin implementation of getServletContextName() says this:
Returns the URL prefix for the ServletContext.
Then I took a look at the Tomcat implementation. Tomcat confirms to servlet api specifications.
Now I started thinking as to how to make my application container independent. If my code was inside the doFilter method instead of init, I could use request.getServletPath() to access the application context name. But my code was in the init method with no access to request response objects. A user in Tomcat mailing list pointed out that Tomcat 6.x implemets servlet api 2.5 specs and in 2.5 specs there is a method in ServletContext object to get the application context name. Upgrading to 2.5 servlet api resolved my problem.