Как JVM однозначно идентифицирует JSP с одинаковыми именами в разных папках в разных приложениях - PullRequest
0 голосов
/ 17 сентября 2011

Как JVM однозначно идентифицирует JSP с одинаковыми именами в разных папках в разных приложениях?

Чтобы быть более понятным, скажем, два приложения (войны) развернуты на серверах A1 и A2. Теперь у A1 есть Random.jsp в папках F11 и F12 (2 jsp с одинаковыми именами, но с другим кодом), так же у A2 есть Random.jsp в F21 и F22.

Когда код развернут и jsp переведены в сервлеты, я считаю, что имя сервлета будет одинаковым для всех 4 JSP. Так как же JVM идентифицирует их однозначно для соответствующих запросов?

Если бы это было ограничено одним приложением, я бы предположил, что JVM будет использовать имена папок в качестве пакетов во время трансляции сервлета, но работает ли это между приложениями.

Также, пожалуйста, проследите, заботится ли JVM об этом различии, объявляя разные пакеты для сгенерированного сервлета или используя некоторые внутренние структуры сопоставления разных классов (этот второй вариант звучит довольно странно)

Ответы [ 2 ]

1 голос
/ 17 сентября 2011

Проблема, о которой вы говорите, не ограничивается файлами JSP (которые переводятся в классы).Работа веб-контейнера заключается в обеспечении того, чтобы различные веб-приложения внутри контейнера не мешали друг другу.И каждое приложение МОЖЕТ иметь файлы классов с одинаковым пакетом и одинаковым именем.Лучший пример: у каждого Webapp есть некоторая общая библиотека, такая как log4j, но с разными версиями.

Решение состоит в том, чтобы использовать Java ClassLoader очень креативным способом.Класс известен только загрузчику классов, который его загрузил, и всем дочерним загрузчикам классов (загрузчик классов образует древовидную иерархию).По сути, веб-контейнер открывает новый загрузчик классов для каждого веб-приложения, каждый загрузчик классов может загружать один и тот же класс - Bingo.

Примечание. Если все сделано правильно, это работает довольно хорошо.Но если экземпляры этих классов «просачиваются» в другое приложение, происходят странные вещи ... В этом случае не редкость сообщение типа

ClassCastException....instance of class xyz.Foo is not an instance of class xyz.Foo

.В первый раз вы увидите, что поцарапаете голову.

1 голос
/ 17 сентября 2011

Это зависит от реализации. TOMCAT делает это, используя каталог work с отдельными папками для A1.war и A2.war . Таким образом, несмотря на то, что «Random.jsp» генерирует одно и то же имя сервлета для обоих WAR, они размещаются в разных папках, поэтому путаницы не возникает.

Пример:

/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
...