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