0

这些天我正在关注headfirst JSP and Servlets book,它说ServletConfig对象在servlet的生命周期中只创建一次,然后再传递给servlet的init方法。

我正在测试书中给出的一些示例,以使用 HttpServletResponse 的 out.println 方法打印出我的 webapp 的 DD 中定义的 init-params 和 context-params。

我看到的是,如果我在 DD 中进行任何更改(添加或更改参数名称、值)并在我的 chrome 浏览器中重新加载指向 webapp 中的特定 servlet 的 URL,它将使用新添加的参数进行更新。这不应该是这样。我没有重新部署 servlet(通过再次停止并重新运行 tomcat 服务),这将导致重新创建 ServletConfig 对象。这里发生了什么?

我在 Windows 8 上的 tomcat9 上运行它,而这本书指的是 tomcat5。自从动态更新 ServletConfig 和 Context init 参数后是否发生了变化?我在互联网上看不到任何表明这一点的东西。

4

2 回答 2

1

Look at the Tomcat logs and you 'll see the app being re-deployed.

By default changes to web.xml will trigger an application redeployment. The check for modifications happens every 10-15 seconds (I forget exactly how often).

于 2019-07-03T16:42:30.923 回答
0

这是默认行为,当 /WEB-INF/web.xml 文件更新时,tomcat 会自动重新部署应用程序。

根据 http://tomcat.apache.org/tomcat-9.0-doc/deployer-howto.html#Deploying_on_a_running_Tomcat_server上的文档:

“如果 Host autoDeploy 属性为“true”,Host 将尝试根据需要动态部署和更新 Web 应用程序,例如,如果将新的 .WAR 拖放到 appBase 中。为此,Host 需要有后台处理已启用,这是默认配置。

autoDeploy 设置为“true”并且正在运行的 Tomcat 允许:

如果 /WEB-INF/web.xml 文件(或定义为 WatchedResource 的任何其他资源)更新,则重新加载 Web 应用程序。"

要绕过默认行为,请将autoDeploy设置为 false 并重新启动 tomcat。您可以更新 server.xml 以将 autoDeploy 设置为 false 值。该文件位于 $CATALINA_BASE/conf。标签名称是主机,如下所示

    <Host name="localhost"  appBase="webapps"
        unpackWARs="true" autoDeploy="true">

我只能更新“server.xml”文件,尽管文档说:在早期版本的 Tomcat 中,上下文描述符配置的内容通常存储在 Tomcat 的主配置文件 server.xml 中,但现在不鼓励这样做(尽管它目前仍然作品)。

因此,在回答您的查询时,根据 tomcat 5.xx 和 tomcat 9.xx 的文档,将autoDeploy设置为 true 或 false 没有任何变化,我也在运行 tomcat 9.xx,因为我验证了这个默认行为通过将 autoDeploy 设置为 false 。

于 2021-02-15T18:12:25.637 回答