JVM如何在不同应用程序的不同文件夹中唯一标识具有相同名称的JSP?
更清楚地说服务器A1和A2上部署了两个应用程序(war)。现在A1在文件夹F11和F12(具有相同名称但代码不同的2个jsp)中具有Random.jsp,类似地,A2在F21和F22中具有Random.jsp。
当部署代码并将jsp转换为Servlet时,我相信所有4个JSP的Servlet名称都是相同的。那么JVM如何为各自的请求唯一地识别它们呢?
如果仅限于单个应用程序,我会假设JVM在servlet转换期间将文件夹名称用作包,但是它可以跨应用程序工作。
另外请指教,JVM是否通过为生成的servlet声明不同的包或使用不同类的一些内部映射结构来处理这种区别(第二个选项听起来很奇怪)
答案 0 :(得分:1)
这是依赖于实现的。 TOMCAT的方式是使用工作目录,其中包含 A1.war 和 A2.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
答案 1 :(得分:1)
您提到的问题不仅限于JSP文件(可以转换为类)。 Web容器的工作是确保容器内的不同Web应用程序不会干扰。并且每个应用程序都可以使用具有相同包和相同名称的类文件。最好的例子:每个Webapp都有一些常见的库,比如log4j,但版本不同。
解决方案是以非常有创意的方式使用Java的ClassLoader
。只有类加载器才能知道一个类,它加载到所有子类加载器(类加载器形成树状层次结构)。 webcontainer基本上为每个WebApp打开一个新的类加载器,每个类加载器可以加载相同的类 - 宾果。
注意:只要一切都做得恰到好处,这个效果都很好。但是如果这些类的实例“泄漏”到另一个应用程序中,就会发生奇怪的事情...像
这样的消息ClassCastException....instance of class xyz.Foo is not an instance of class xyz.Foo
在这种情况下,并不罕见。你第一次看到你会挠头。