Web容器和Servlet生命周期

  • 为何需要Web容器

Web服务器本身主要用于支持http协议,包括监听和相应http请求。web服务器一般处理静态的请求,如文件系统中的静态文件。web容器则是为web相关的组件提供运行环境,可以从‘容器’一词稍微理解其含义。

简单说,web服务器和web容器本身只是一个平台的应用程序而已。因此,为了理解其作用,假设在没有web服务器和web容器的情况下,我们如何响应客户端请求。从网络编程的角度来看,我们需要:

  1. new一个ServerSocket监听在一个端口上
  2. 调用accept等待客户端连接
  3. 有连接了返回一个和客户端相对应的Socket对象用于客户端和服务器之间的通信
  4. 为了能够并发的处理请求,还需要多线程的支持,对请求排队,开多个线程处理队列中的请求或者每个请求开一个线程
  5. 对于web应用来说,还要分析Http协议,处理http数据包,根据http数据包中的数据对客户端做出响应

从上可以看出,在没有web服务器和web容器的情况下,开发一个web应用是非常艰难的,因此,web服务器和web容器帮我们把这些通用的事情都做好了,只需要在已有的框架内,关注于本身的业务进行开发。

那web容器本身为何物,从容器一词可以看出,其主要提供一个运行的环境。web应用程序本身是没有main函数的,主要通过请求触发的方式执行。如果说web应用只关注于业务本身,那其从何处开始执行,以及对于http数据包本身的分析包括请求参数、协议版本、数据类型等等,都需要一个完整的执行环境,这个东西就是web容器。就Servlet来说,Servlet的开发从继承HttpServlet开始,实现其doPost和doGet函数处理请求。但是两个函数本身的参数都是HttpServletRequest和HttpServletResponse对象,而且HttpRequest对象已经包含了http请求中的参数字段,这些对象就是Web容器提供的。还有Servlet对象本身的构建也不需要关心,容器会加载Servlet类,调用构造函数、init函数,和最后destroy。其提供了对Servlet整个生命周期的管理。

  • Servlet生命周期

Servlet用于处理Http请求,在Web开发的MVC模式中,担当控制器的角色。用于调用具体的业务逻辑对象处理业务逻辑,然后将处理结果转发给View层,通过Web服务器发送给客户端。

之前说过,Web容器负责管理Servlet的生命周期,Servlet生命周期本身如下图所示:

在Servlet加载之前,容器先加载Servlet的class文件、调用其构造函数,然后进入Servlet真正的生命周期,init-》service-》destroy,容器会保证service方法执行之前,init方法已经完成,使其在提供服务之前,进行相应的初始化。容器会根据不同的Servlet配置,在不同的时间段加载Servlet,当Servlet配置了load-on-startup时,会在服务器启动时进行加载,这种方式可以用于初始化一些全局环境。当没有配置load-on-startup时,在第一次请求到来是,容器会加载Servlet响应请求。Servlet的一生主要在service中度过,用于响应客户端的服务,这个函数会根据不同的请求函数对请求进行分发,doPost对POST请求进行处理,doGet对GET请求进行处理。当服务器关闭时,容器会调用Servlet的destroy方法,保证在Servlet结束之前,释放其持有的资源。

那么容器在servlet的生命周期和请求响应过程中干些什么呢,如之前说的,其会分析Http数据包,打包成HttpServletRequest和HttpServletResponse对象,然后执行service方法。其实,容器对于每一个Http请求都会新建一个线程,处理请求。线程、request、response和service就组成了一个客户端从请求到响应的环境。当请求结束时,容器会清理request和response对象,结束线程或者回收其到线程池。从这里可以看出,每个请求虽然在单独的线程中运行,但是Servlet本身并非线程安全。从Servlet生命周期分析中可以看出,每一个Servlet对象在整个web应用的生命中只有一个,对于每一个请求,在不同的线程中执行其service方法而已。

  • 从URL到Servlet

客户端的请求一般都是一个URL,如何从URL映射到Servlet,然后加载(如果需要)初始化对应的Servlet呢。每一个Web项目都需要web.xml对其进行配置,其中就包括了<servlet>,<servlet-mapping>两个标签。<servlet>标签用于从servlet的class到servlet-name的映射,servlet-name是一个只用于web.xml配置中使用的一个名字,其可以随便命名,用于URL和对于的class直接解耦。<serlvet-mapping>用于从url到<servlet-mapping>的映射。容器从URL到Servlet的映射就可以通过分析web.xml来实现。先从<servlet-mapping>找到从URL到servlet-name,然后在从servlet-name找到对应的class的全局限定名。找到了class之后,如果需要加载则会加载类,并出行上述的生命周期过程,如果已经加载过了,容器直接执行其service方法,处理请求。这就是从URL到Servlet到客户端响应的过程。其中容器全权负责Servlet的生命周期。

Web容器和Servlet生命周期

时间: 2024-08-03 12:43:31

Web容器和Servlet生命周期的相关文章

06-码蚁JavaWeb之Servlet生命周期与基本配置

学习地址:[撩课-JavaWeb系列1之基础语法-前端基础][撩课-JavaWeb系列2之XML][撩课-JavaWeb系列3之MySQL][撩课-JavaWeb系列4之JDBC][撩课-JavaWeb系列5之web服务器-idea] Servlet生命周期 Servlet什么时候被创建 1.默认情况下第一次访问的时候创建 2.可以通过配置文件设置服务器启动的时候就创建 `init()` servlet对象创建的时候调用 默认第一次访问时创建 `service()` 每次请求都会执行一次 `de

Servlet 生命周期与web容器的关系

servlet生命周期由web容器(如tomcat)管理,初始化一次,直到web容器关闭才会被销毁.1.servlet是单例多线程,每个请求过来容器都会启用一个新线程 2.servlet在容器中保持单例,只会被初始化一次 当web.xml中servlet配置load-on-startup为正整数时,容器启动时servlet就会初始化:创建对象->init(ServletConfig config)->init() 当load-on-startup没有设置或值为负数时,servlet要被请求时才

Servlet生命周期和工作原理

Servlet生命周期分为三个阶段: 1,初始化阶段  调用init()方法 2,响应客户请求阶段 调用service()方法 3,终止阶段 调用destroy()方法 Servlet初始化阶段: 在下列时刻Servlet容器装载Servlet: 1,Servlet容器启动时自动装载某些Servlet,实现它只需要在web.XML文件中的<Servlet></Servlet>之间添加如下代码: <loadon-startup>1</loadon-startup&g

Servlet生命周期、工作原理、配置

Servlet生命周期 分为三个阶段: 1,初始化阶段  调用init()方法 2,响应客户请求阶段 调用service()方法 3,终止阶段 调用destroy()方法 Servlet工作原理 每一个自定义的Servlet都必须实现Servlet的接口,Servlet接口中定义了五个方法,其中比较重要的三个方法涉及到Servlet的生命周期,分别是上文提到的init(),service(),destroy()方法.GenericServlet是一个通用的,不特定于任何协议的Servlet,它实

javaWeb中servlet开发(3)——Servlet生命周期

生命周期:是一个程序的存在周期,servlet由于是受容器的管理,所以容器来决定其生命周期 1.servlet生命周期 2.servlet生命周期对应的方法 3.servlet生命周期代码 public class LifeCycleServlet extends HttpServlet{ public void init() throws ServletException{ System.out.println("** 1.Servlet初始化 --> init()") ; }

Java Servlet系列之Servlet生命周期

Servlet生命周期定义了一个Servlet如何被加载.初始化,以及它怎样接收请求.响应请求,提供服务.在讨论Servlet生命周期之前,先让我们来看一下这几个方法: 1. init()方法 在Servlet的生命周期中,仅执行一次init()方法,它是在服务器装入Servlet时执行的,可以配置服务器,以在启动服务器或客户机首次访问Servlet时装入Servlet.无论有多少客户机访问Servlet,都不会重复执行init(): 2. service()方法 它是Servlet的核心,每当

Servlet 生命周期、工作原理

一. Servlet 生命周期 servlet 加载--->实例化--->服务--->销毁. init():在Servlet的生命周期中,仅执行一次init()方法.它是在服务器装入Servlet时执行的,负责初始化Servlet对象.可以配置服务器,以在启动服务器或客户机首次访问Servlet时装入Servlet.无论有多少客户机访问Servlet,都不会重复执行init(). service():它是Servlet的核心,负责响应客户的请求.每当一个客户请求一个HttpServlet

Servlet生命周期与工作原理

Servlet生命周期分为三个阶段: 1,初始化阶段  调用init()方法 2,响应客户请求阶段 调用service()方法 3,终止阶段 调用destroy()方法 Servlet初始化阶段: 在下列时刻Servlet容器装载Servlet: 1,Servlet容器启动时自动装载某些Servlet,实现它只需要在web.XML文件中的<Servlet></Servlet>之间添加如下代码: <loadon-startup>1</loadon-startup&g

Web容器与Servlet

转自:http://www.360doc.com/content/10/0713/20/495229_38798294.shtml Web服务器与Web应用层属于不容两个范畴,为了让他们两写作,首先应用中介方当制定Web应用与Web服务器进行协作的标准接口,Servlet就是其中一个主要的协议.接口. Web应用与Web服务器进行协作的一系列标准Java接口,统称Java Servlet API.另外还有一些Servlet规范.Servlet规范把能够与发布和运行Java Web应用容器的Web