На сервере Tomcat 5.5 я помещаю класс в системный путь к классам (и изменяю catalina.bat, чтобы выбрать его), или если я помещаю класс в общий каталог lib. Теперь, если у меня есть два разных приложения, использующих один и тот же класс, которые не имеют этого класса в своих каталогах lib / classes WEB-INF, они используют один и тот же экземпляр класса. Я понимаю концепцию, согласно которой загрузчик классов делегирует своему родительскому загрузчику классов для поиска класса, если он не может его найти, поэтому в этом случае, поскольку класс отсутствует в WEB-INF / classes или WEB-INF / lib, Загрузчик классов WebAppX попытается использовать совместно используемый, общий и системный загрузчик классов соответственно.
Однако мне почему-то кажется странным, что два разных приложения могут совместно использовать контекст, используя этот метод. Может ли кто-нибудь помочь мне понять, почему это так. например в приведенном ниже коде каждый из двух сервлетов развернут в отдельных войнах, когда 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");
}
}