为啥在jsp更改时tomcat不需要重启

Posted

技术标签:

【中文标题】为啥在jsp更改时tomcat不需要重启【英文标题】:why tomcat does not require restart when jsp is changed为什么在jsp更改时tomcat不需要重启 【发布时间】:2012-03-29 17:09:31 【问题描述】:

我使用JSP,Servlet 已经有一段时间了。我知道每当我们更改 Servlet 中的任何内容时,我们都需要重新启动 Tomcat 服务器以获取更改。而在 JSP 更改的情况下,tomcat 不需要重新启动。

据我所知,JSP 页面仅在编译时才会转换为 Servlet。所以,毕竟它是一个Servlet。所以,如果没有Tomcat 重新启动,它是如何工作的。

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

【问题讨论】:

【参考方案1】:

不仅仅是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

【讨论】:

【参考方案2】:

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

一些相关说明:

您可以关闭生产环境的开发选项 您也可以重新加载 servlet - 您必须使用debug mode 中的 JVM 启动 tomcat。

【讨论】:

when a change is detected - tomcat 如何确定有变化?【参考方案3】:

因为当Tomcat被要求执行一个JSP时,它会将JSP文件的修改日期与该JSP对应的编译类的修改时间进行比较,如果较新,它会在执行之前即时重新编译。

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

详情请见http://tomcat.apache.org/tomcat-7.0-doc/jasper-howto.html

【讨论】:

是的,但是 JVM 应该有某种方式加载新类。默认情况下它不会。我认为是 tomcat 的自定义类加载器允许它。 @:JB 谢谢.. 我知道它会比较 JSP 文件的最后修改日期和已编译的类来决定是否重新编译。

以上是关于为啥在jsp更改时tomcat不需要重启的主要内容,如果未能解决你的问题,请参考以下文章

为啥在eclipse中修改JSP后tomcat自动重启?

如何修改类文件和jsp页面后不用重启tomcat就可以自动加载呢

为啥在我登录之前创建了一个新会话?

为啥我写的jsp页面当修改后浏览时页面显示没有变化?还是使用原来旧的文件呢?

修改源代码时不需要重启tomcat服务器

替换class文件需要重启tomcat吗