servlet如何工作?

时间:2010-01-13 20:52:26

标签: java servlets

我编写了一对servlet程序,但我不认为我完全理解servlet是如何运行的。所以这是我的夫妻问题:

我写的关于Servlet的所有代码只能运行在Netbeans上,后面有apache tomcat。当我运行向servlet发出请求的html文件时,它通常会给出错误,说它无法找到servlet,然后我必须重新部署servlet,然后一切运行正常。看起来像我的servlet超时一段时间后。

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

4 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:2)

你显然处于使用servlet进行开发的过程中。每当您对web.xml或任何Servlet类进行更改时,您都需要确保发布完全的webapp。否则,您可能无法找到资源。

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

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

每次请求其网址与url-pattern的{​​{1}}匹配时,都会调用(继承的)Servlet方法。然后,正常的service()实现将根据HttpServletRequest#getMethod()确定要执行的方法。如果您在 HttpServlet中覆盖了任何这些方法(doGet()doPost()等),则会相应地调用它。

最后,当webapp即将关闭(取消发布,销毁上下文)时,将为服务器内存中保存的任何Servlet实例调用destroy()。如果您已覆盖 Servlet中的destroy()方法,则会调用该方法。

答案 2 :(得分:1)

servlet仅在调用时“运行”。服务器将等待来自客户端的连接,读取标头,根据web.xml中的映射找到正确的servlet,然后调用该servlet的service()方法。 servlet对象将保留在内存中,直到容器决定对其进行处理(它可能在任何时候都没有处理请求)。如果服务器决定处理特定的servlet实例,它将在下次请求servlet时创建一个新的实例。

这意味着您不应该收到一条错误消息,指出服务器无法找到您的servlet。假设已部署应用程序,并且存在正确的servlet映射,则容器将能够处理该请求。如果您编辑了请求并粘贴了确切的错误消息,则有人可能会告诉您为什么没有这样做。

答案 3 :(得分:0)

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

当第一次调用serlvet时,通常会调用init()一次(除非你做了类似设置在tomcat中自动运行的东西)

容器关闭时调用

和destroy()

为每个请求调用

dopost()或doGet()(如果它是HTTP servlet)