Почему 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
.