问题
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!
回答1:
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 as getRealPath()
may return null
whenever the WAR is not expanded on local disk file system (Tomcat by default does, but is configureable to not do so!):
String relativeWebPath = "/WEB-INF/static/file1.ext";
InputStream input = getServletContext().getResourceAsStream(relativeWebPath);
// ...
This is after all much more robust than the java.io.File
approach.
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
回答2:
You can try this
String relativeWebPath = "WEB-INF/static/file1.ext";
InputStream input = getServletContext().getResourceAsStream(relativeWebPath);
回答3:
I would prefer to use the getResourceaAsStream option to load the resource based on the parent directory.
getClass().getClassLoader().getResourceAsStream("/MY_STATIC_FOLDER/file1");
来源:https://stackoverflow.com/questions/6584054/how-to-find-the-working-folder-of-a-servlet-based-application-in-order-to-load-r