• 为何需要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的生命周期。

转载于:https://blog.51cto.com/xjava/1408531

Web容器和Servlet生命周期相关推荐

  1. 容器与Servlet生命周期

    1)容器大致功能有如下: 一.通信支持 无需自己建立监听端口.流.Socket等,容器知道与Web服务器的协议,所以不必担心自己的代码如何与服务器进行通信,交给容器就好 二.生命周期管理 容器可以自动 ...

  2. Servlet第一篇【介绍Servlet、HTTP协议、WEB目录结构、编写入门Servlet程序、Servlet生命周期】...

    tags: Servlet 什么是Serlvet?# Servlet其实就是一个遵循Servlet开发的java类.Serlvet是由服务器调用的,运行在服务器端. 为什么要用到Serlvet? 我们 ...

  3. Servlet第一篇【介绍Servlet、HTTP协议、WEB目录结构、编写入门Servlet程序、Servlet生命周期】

    什么是Servlet? Servlet其实就是一个遵循Servlet开发的java类.Servlet是由服务器调用的,运行在服务器端. 为什么要用到Servlet? 我们编写java程序想要在网上实现 ...

  4. Servlet生命周期与工作原理

    Servlet生命周期分为三个阶段: 1,初始化阶段  调用init()方法 2,响应客户请求阶段 调用service()方法 3,终止阶段 调用destroy()方法 Servlet初始化阶段: 在 ...

  5. Servlet底层原理、Servlet实现方式、Servlet生命周期

    Servlet简介 Servlet定义 Servlet是一个Java应用程序,运行在服务器端,用来处理客户端请求并作出响应的程序. Servlet的特点 (1)Servlet对像,由Servlet容器 ...

  6. 【Servlet】Servlet生命周期

    Servlet生命周期是指Servlet实例从创建到响应客户请求,直至销毁的过程. Servlet程序本身不直接在Java虚拟机上运行,由Servlet容器负责管理其整个生命周期. Servlet生命 ...

  7. 【JavaLearn】#(23)JSP相关语法、HTTP协议、Servlet介绍、Servlet生命周期、请求和响应、相对路径、转发和重定向

    1. JSP简单内容 1.1 JavaEE JavaEE 包含JSP JavaEE是一个开发分布式企业级应用的规范和标准.JavaEE包含之前学过的所有内容(JavaSE) 真正开发中,很少使用Jav ...

  8. JavaWeb——Servlet生命周期

    Servlet生命周期 构造方法 init方法 service方法 destory方法 注意 Servlet的创建和销毁是由Servlet容器负责的(Tomcat) jsp页面 <%@ page ...

  9. 关于servlet生命周期

    主题:关于servlet生命周期 时间:2018-09-25 内容: (一)初始化阶段init() 默认web.xml,在服务器启动,第一次发送请求,服务器容器会实例化servlet对象,并执行ser ...

最新文章

  1. python猜拳游戏三局两胜制_猜拳游戏三局两胜------java实现代码
  2. android平板安装python_Notepad++配置Python开发环境
  3. research how javascript is generated by java class
  4. java中list去除空值_Java –从列表中删除所有空值
  5. 查看 固态硬盘位置_3米防摔+人脸/指纹解锁:西数Armorlock移动固态硬盘
  6. MonoBehaviour常用方法
  7. java需要会的工具_Java开发者必备的几款工具,一定要掌握!
  8. Non-resolvable parent POM for com.supermarket:supermarket:0.0.1-SNAPSHOT: Could not transfer artifac
  9. (转)增强学习(二)----- 马尔可夫决策过程MDP
  10. php 正则断言里面使用*+
  11. 改错记录:MyBatis连接MySql数据库对数据表进行操作时报错 Error updating database.
  12. 【Matlab学习笔记】保存图片(待续)
  13. 栈和队列的共同点和不同点
  14. 谷哥学术2022年资源分享下载列表 06/20
  15. 6月份鸿蒙升级名单,华为鸿蒙系统6月升级名单机型有哪些
  16. 一个人在家怎么赚钱?普通人如何通过网络实现在家就能赚钱
  17. DOTA2匹配机制详解
  18. 【埃森哲员工笔试试题及答案】 - 面试网
  19. FLAC文件格式详解
  20. CTF中出现的各种字符/密码总结

热门文章

  1. 御宅男YznCMS开源后台管理系统源码
  2. 用Vim编程——配置与技巧
  3. 深入理解Magento – 第一章 – Magento强大的配置系统
  4. 全排列及相关扩展算法(四)——原始中介数通过逆推求原排列算法
  5. 最短路径——Floyd算法HDU Today(hdu2112)
  6. mysql 主从复制结构配置
  7. Tensorflow object detection API 搭建自己的目标检测模型并迁移到Android上
  8. Python与机器视觉(x) 颜色直方图
  9. php 一句话木马、后门
  10. 作业 给计算机编号 winform