我有一个非常简单的 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");
工作正常,找到了classes文件夹下的文件two.pdf,但我不知道这是如何工作的。
Accessing properties file in a JSF application programmatically BalusC 在这里说:
The Class#getResourceAsStream() can take a path which is relative to the location of the Class which you're using there as starting point. If you use /foo/filename.properties, then it will actually load foo/filename.properties from the classpath root.
我有两个问题:
1) 为什么类路径根目录是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中的所有jar/lib。
默认情况下,如果此处没有找到搜索的资源,则会在 tomcat/lib 目录中搜索。如果那里没有找到,就会询问父类加载器,依此类推,解释可以参见 here
如果部署了多个 Web 应用程序,则每个 WAR 都会有自己的类加载器,指向它自己的 WEB-INF/classes 和 WEB-INF/lib jar。
对于 2),没有像 getClasspath() 这样的方法,ServletContext.getResourceAsStream() 是 servlet 应用程序中从 WAR 内部获取资源的建议方法。 WAR 可能会被压缩或分解,这对两者都适用,请参阅 this answer 。
关于java - Class.getResourceAsStream 的说明以及如何在 Tomcat 中为简单的 Java Web 应用程序设置它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19505646/