Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么web容器可以管理servlet?_Java_Tomcat_Servlets_Web Container - Fatal编程技术网

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需要在文件
    web.xml
    中注册自己,该文件是WAR存档的一部分
  • servlet是一个Java类,它实现了
  • 当容器加载WAR时,它会创建一个特殊的类加载器,可以加载其中包含的所有类
  • 当客户端请求特定的URL时,容器会查看
    web.xml
    ,以找到可以处理请求的servlet
  • 找到servlet后,容器使用类加载器和
    web.xml
    中的参数来加载类并创建实例
  • 当实例存在时,它调用与请求匹配的方法
  • 然后,该方法将准备结果
  • 如果出现任何错误,容器将准备一个错误答案
servlet容器:

  • 保留已部署的war中所有Servlet的列表(必须在war中的一个名为web.xml的特殊文件中声明Servlet类。请注意,由于可以使用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()调用返回之后):容器调用
    doGet(…)
    doPost(…)
    或。。。Servlet的一部分。(参数是刚刚创建的HttpServletRequest和HttpServletResponse)

注意:这实际上是对系统的概述。许多细节被忽略了,比如servletFilters、线程池管理、类装入器关注点等。

如果您对细节感兴趣,可以查看的源代码。嗨,Aaron,是否严格要求只在第一次需要时才延迟加载servlet?@bayou.io:不,容器可以急切地创建它们。