如何在Java EE中获取当前Web应用程序的名称?

8

如何在Java EE中获取当前Web应用程序的名称?

我对独立的Java编程非常熟悉,但是对于Java EE来说比较陌生。我正在编写一些自定义代码,以插入到第三方Java EE报告包中。我在同一Tomcat服务器上部署了多个实例,例如:

C:\
+-- tomcat6
    +-- webapps
        +-- app1
        +-- app2

因此,当用户访问例如http://example.com/app1/viewReport时,我想能够获取"app1"。(最好不要通过解析URL获得)

另外,如果有一种方法可以获取app1的根目录(在这个例子中,是C:\tomcat6\webapps\app1),那就更好了。

2个回答

12
  1. 获取“名称” ===== 它被称为上下文路径。如果您的代码在Web应用程序请求上下文中运行,可以通过调用HttpServletRequest#getContextPath()来获取它。

  2. 访问物理/真实资源 ===== 如果您正在尝试访问Web应用程序中文件/资源的内容,则最好使用以下之一:

还可以使用ServletContext#getRealPath(String)获取相对于Web应用程序的路径的文件/资源在磁盘上的物理路径,但这不是可靠的(例如,如果您将Web应用程序部署为WAR,则不总是有效)。

  1. 访问类路径资源 ===== 根据您的评论,您正在尝试访问/WEB-INF/classes目录中的资源。因为WEB-INF/classes/*是Web应用程序特定类的位置,所以您可以像在Java SE应用程序中访问任何类路径资源一样访问它。同样,假设您的代码在Web应用程序的上下文中运行,您可以简单地使用以下内容:

在您的情况下,您可能想要使用后者,然后通过Properties#load(InputStream)加载属性文件。

大致如下:

Properties props = new Properties();
props.load(getClass().getResourceAsStream("/reportCustom.properties"));

感谢您的帮助。我正在尝试加载webapps/myapp/WEB-INF/classes/reportCustom.properties中的属性文件。有更简单的方法吗?过去,我使用了一个硬编码字符串System.getProperty("myapp.root"),它是来自web.xml的属性,提供了根路径。但后来我发现我们需要在同一Tomcat上支持多个实例,所以我不知道"myapp"将被称为什么。 - Jenni
在您的情况下,您可以像简单地在类路径中访问reportCustom.properties一样进行访问。我会很快更新我的答案以包括这一点。 - Jack Leow

2
我正在尝试加载位于 webapps/myapp/WEB-INF/classes/reportCustom.properties 的属性文件。由于该文件位于 classes 目录下,因此您可以使用 ClassLoader(在 Java 中通常用于从类路径加载文件的机制)来加载它。最好使用 context ClassLoader。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接