Java servlet是如何工作的?

Java servlet是如何工作的?,java,servlets,Java,Servlets,我编写了几个servlet程序,但是我不认为我完全理解servlet是如何运行的。我有一个问题: 我写的关于Servlet的所有代码都只在Netbeans上运行,后面运行的是apachetomcat。当我运行向servlet发出请求的html文件时,它通常会给出错误,说它找不到servlet,然后我必须重新部署servlet,然后一切都会正常运行。好像我的servlet在一段时间后超时了 servlet是否一直在运行?Servlet有init()和destroy(),所以我想它不会一直运行。那么

我编写了几个servlet程序,但是我不认为我完全理解servlet是如何运行的。我有一个问题:

我写的关于Servlet的所有代码都只在Netbeans上运行,后面运行的是apachetomcat。当我运行向servlet发出请求的html文件时,它通常会给出错误,说它找不到servlet,然后我必须重新部署servlet,然后一切都会正常运行。好像我的servlet在一段时间后超时了


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

在正常情况下,servlet仅在关闭时销毁(即当应用程序容器(如Tomcat)关闭时)。否则,它将在应用程序运行期间保留在内存中。我说不出你的Netbeans安装是怎么回事,但是试着将你的WAR文件部署到一个独立的Tomcat安装中,看看这个问题是否没有消失

应用程序容器在servlet上调用
destroy
的另一个时间是,如果它的内存不足,但这种情况就不常见了


关于您的请求问题,servlet设计用于处理许多请求。据说servlet是应用程序作用域,而请求有自己的作用域。

您需要研究servlet的生命周期-这就是init()和destroy方法的用途

通常,在第一次调用serlvet时,init()只调用一次(除非您在tomcat中将其设置为自动运行)

当容器关闭时调用destroy()

dopost()或doGet()(如果是HTTP servlet)会为每个请求调用

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


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

您显然正在开发servlet。每当您对
web.xml
或任何
Servlet
类进行更改时,您需要确保webapp是完全发布的。否则,您可能会面临找不到资源的风险

简单来说,“未找到资源”错误基本上与“未找到404页”完全相同。servlet容器似乎找不到与URL或
URL模式
匹配的资源。就这些

至于
Servlet
生命周期,它将在webapp启动(发布、创建上下文)期间只创建一次,调用
init()
方法,实例将以一种
映射的形式保存在服务器内存中。如果您已经覆盖了
Servlet
中的
init()
方法,那么它将被调用。servlet容器将对
web.xml
中声明的所有servlet执行相同的操作(或者根据JavaEE6,用
@WebServlet
注释)

每当一个请求的URL与
Servlet
URL模式匹配时,就会调用(继承的)
service()
方法。然后,正常的
HttpServlet
实现将根据以下内容确定要执行的方法。如果您在
Servlet
中重写了这些方法中的任何一个(
doGet()
doPost()
,等等),那么它将被相应地调用


最后,当webapp即将关闭(取消发布,销毁上下文)时,将为服务器内存中保存的任何
Servlet
实例调用
destroy()
。如果您在
Servlet
中重写了
destroy()
方法,那么它将被调用。

当您说将WAR文件部署到独立的Tomcat时,它只是指Apache Tomcat文件夹中webapps文件夹中的WAR文件。我说得对吗?你还需要做其他事情来实际部署它吗,否则Tomcat会自动为你部署WAR文件不,Tomcat会自动扩展WAR文件。当您在
webapps
下看到与WAR文件同名的目录时,您就会知道发生了这种情况(例如,如果您部署了
myapp.WAR
,则会看到目录“$CATALINA\u HOME/webapps/myapp/)。根据您使用的Tomcat版本,您可能需要重新启动Tomcat,或者它可能会自动启动。谢谢。你的回答对我帮助很大。我的servlet很少被关闭。当它会的时候,我会尝试发布准确的错误。现在,我将尝试像其他建议的那样将WAR文件部署到独立的TOMCAT上。当你说“确保webapp完全发布”时,这是否意味着将更新的WAR文件复制到TOMCAT中的webapp文件夹中?我不做Netbeans,但在Eclipse中,你会在服务器控制台中看到“已同步”状态。看看Netbeans中是否存在类似的东西。