2010-01-13 104 views
3

我写了几个servlet程序,但我不认为我完全理解servlet如何运行。所以这里是夫妻问题,我有:servlet如何工作?

我写的关于Servlet的所有代码只能在Netbeans上运行,后面运行apache tomcat。当我运行向servlet发出请求的html文件时,它通常会提示错误,指出找不到该servlet,于是我不得不重新部署该servlet,然后一切运行良好。看起来像一段时间后我的servlet超时。

servlet是否一直运行? Servlet有init()和destroy(),所以我猜它不会一直运行。那么它什么时候开始,什么时候结束?它是在客户发出请求时开始,并在超时时结束?我如何解决我的问题,我必须不断重新部署servlet。非常感谢你。

回答

4

在正常情况下,一个servlet只在关闭时(即应用程序容器,如Tomcat关闭时)销毁。否则,它在应用程序的持续时间内保留在内存中。我无法说明Netbeans设置发生了什么,但尝试将WAR文件部署到独立的Tomcat安装中,并查看问题是否消失。

应用程序容器在servlet上调用destroy的另一次是内存耗尽,但这种情况远不常见。

关于您关于请求的问题,servlet旨在处理许多请求。据说servlet是应用程序范围的,而请求有其自己的范围。

+0

当你说要将WAR文件部署到独立的Tomcat时,它只是指Apache Tomcat文件夹中的webapps文件夹中的WAR文件。我对么?您是否需要做其他事情才能真正部署它,否则Tomcat会自动为您部署WAR文件 – 2010-01-14 17:55:08

+1

不,Tomcat会自动扩展WAR文件。当你在'webapps'下看到一个与WAR文件同名的目录时(例如,如果你部署了'myapp.war',你会看到一个目录'$ CATALINA_HOME/webapps/myapp/)。根据您使用的Tomcat版本,您可能需要重新启动Tomcat,否则可能会自动发生。 – danben 2010-01-14 18:24:11

0

你需要研究的servlet的生命周期 - 这就是在init()和destroy方法有用于

正常的init()被调用一次,当的serlvet首次调用(除非你不喜欢的东西集它在Tomcat中自动运行)

和destroy()被调用时,容器关闭

的doPost()或的doGet()(如果它是一个HTTP servlet的)被称为用于每个请求

1

一个servlet“只有在被调用时才运行“。服务器将等待来自客户端的连接,读取头文件,根据web.xml中的映射找到适当的servlet,然后调用该servlet的service()方法。 servlet对象将保留在内存中,直到容器决定处置它(它可能在任何时候它不处理请求)。如果服务器决定丢弃一个特定的servlet实例,它会在下一次请求进入servlet时创建一个新实例。

这意味着你不应该得到一个错误,说服务器找不到你的servlet。假设应用程序已经部署,并且有正确的servlet映射,容器将能够处理请求。如果您编辑了您的请求并粘贴了确切的错误消息,则有人可能会告诉您为什么不会发生这种情况。

+0

谢谢。你的回答对我很有帮助。我的servlet并不经常关闭。当它会,我会尝试发布确切的错误。现在,我将尝试像其他建议一样将WAR文件部署到独立的TOMCAT中。 – 2010-01-14 17:59:11

2

你显然正处在使用servlet进行开发的阶段。您需要确保该网络应用程序是完全每当您对web.xml或任何Servlet类进行更改时发布。否则,您可能会冒险找不到资源。

简而言之,“资源未找到”错误基本上与“找不到404页”错误完全相同。该servlet容器似乎无法找到与URL或url-pattern匹配的资源。就这样。

至于Servlet生命周期,它只会web应用启动(发布,创建上下文),该init()方法将被调用,该实例将被保存在服务器的内存中排序期间创建一次Map<Url-Pattern, Servlet>。如果您已覆盖init()方法Servlet,那么它将被调用。对于在web.xml(或根据Java EE 6,用@WebServlet注释)中声明的所有servlet,servlet容器将执行相同的操作。

每当请求的URL与Servleturl-pattern匹配时,将调用(继承的)service()方法。然后,正常的HttpServlet实现将根据HttpServletRequest#getMethod()确定要执行的方法。如果您确实覆盖了您的Servlet中的任何方法(doGet()doPost()等),则会相应调用它。

最后,当webapp即将关闭(取消发布,破坏上下文)时,将调用destroy()以保存在服务器内存中的任何Servlet实例。如果您已覆盖中的destroy()方法Servlet,那么它将被调用。

+0

当你说“确保webapp完全发布”时,它是否意味着将更新的WAR文件复制到Tomcat的webapp文件夹中? – 2010-01-14 22:54:29

+0

我不做Netbeans,但在Eclipse中,您会在服务器控制台中看到“同步”状态。看看Netbeans中是否存在类似的东西。 – BalusC 2010-01-14 23:20:58