【问题标题】: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 页面在服务器重启后首次访问等情况下被编译的情况。

【问题讨论】:

    标签: java jsp tomcat servlets


    【解决方案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 文件的最后修改日期和已编译的类来决定是否重新编译。
      猜你喜欢
      • 2016-10-09
      • 1970-01-01
      • 1970-01-01
      • 2020-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-13
      相关资源
      最近更新 更多