Java 为什么更改jsp时tomcat不需要重新启动

Java 为什么更改jsp时tomcat不需要重新启动,java,jsp,tomcat,servlets,Java,Jsp,Tomcat,Servlets,我已经使用JSP、Servlet很长一段时间了。我知道,每当我们在Servlet中更改任何内容时,我们都需要重新启动Tomcat服务器以获得更改。其中,与JSP更改一样,tomcat不需要重新启动 据我所知,JSP页面仅在编译时才会转换为Servlet。那么,毕竟它是一个Servlet。那么,在没有Tomcat重启的情况下,它是如何工作的呢 我知道JSP页面被编译的情况,比如服务器重启后的首次访问等。因为当Tomcat被要求执行JSP时,is会将JSP文件的修改日期与对应于此JSP的已编译类的修

我已经使用
JSP、Servlet
很长一段时间了。我知道,每当我们在
Servlet
中更改任何内容时,我们都需要重新启动Tomcat服务器以获得更改。其中,与JSP更改一样,tomcat不需要重新启动

据我所知,
JSP
页面仅在编译时才会转换为
Servlet
。那么,毕竟它是一个
Servlet
。那么,在没有
Tomcat
重启的情况下,它是如何工作的呢


我知道JSP页面被编译的情况,比如服务器重启后的首次访问等。

因为当Tomcat被要求执行JSP时,is会将JSP文件的修改日期与对应于此JSP的已编译类的修改时间进行比较,如果是最近的,它会在执行之前动态地重新编译

顺便说一句,这是一个应该在生产中关闭的选项,因为执行此检查需要时间


请参阅以了解详细信息。

因为默认情况下tomcat是在开发模式下启动的,这意味着在检测到更改时重新编译JSP派生的servlet。这是一个很好的问题,JVM如何加载新类——可能tomcat类加载器是配置为这样做的

一些相关说明:

  • 您可以关闭生产的“开发”选项
  • 您还可以重新加载servlet—您必须在中使用JVM启动tomcat

不仅JSP的一些容器还支持在修改servlet类时重新加载它

由容器决定何时加载servlet<代码>可以在运行时按需加载servlet。至于JSP,也可以在运行时加载转换为servlet的JSP

说到你的问题

为什么Tomcat不需要重新启动?

这是因为
Tomcat能够在运行时向Web应用程序类加载器添加/修改类路径。Tomcat将拥有自己的
自定义类加载器实现,允许他们在运行时添加类路径

自定义类加载器如何工作?


一种方法是在修改Servlet/JSP时,
为Servlet/JSP创建一个新的类加载器,并将应用程序类加载器作为父类加载器。新的类加载器将再次加载修改后的类

是的,但是JVM应该会以某种方式加载新类。默认情况下不会。我认为是tomcat的定制类加载器允许它。@:谢谢。。我知道它会将JSP文件的最后修改日期与已编译的类进行比较,以决定是否重新编译。
当检测到更改时
-tomcat如何决定是否有更改?