我已经使用JSP,Servlet
很长时间了。我知道,每当我们在Servlet
中更改任何内容时,都需要重新启动TomcatServer来获得更改。在JSP更改的情况下,tomcat不需要重新启动。
据我所知,JSP
页面只有在编译时才能转换为Servlet
。那么,毕竟是Servlet
。那么,如果不重新启动Tomcat
,它是如何工作的呢。
我知道JSP页面被编译的情况,比如服务器重启后的第一次访问等。
因为当Tomcat被要求执行JSP时,is会将JSP文件的修改日期与该JSP对应的已编译类的修改时间进行比较,如果是最近的,则会在执行之前动态重新编译。
这是BTW一个在生产中应该关闭的选项,因为执行此检查需要时间。
请参阅http://tomcat.apache.org/tomcat-7.0-doc/jasper-howto.html详细信息。
因为默认情况下tomcat是在开发模式下启动的,这意味着在检测到更改时会重新编译JSP派生的servlet。JVM是如何加载新类的,这是一个很好的问题——可能是tomcat类加载器被配置为这样做的
几个相关的注意事项:
- 您可以关闭生产的开发选项
- 您也可以重新加载servlet——您必须在调试模式下用JVM启动tomcat
不仅JSP的一些容器还支持servlet类的重新加载(如果修改的话)。
由容器决定何时加载servlet。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
。
自定义类加载器是如何工作的
实现这一点的一种方法是修改Servlet/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
。