-3

下午好。
为什么一个 HTTPservlet 的生命周期可以由一个 WEB 容器来管理?
WEB 服务器(例如 Apache Tomcat)能够捕获来自客户端的 HTTP 请求,以处理和回复 HTTP 响应;servlet 需要一个 web 容器(例如 Apache Tomcat),因为它没有 main,所以我们可以将 servlet 引擎视为初始化 servlet(简而言之)的“main”
好的!现在我不明白为什么这件事是可能的。当客户端发送 HTTP 请求时,如果这是该 servlet 的第一次调用,Web 容器将调用 init()。然后,它允许调用 doGet、doPost(和其他方法)。最后,servlet 被销毁[destroy()]。但是 Web 容器是如何做到这一点的呢?servlet 引擎内部发生了什么?

****************************************EDIT*******************************************

我的问题是关于 servlet 引擎可以管理 servlet 周期的原因。答案真的很简单。servlet 引擎可以管理 servlet 的循环(因此它可以自动调用 create()、service() 和 destroy() 方法),因为 servlet 有一个公共接口javax.Servlet.servlet该接口声明了具有语义、准确含义的方法

create() is used just to create servlet
service() is used to handle HTTP methods
destroy() is used to delete the servlet

程序员可以重写这些方法,但他们必须尊重方法的语义。

4

2 回答 2

2

Java 2 EE 标准描述了 Web 应用程序的不同部分如何协同工作。简而言之:

  • 您的项目被编译成具有特定布局的 WAR 文件。此存档包含您的应用程序的代码和所有依赖项。
  • Servlet 需要在web.xml作为 WAR 归档的一部分的文件中注册自己
  • servlet 是实现HttpServletAPI的 Java 类。
  • 当容器加载 WAR 时,它会创建一个特殊的类加载器,可以加载其中包含的所有类。
  • 当客户端请求特定的 URL 时,容器web.xml会查找可以处理请求的 servlet。
  • 当找到一个 servlet 时,容器使用类加载器和来自 的参数web.xml来加载类并创建一个实例。
  • 当实例存在时,它会调用与请求匹配的方法。
  • 然后该方法将准备结果。
  • 如果出现任何问题,容器将准备一个错误答案。
于 2015-05-18T13:39:01.987 回答
1

一个 servlet 容器:

  • 保留所有已部署的 Servlet 列表(Servlet 类必须在 war 中名为 web.xml 的特殊文件中声明。请注意,由于可以使用 Servlet 3.0 注释而不是 web.xml)
  • 跟踪 url 映射规则(url xyz 必须由 Servlet abc 处理,...)。这些映射也在 web.xml 中定义。
  • 能够创建 servlet 的新实例:它使用动态调用来创建实例,然后在其上调用“init()”方法。

当 HTTP 请求到达时:

  • Servlet 容器创建 HttpServletRequest(基于收到的 HTTP 请求)和 HttpServletResponse 对象。
  • Servlet 容器查看 url 以查看哪个 Servlet 将处理它。(如果之前从未调用过 Servlet,则创建并初始化它)。一旦 Servlet 准备就绪(在 init() 调用返回之后):容器调用 Servlet 的doGet(...)ordoPost(...)或 ...。(参数是刚刚创建的 HttpServletRequest 和 HttpServletResponse)

注意:这实际上是系统的概述。省略了许多细节,例如 servletFilters、线程池管理、类加载器问题……

于 2015-05-18T13:52:40.677 回答