2012-03-13 76 views
11

我一直在使用JSP,Servlet已经有一段时间了。我知道,只要我们在Servlet中更改了任何内容,我们就需要重新启动Tomcat服务器以获取更改。在JSP更改的情况下,tomcat不需要重新启动。为什么tomcat在jsp变更时不需要重启

根据我的知识JSP只有在编译时才将页面转换为Servlet。因此,毕竟它的一个Servlet。所以,它是如何工作,而不需要Tomcat重新启动。

我的案件时认识一个JSP页面被服务器重新启动后第一次访问编译像等

回答

8

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

一些相关的注意事项:

  • 您可以关闭生产
  • 你可以有servlet的重新加载以及
  • 发展选项 - 你必须在debug mode一个JVM启动tomcat。
+0

'当检测到变化时' - tomcat如何决定有变化? – 2016-09-13 08:36:01

11

因为当Tomcat要求执行JSP,是比较与JSP文件的修改日期与此JSP相对应的已编译类的修改时间,如果更新,则会在执行它之前即时重新编译。

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

查看http://tomcat.apache.org/tomcat-7.0-doc/jasper-howto.html了解详情。

+0

是的,但应该有一些JVM加载新类的方法。默认情况下它没有。我认为这是允许它的tomcat的自定义类加载器。 – Bozho 2012-03-13 09:57:48

+0

@:JB谢谢..我知道它比较了JSP文件的最后修改日期和编译后的类,以决定是否重新编译。 – 2012-03-13 11:41:14

0

不只是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。雄猫将拥有他们的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

相关问题