java - JSP 的类加载过程是怎样的?

标签 java jsp classloader

我在 Eclipse 中有一个动态 Web 项目。我的 WEB-INF 中有一个文件 a.xml ,该文件位于类路径中。我的项目中有一个名为 Test 的类。

我在 JSP scriptlet 中有以下代码 -

<%@page import="com.kshitiz.Test"%>
<%
System.out.println(ClassLoader.getSystemClassLoader().getSystemResource("a.xml"));
System.out.println(this.getClass().getClassLoader().getSystemResource("a.xml"));
System.out.println(Test.class.getClassLoader().getResource("a.xml"));
%>

输出是 -

null
null
C:/Users/kshitiz/eclipse/.metadata/.plugins/org.eclipse.wst.server.core/tmp1/wtpwebapps/test-project/WEB-INF/classes/a.xml

显然系统类加载器和 JSP 类加载器无法找到我的文件。

你能解释一下输出结果吗? tomcat是否使用不同的类加载器来加载JSP?为什么这样?为什么系统类加载器无法找到我的文件?

我已经知道我可以使用以下方法来访问我的文件 -

getServletContext().getResourceAsStream("/WEB-INF/a.xml");

我有兴趣了解上述场景,而不是加载该文件的各种方法。

最佳答案

每个部署的 Web 应用程序都有自己的类加载器。这使得在同一个容器上部署两个不同的 Web 应用程序并取消部署它们成为可能,即使它们使用同一库的冲突版本也是如此。

web应用程序的类加载器是tomcat类加载器的子加载器,其类路径包含web应用程序的WEB-INF/classes目录,以及WEB-INF/lib<中的每个jar文件。我不知道你如何设置类路径,但是你不应该在 eclipse 中设置任何类路径,并且 WEB-INF 目录本身绝对不应该在类路径中。

第一行和第二行基本上是等效的,因为它们都使用 getSstemResource,而 getSstemResource 使用系统类加载器。他们找不到您的文件是正常的,因为 Web 应用程序的类路径不在系统类路径中。

如果文件位于 Web 应用程序的类路径中,即在 WEB-INF/classes 下或在 WEB-INF/lib 下的 jar 中,则第三行应该找到该文件。

关于java - JSP 的类加载过程是怎样的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13250807/

相关文章:

java - HTML5 本地存储离线缓存在 Google AppEngine 应用程序中不起作用

java - 字符串连接未按预期工作

java - 如何使用 Struts2 将隐藏值发送到操作类

java - 如何从android中的字节数组加载类?

java - Tomcat 6 中的每个 webapp 是否独立加载核心类?

java - karaf- assembly 4.0.5 - 成功的 Maven 构建结束时不会生成 zip ard tar.gz 文件

java - 在 Java 中重新解析 JSON 对象?

java - 从使用 EL 设置的 html 表单获取 servlet 中的请求参数

java - 我想从数据库中检索图像并将其显示在jsp页面中

java - 如何在 Java 中加载修改后的父类(super class)?