почему Tomcat не требует перезагрузки при изменении jsp - PullRequest
11 голосов
/ 13 марта 2012

Я уже давно пользуюсь JSP,Servlet.Я знаю, что всякий раз, когда мы что-то меняем в Servlet, нам нужно перезапускать Tomcat Server, чтобы получить изменения.Где, как и в случае изменения JSP, tomcat не требует перезапуска.

Насколько мне известно, JSP страница преобразуется в Servlet только после компиляции.Итак, в конце концов это Servlet. Так, как это работает без Tomcat перезапуска.

Мне известны случаи, когда страница JSP компилируется, как при первом доступе после перезапуска сервера и т. Д.

Ответы [ 3 ]

11 голосов
/ 13 марта 2012

Потому что, когда Tomcat просят выполнить JSP, он сравнивает дату модификации файла JSP со временем модификации скомпилированного класса, соответствующего этому JSP, и, если он более поздний, перекомпилируется на лету перед его выполнением.

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

Подробнее см. http://tomcat.apache.org/tomcat-7.0-doc/jasper-howto.html.

8 голосов
/ 13 марта 2012

Поскольку по умолчанию tomcat запускается в режиме разработки, это означает, что производные от JSP сервлеты перекомпилируются при обнаружении изменения.Это хороший вопрос, как JVM загружает новый класс - возможно, загрузчик классов tomcat настроен для этого.

Несколько замечаний по теме:

  • вы можете отключить опцию разработкидля производства
  • вы также можете перезагрузить сервлеты - вам нужно запустить Tomcat с JVM в режиме отладки .
0 голосов
/ 13 марта 2012

Не только некоторые контейнеры JSP также поддерживают перезагрузку класса сервлета , если он модифицирован.

Это зависит от контейнера, чтобы решить, когда загружать сервлеты. A servlet can be loaded at runtime on demand. И приходя в JSP, JSP translated to servlet can also be loaded at runtime.

Подойдя к вашему вопросу,

Почему Tomcat не требует перезапуска?

Это потому, что Tomcat is capable of adding/modifying classpath to Web Application classloader at runtime. Tomcat будет иметь их custom Classloader implementation which allows them to add the classpaths at runtime.

Как может работать пользовательский загрузчик классов?

Один из способов добиться этого - модифицировать сервлет / JSP, a new classloader is created for the Servlet/JSP with Application classloader as parent classloader . And the new classloader will load the modified class again.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...