Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to find the working folder of a servlet based application in order to load resources

I write a Java servlet that I want to install on many instances of Tomcat on different servers. The servlet uses some static files that are packed with the war file under WEB-INF. This is the directory structure in a typical installation:

- tomcat -- webapps --- myapp ---- index.html ---- WEB-INF ----- web.xml ----- classes ------ src ------- ..... ----- MY_STATIC_FOLDER ------ file1 ------ file2 ------ file3 

How can I know the absolute path of MY_STATIC_FOLDER, so that I can read the static files?

I cannot rely on the "current folder" (what I get in a new File(".")) because it depends on where the Tomcat server was started from, which is different in every installation!

like image 418
Erel Segal-Halevi Avatar asked Jul 05 '11 14:07

Erel Segal-Halevi


People also ask

Where are servlets stored?

By default, a servlet application is located at the path <Tomcat-installationdirectory>/webapps/ROOT and the class file would reside in <Tomcat-installationdirectory>/webapps/ROOT/WEB-INF/classes.

Where does Tomcat store servlet files?

They go in Tomcat/webapps folder.

How do I reference the current directory in Java?

In Java, we can use System. getProperty("user. dir") to get the current working directory, the directory from where your program was launched.


1 Answers

You could use ServletContext#getRealPath() to convert a relative web content path to an absolute disk file system path.

String relativeWebPath = "/WEB-INF/static/file1.ext"; String absoluteDiskPath = getServletContext().getRealPath(relativeWebPath); File file = new File(absoluteDiskPath); InputStream input = new FileInputStream(file); // ... 

However, if your sole intent is to get an InputStream out of it, better use ServletContext#getResourceAsStream() instead because getRealPath() may return null whenever the WAR is not expanded into local disk file system but instead into memory and/or a virtual disk:

String relativeWebPath = "/WEB-INF/static/file1.ext"; InputStream input = getServletContext().getResourceAsStream(relativeWebPath); // ... 

This is much more robust than the java.io.File approach. Moreover, using getRealPath() is considered bad practice.

See also:

  • getResourceAsStream() vs FileInputStream
  • What does servletcontext.getRealPath("/") mean and when should I use it
  • Where to place and how to read configuration resource files in servlet based application?
  • Recommended way to save uploaded files in a servlet application
like image 133
BalusC Avatar answered Oct 02 '22 18:10

BalusC