Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get ContextPath in init() method of Servlet version 2.4

I'm using version 2.4 of Servlet and I need to get the ContextPath through the init() method which is called on server start, so I don't have any Request object that could call getContextPath() and because the Servlet version I do not have getContextPath() method in the ServletContext either.

Is there a way to get this ContextPath() somehow ?

like image 685
Lama Avatar asked Dec 14 '12 13:12

Lama


3 Answers

One web application can be published at several different context paths, so the context path (singular) is only meaningful in the context of a particular request. Servlet 2.5 added getContextPath() to ServletContext, specified to return the "primary" context path for this web application, but there's no container-independent way to access this information in earlier spec versions.

There may be tricks that work for certain containers, for example on Tomcat the ServletContext.getResource() method returns URLs with a custom scheme, of the form jndi://hostname/context/.... Thus you may be able to use

ctx.getResource("/").getPath()

to get the context path on Tomcat (or possibly getResource("/WEB-INF/web.xml") and trim off the tail, as getResource() is specified to return null if you ask it for a file that does not exist). You will have to experiment with different containers to find similar tricks that work on those.

like image 81
Ian Roberts Avatar answered Nov 15 '22 01:11

Ian Roberts


It seems to be only possible form servlet 2.5 as explained in this post: ServletContext getContextPath()

like image 42
krampstudio Avatar answered Nov 15 '22 00:11

krampstudio


You are right in Servlet 2.4 the object ServeltContext does not have the method getContextPath.

I can suggest two options:

  1. Set the context path as parameter of the servlet:

    <servlet>

    <servlet-name>initServlet</servlet-name>
    
    <servlet-class>net.cirrus-it.InitServlet`</servlet-class>
    
    <init-param>
            <param-name>contextPath</param-name>
            <param-value>/myApp</param-value>
    </init-param>
    

    </servlet>

  2. Try to determine the context path from the method getRealPath()

http://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/ServletContext.html#getRealPath(java.lang.String)

According to the documentation:

Returns a String containing the real path for a given virtual path. For example, the path "/index.html" returns the absolute file path on the server's filesystem would be served by a request for "http://host/contextPath/index.html", where contextPath is the context path of this ServletContext.

like image 20
Ernesto Campohermoso Avatar answered Nov 15 '22 01:11

Ernesto Campohermoso