为啥在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不需要重启的主要内容,如果未能解决你的问题,请参考以下文章
如何修改类文件和jsp页面后不用重启tomcat就可以自动加载呢