【问题标题】:Explanation of Class.getResourceAsStream and how it is set in Tomcat for a simple Java web - app?Class.getResourceAsStream 的解释以及它是如何在 Tomcat 中为一个简单的 Java web 应用程序设置的?
【发布时间】:2013-10-30 14:26:42
【问题描述】:

我有一个部署到 Tomcat 的非常简单的 java web 应用程序。

在这个应用程序中,我有一些代码如下:

package com.mywebapp.hello;

import javax.servlet.http.*;
import java.io.*;

public class PdfTwoServlet extends HttpServlet {

    public void doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws IOException {

        httpServletResponse.setContentType("application/pdf");
        InputStream is = PdfTwoServlet.class.getResourceAsStream("/two.pdf");

当我编译我的代码并将其部署到 tomcat 时,目录结构是这样的:

这在 C:\Tomcat\webapps\myApplication 下:

所以

PdfTwoServlet.class.getResourceAsStream("/two.pdf");

工作正常,找到了 classes 文件夹下的文件 two.pdf,但我不知道它是如何工作的。

Accessing properties file in a JSF application programmatically 这里 BalusC 说:

Class#getResourceAsStream() 可以采用相对于 您在那里使用的类的位置作为起点。 如果你使用 /foo/filename.properties,那么它实际上会加载 类路径根目录中的 foo/filename.properties。

我有两个问题:

1) 为什么classpath root 是WEB-INF\classes 文件夹?是在哪里确定的? (据我了解,应该是因为我说的代码运行良好。)

据此:http://docs.oracle.com/javase/tutorial/essential/environment/paths.html,我的本地机器中没有设置类路径。所以也许当我启动tomcat时,它会设置类路径?但是部署的网络应用很少,类路径很少吗?

2) 有没有更好的方法来代替:PdfTwoServlet.class.getResourceAsStream? getClassPath().getResourceAsStrem 之类的东西?

编辑:也许更有经验和英语更好的人可以编辑这个问题的标题。我不确定它是否足够好。

【问题讨论】:

  • 这对 Tomcat 没有任何解释,对我的第二个问题也没有任何解释。 @JimGarrison 你确定你读过这个问题还是在巡逻?
  • BalusC(和往常一样)在这里有一些非常好的解释:stackoverflow.com/questions/6341784/…
  • 这只是关于 web 应用如何工作的 Java Servlet 规范。
  • 为什么 PdfTwoServlet 中的 getServletContext() 位于“classes”文件夹上方的两个文件夹中?如果我使用 getServletContext 我需要说 getResourceAsStream("/WEB-INF/classes/two.pdf") @BoristheSpider ?

标签: java tomcat classpath


【解决方案1】:

对于 1) 根据规范,servlet 应用程序中的类路径根是 jar 的 WEB-INF\classes 文件夹,加上该 WAR 的 WEB-INF/lib 中所有 jar 的根。这些位置中的任何内容都将被视为类路径的根。

关于 tomcat 中的类路径如何工作的问题,当 tomcat 部署时,它按以下方式设置类路径:每个 WAR 对应一个单独的类加载器,该类加载器可以访问 WEB-INF/classes 和 WEB-INF 中的所有 jar /库。

如果这里没有找到搜索到的资源,默认会在tomcat/lib目录下搜索。如果那里没有找到,就会询问父类加载器,以此类推,可以找到解释here

如果部署了多个 Web 应用,每个 WAR 都会有自己的类加载器,指向它自己的 WEB-INF/classes 和 WEB-INF/lib jar。

对于 2) 没有像 getClasspath() 这样的方法,ServletContext.getResourceAsStream() 是 servlet 应用程序从 WAR 内部获取资源的建议方法。 WAR 可能会被压缩或分解,这对两者都有效,请参阅this answer

【讨论】:

  • 感谢您的回答,但 ServletContext.getResourceAsStream 返回应用程序的目录。我的意思是我需要使用 ("web-inf/classes/two.pdf") 但是你说类路径是 web-inf\classes 和 web-inf\lib 文件夹所以我现在有点困惑。
猜你喜欢
  • 2011-02-09
  • 2010-11-22
  • 1970-01-01
  • 1970-01-01
  • 2015-06-12
  • 2015-05-23
  • 1970-01-01
  • 2012-06-30
  • 2013-01-25
相关资源
最近更新 更多