Java 为什么web容器可以管理servlet?
下午好。Java 为什么web容器可以管理servlet?,java,tomcat,servlets,web-container,Java,Tomcat,Servlets,Web Container,下午好。 为什么HTTPservlet的生命周期可以由WEB容器管理? WEB服务器(例如ApacheTomcat)能够捕获来自客户端的HTTP请求,以处理并使用HTTP响应进行回复;servlet需要一个web容器(例如apachetomcat),因为它没有main,所以我们可以将servlet引擎视为初始化servlet的“main”(简而言之)
为什么HTTPservlet的生命周期可以由WEB容器管理?
WEB服务器(例如ApacheTomcat)能够捕获来自客户端的HTTP请求,以处理并使用HTTP响应进行回复;servlet需要一个web容器(例如apachetomcat),因为它没有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
程序员可以重写这些方法,但他们必须尊重方法的语义 Java2EE标准描述了web应用程序的不同部分是如何协同工作的。简言之:
- 您的项目被编译成具有特定布局的WAR文件。此存档包含应用程序的代码和所有依赖项
- servlet需要在文件
中注册自己,该文件是WAR存档的一部分web.xml
- servlet是一个Java类,它实现了
- 当容器加载WAR时,它会创建一个特殊的类加载器,可以加载其中包含的所有类
- 当客户端请求特定的URL时,容器会查看
,以找到可以处理请求的servletweb.xml
- 找到servlet后,容器使用类加载器和
中的参数来加载类并创建实例web.xml
- 当实例存在时,它调用与请求匹配的方法
- 然后,该方法将准备结果
- 如果出现任何错误,容器将准备一个错误答案
- 保留已部署的war中所有Servlet的列表(必须在war中的一个名为web.xml的特殊文件中声明Servlet类。请注意,由于可以使用Servlet 3.0注释代替web.xml)
- 跟踪url映射规则(url xyz必须由Servlet abc处理,…)。这些映射也在web.xml中定义
- 能够创建servlet的新实例:它使用动态调用创建实例,然后对其调用“init()”方法
- Servlet容器创建HttpServletRequest(基于收到的HTTP请求)和HttpServletResponse对象李>
- Servlet容器查看url以查看哪个Servlet将处理它。(如果以前从未调用过Servlet,则创建并初始化它)。
一旦Servlet就绪(在init()调用返回之后):容器调用
或doGet(…)
或。。。Servlet的一部分。(参数是刚刚创建的HttpServletRequest和HttpServletResponse)doPost(…)
注意:这实际上是对系统的概述。许多细节被忽略了,比如servletFilters、线程池管理、类装入器关注点等。如果您对细节感兴趣,可以查看的源代码。嗨,Aaron,是否严格要求只在第一次需要时才延迟加载servlet?@bayou.io:不,容器可以急切地创建它们。