Welcome to the JavaRanch, Jan!
Tomcat is not a file server. It does not serve up files or directories and URLs are not file/directory paths, despite having a similar syntax and sometimes a similar behavior. So expecting file-like behavior from URLs is a dangerous thing to do.
Tomcat, like all
J2EE and JEE servers deploys WARs, which are packaged webapps. In Tomcat, a WAR can either be a single archive (.war file) or an unzipped archive ("exploded" WAR).
When a web application is deployed in Tomcat, it is assigned a context path and any incoming URL that matches that path is routed to that web application. If you take a WAR file and simply copy it into the TOMCAT_HOME/webapps/ directory, Tomcat automatically deploys that webapp using default rules, which include exploding the WAR, if it's a war file and constructing/mapping a context path whose name matches the name of the WAR. And, incidentally, if you replace a WAR file with a newer WAR file, Tomcat will ignore the newer file and continue to use the exploded old WAR.
There is one exception to the WAR-name equals directory name rule and that is the root context ("/"). Because "/" refers, in Unix/Linux terms to the root of the filesystem tree, it's not a valid directory name, so Tomcat maps context path "/" to the WAR in the TOMCAT_HOME/ROOT directory.
Therefore the context path for any URL dispatched to the ROOT war properly has the context path "/". How you were ever getting "/app" I do not know, but the proper way to get a JSP's context path is via request.getContextPath().