Class.getResourceAsStream的解释以及如何在Tomcat中为简单的Java Web应用程序设置它?

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

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

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"); 

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

以编程方式访问JSF应用程序中的属性文件 BalusC说:

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

我有两个问题:

1)为什么classpath根目录是WEB-INF \ classes文件夹? 它在哪里确定? (据我所知,应该是因为我说的代码工作正常。)

根据这个: http : //docs.oracle.com/javase/tutorial/essential/environment/paths.html ,我没有在我的本地机器中设置类路径。 所以也许当我启动tomcat时,它会设置类路径? 但是部署了很少的Web应用程序,是否有很少的类路径?

2)有没有更好的方法来完成这项工作而不是: PdfTwoServlet.class.getResourceAsStream ? 像getClassPath()。getResourceAsStrem?

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

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

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

默认情况下,如果未在此处找到搜索的资源,则将在tomcat / lib目录中搜索它。 如果在那里找不到它,它将询问父类加载器,依此类推,可以在这里找到解释

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

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