在Tomcat 5.5服务器上,我在系统类路径中放了一个类(并修改catalina.bat来选择它),或者如果我将类放在共享的lib目录中。现在,如果我有两个不同的应用程序使用相同的类,它们的WEB-INF lib / classes目录中没有该类,则它们使用该类的相同实例。我理解一个类加载器将委托给它的父类加载器的概念,如果它找不到它,那么在这种情况下,由于该类不存在于WEB-INF / classes或WEB-INF / lib中WebAppX类加载器将分别尝试共享,通用和系统类加载器。
然而,这对我来说似乎很奇怪,两个不同的应用程序可以使用此方法共享上下文。有人能帮助我理解为什么会这样。例如在下面的代码中,两个servlet分别部署在单独的战争中,同时共享CommonCounter,并且它们可以读取由另一个增加的计数器值。
编辑 对我来说,两个独立的应用程序可以以这种方式共享上下文。实际上,如果它们具有相同的类实例,它们甚至可以跨两个不同的应用程序实现多线程/同步,这看起来非常违反直觉。
package com.test;
public class CommonCounter {
public static int servlet1;
public static int servlet2;
}
public class Servlet1 extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
CommonCounter.servlet1++;
System.out.println("Other one had "+CommonCounter.servlet2+" hits");
}
}
public class Servlet2 extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
CommonCounter.servlet2++;
System.out.println("Other one had "+CommonCounter.servlet1+" hits");
}
}