Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What does servletcontext.getRealPath("/") mean and when should I use it

In the following snippet:

ServletContext context = request.getServletContext(); String path = context.getRealPath("/"); 

What does / in the method getRealPath() represent? When should I use it?

like image 529
saplingPro Avatar asked Aug 28 '12 13:08

saplingPro


People also ask

What is the use of ServletContext?

Interface ServletContext. Defines a set of methods that a servlet uses to communicate with its servlet container, for example, to get the MIME type of a file, dispatch requests, or write to a log file. There is one context per "web application" per Java Virtual Machine.

Which is the correct way to get ServletContext object?

How to get the object of ServletContext interface. getServletContext() method of ServletConfig interface returns the object of ServletContext. getServletContext() method of GenericServlet class returns the object of ServletContext.


1 Answers

Introduction

The ServletContext#getRealPath() is intented to convert a web content path (the path in the expanded WAR folder structure on the server's disk file system) to an absolute disk file system path.

The "/" represents the web content root. I.e. it represents the web folder as in the below project structure:

YourWebProject  |-- src  |    :  |  |-- web  |    |-- META-INF  |    |    `-- MANIFEST.MF  |    |-- WEB-INF  |    |    `-- web.xml  |    |-- index.jsp  |    `-- login.jsp  :     

So, passing the "/" to getRealPath() would return you the absolute disk file system path of the /web folder of the expanded WAR file of the project. Something like /path/to/server/work/folder/some.war/ which you should be able to further use in File or FileInputStream.

Note that most starters don't seem to see/realize that you can actually pass the whole web content path to it and that they often use

String absolutePathToIndexJSP = servletContext.getRealPath("/") + "index.jsp"; // Wrong! 

or even

String absolutePathToIndexJSP = servletContext.getRealPath("") + "index.jsp"; // Wronger! 

instead of

String absolutePathToIndexJSP = servletContext.getRealPath("/index.jsp"); // Right! 

Don't ever write files in there

Also note that even though you can write new files into it using FileOutputStream, all changes (e.g. new files or edited files) will get lost whenever the WAR is redeployed; with the simple reason that all those changes are not contained in the original WAR file. So all starters who are attempting to save uploaded files in there are doing it wrong.

Moreover, getRealPath() will always return null or a completely unexpected path when the server isn't configured to expand the WAR file into the disk file system, but instead into e.g. memory as a virtual file system.

getRealPath() is unportable; you'd better never use it

Use getRealPath() carefully. There are actually no sensible real world use cases for it. Based on my 20 years of Java EE experience, there has always been another way which is much better and more portable than getRealPath().

If all you actually need is to get an InputStream of the web resource, better use ServletContext#getResourceAsStream() instead, this will work regardless of the way how the WAR is expanded. So, if you for example want an InputStream of index.jsp, then do not do:

InputStream input = new FileInputStream(servletContext.getRealPath("/index.jsp")); // Wrong! 

But instead do:

InputStream input = servletContext.getResourceAsStream("/index.jsp"); // Right! 

Or if you intend to obtain a list of all available web resource paths, use ServletContext#getResourcePaths() instead.

Set<String> resourcePaths = servletContext.getResourcePaths("/"); 

You can obtain an individual resource as URL via ServletContext#getResource(). This will return null when the resource does not exist.

URL resource = servletContext.getResource(path); 

Or if you intend to save an uploaded file, or create a temporary file, then see the below "See also" links.

See also:

  • getResourceAsStream() vs FileInputStream
  • Recommended way to save uploaded files in a servlet application
  • Simple ways to keep data on redeployment of Java EE 7 web application
like image 131
BalusC Avatar answered Sep 28 '22 03:09

BalusC