JVM如何唯一地标识JSP';在不同应用程序的不同文件夹中使用相同名称的

JVM如何唯一地标识JSP';在不同应用程序的不同文件夹中使用相同名称的,jsp,servlets,jvm,classloader,Jsp,Servlets,Jvm,Classloader,JVM如何在不同的应用程序中唯一地识别不同文件夹中具有相同名称的JSP 更清楚地说,服务器A1和A2上部署了两个应用程序(war)。现在A1在文件夹F11和F12中有Random.jsp(两个jsp名称相同但代码不同),同样A2在F21和F22中有Random.jsp 在部署代码并将jsp转换为Servlet时,我相信所有4个jsp的Servlet名称都是相同的。那么JVM如何为各自的请求唯一地标识它们呢 如果它仅限于一个应用程序,我会假设JVM在servlet转换期间将文件夹名称用作包,但它是

JVM如何在不同的应用程序中唯一地识别不同文件夹中具有相同名称的JSP

更清楚地说,服务器A1和A2上部署了两个应用程序(war)。现在A1在文件夹F11和F12中有Random.jsp(两个jsp名称相同但代码不同),同样A2在F21和F22中有Random.jsp

在部署代码并将jsp转换为Servlet时,我相信所有4个jsp的Servlet名称都是相同的。那么JVM如何为各自的请求唯一地标识它们呢

如果它仅限于一个应用程序,我会假设JVM在servlet转换期间将文件夹名称用作包,但它是否可以跨应用程序工作


另外,请说明JVM是否通过为生成的servlet声明不同的包或使用不同类的一些内部映射结构(第二个选项听起来很奇怪)

来处理这一区别,这取决于实现。TOMCAT的做法是使用一个work目录,为A1.warA2.war使用单独的文件夹。这样,尽管“Random.jsp”为两个WAR生成了相同的servlet名称,但它们被放在不同的文件夹中,因此不存在可能的混淆

例如:

/usr/java/tomcat/work/Catalina/localhost/A1/org/apache/jsp/Random_jsp.java
/usr/java/tomcat/work/Catalina/localhost/A2/org/apache/jsp/Random_jsp.java

您提到的问题不仅限于JSP文件(这些文件被转换成类)。Webcontainer的工作是确保容器中的不同WebApplication不会相互干扰。每个应用程序都可以有具有相同包和相同名称的类文件。最好的例子:每个Webapp都有一些公共库,比如log4j,但版本不同

解决方案是以一种非常有创意的方式使用Java的
ClassLoader
。一个类只有加载它的类加载器和所有子类加载器知道(类加载器形成树状层次结构)。webcontainer基本上为每个WebApp打开一个新的类加载器,每个类加载器都可以加载相同的类—Bingo

注意:只要每件事都做得很好,它就可以很好地工作。但如果这些类的实例“泄漏”到其他应用程序中,就会发生奇怪的事情。。。像这样的消息

ClassCastException....instance of class xyz.Foo is not an instance of class xyz.Foo
这种情况并不少见。当你第一次看到你会抓伤你的头