Почему tomcat не требует перезапуска при изменении jsp

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

Согласно моей информации JSP страница преобразуется в Servlet только при компиляции. Итак, после всего этого a Servlet. Итак, как это работает без перезагрузки Tomcat.

Я знаю случаи, когда страница JSP скомпилирована, как при первом доступе после перезагрузки сервера и т.д.

Ответ 1

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

Несколько связанных заметок:

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

Ответ 2

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

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

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

Ответ 3

Не только 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.