Tomcat和Servlet简析

目录

  • Servlet
  • Tomcat
  • 参考

Servlet

Servlet通常指我们继承了Servlet接口的类,我们开发Servlet时一般就是继承HttpServlet重写它的doGet、doPost方法达到提供服务的目的。Servlet不仅仅是这些,我们用的JSP在编译器也会被编译成Servlet类,JSP是一种页面渲染更为方便的Servlet。

Servlet是一个提供服务的类,那它是如何发挥作用呢?要了解Servlet,我们有必要了解一下它的容器比如Tomcat。想象一下在一栋大楼里有非常多特殊服务者Servlet,这栋大楼有一套智能系统帮助接待顾客引导他们去所需的服务提供者那接受服务。这里顾客就是一个个请求,特殊服务者就是Servlet,而这套智能系统就是Tomcat容器。

Tomcat

Tomcat服务器本质是通过ServerSocket与客户端进行通信,有两个核心组件,Connecter和Container。

Connecter将在指定端口上侦听客户请求,接收浏览器的发过来的 tcp 连接请求,创建一个 Request 和 Response 对象分别用于和请求端交换数据。Request包含客户端的请求信息,Response包含服务器的应答信息。
然后会产生一个线程来处理这个请求并把产生的 Request 和 Response 对象传给Container处理。
Connector 的核心功能是接收连接请求,并分配线程让 Container 来处理请求,所以它的核心是多线程处理。

当Connector处理完后会调用Container的invoke()方法,我们可以想象Container容器里有一条管道,管道上有很多阀门,每个阀门都会根据request进行一些操作,request和response会依次经过这些阀门,而Servlet就是管道的最后一道阀门,之前的阀门就是filter

Tomcat容器的上下层级关系如下图。

Tomcat的四层容器不都是必须的,简单的容器只有Context和Wrapper两层。
Contenxt负责管理多个Wrapper,把映射转发到对应Wrapper,期间还要经过filter过滤。
Wrapper是最低层的容器,它只包裹着一个Servlet,Wrapper负责加载并管理调用Servlet服务。

只有Context和Wrapper的tomcat服务器处理请求的流程如下:

  1. Connector监听到socket请求,解析包,创建request和repsonse对象,将信息存放在request中,将两个对象发往对应Context处理。
  2. Context根据请求找到对应Wrapper,然后根据需求创建Filter链,将两个对象传入Filter链中。
  3. 对象经过Filter链,最后经过Servlet为他们提供服务(服务详情见下文)。
  4. 然后一层层返回Filter链回到Context
  5. 返回Connector,将response发送会客户端。

Servlet会提供以下服务:

  1. 读取客户端发送的显式的数据,包括 HTML 表单、 applet 或自定义 HTTP 客户端程序的表单。
  2. 读取客户端发送的隐式 HTTP 请求数据,包括 cookies、媒体类型和浏览器能理解的压缩格式等。
  3. 处理数据并生成结果。这个过程可能需要访问数据库,执行 RMI 或 CORBA 调用,调用 Web 服务,或者直接计算得出对应的响应。
  4. 发送显式的数据(即文档)到客户端。该文档的格式可以是多种多样的,包括文本文件(HTML 或 XML)、Json、二进制文件(GIF 图像)等。
  5. 发送隐式的 HTTP 响应到客户端。如告诉客户端被返回的文档类型(例如 HTML),设置 cookies 和缓存参数等。

参考

《How Tomcat Works》
IBM Developer上的文章——Servlet工作原理解析
IBM Developer上的文章——Tomcat系统架构与设计模式, 第1部分, 工作原理
https://www.cnblogs.com/llsblog/p/10634099.html

原文地址:https://www.cnblogs.com/ChengzhiYang/p/12529881.html

时间: 2024-10-09 16:45:30

Tomcat和Servlet简析的相关文章

[tomcat]源码简析 异步/非阻塞和请求构成

提出疑惑 SpringFramework5.0又新增加了一个功能Webflux(响应式编程),是一个典型非阻塞异步的框架.我们知道servlet3.0实现异步(AsyncContext),servlet3.1又提出了非阻塞IO.对此我一直有两点疑惑:1.tomcat8底层已经默认使用NIO了,不是已经是IO非阻塞了吗,怎么又说servlet3.1解决了非阻塞.2.关于异步,如果开发者在serlvet中开一个业务线程来实现,也算异步,为什么3.0还提供了一个组件来解决,那么这种方式和开发者自己开个

web应用构架LAMT及tomcat负载简析

Httpd    (mod_jk.so) workers.properties文件 uriworkermap.properties文件 <--AJP1.3--> Tomcat  --> jdk 大致流程:apache服务器通过mod_jk.so 模块处理jsp文件的动态请求.通过tomcat worker等待执行servlet/JSP的tomcat实例.使用 AJP1.3协议与tomcat通信.tomcat有借助jdk解析. 负载就是 多台tomcat.共同解析apache发送的jsp请

SpringMVC学习——概念、流程图、源码简析(一)

学习资料:开涛的<跟我学SpringMVC.pdf> 众所周知,springMVC是比较常用的web框架,通常整合spring使用.这里抛开spring,单纯的对springMVC做一下总结. 概念 HandlerMapping:处理器映射,对请求的URL进行映射为具体的处理器(如果有拦截器也包含拦截器,会将Handler和多个HandlerInterceptor封装为HandlerExecutionChain对象) HandlerAdapter:处理器适配器,适配不同类型的处理器,如Cont

借助LANMT构架,简析ngnix的使用

LNMP流程图 nginx PHP Mysql Nginx Fastcgi_pass <-FastCGI-> fastcgi-(php-fpm)<->wrapper Php 解析器 (Php.ini) <->mysql fastcgi-(php-fpm)<->wrapper fastcgi-(php-fpm)<->wrapper fastcgi-(php-fpm)<->wrapper fastcgi-(php-fpm)<->

简析Spring MVC 数据解析

简析Spring MVC 数据解析 特别说明:本文使用spring 版本为 4.1.3 常用数据提交方式: 1. form 表单提交数据 1.1 解析form表单数据(无图片等数据) 前端代码事例: <form action="test/entity" method="post"> 用户ID:<input type="text" name="userid"/><br> 用户名:<inp

0002 - Spring MVC 拦截器源码简析:拦截器加载与执行

1.概述 Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理.例如通过拦截器可以进行权限验证.记录请求信息的日志.判断用户是否登录等. 2.简单示例 2.1.继承 HandlerInterceptorAdapter 抽象类实现一个拦截器.代码如下: public class DemoInterceptor extends HandlerInterceptorAdapter { @Override    pu

CentOS的网络配置简析

我们在进行对CentOS的网络配置时,一般会从IP地址(IPADDR).子网掩码(NETMASK).网关(Gateway).主机名(HOSTNAME).DNS服务器等方面入手.而在CentOS中,又有着不同的命令或配置文件可以完成这些配置操作,接下来,我们将从ifcfg系命令,iproute2系命令以及配置文件3个方面来简析网络配置的方法. 一.ifcfg系命令 ifcfg系命令包括ifconfig,route,netstat和hostname. 1.ifconfig命令 用来配置一个网络接口.

JDK源码简析--java.lang包中的基础类库

题记 JDK,Java Development Kit. 我们必须先认识到,JDK只是,仅仅是一套Java基础类库而已,是Sun公司开发的基础类库,仅此而已,JDK本身和我们自行书写总结的类库,从技术含量来说,还是在一个层级上,它们都是需要被编译成字节码,在JRE中运行的,JDK编译后的结果就是jre/lib下得rt.jar,我们学习使用它的目的是加深对Java的理解,提高我们的Java编码水平. 本系列所有文章基于的JDK版本都是1.7.16. 本节内容 在本节中,简析java.lang包所包

经验模态分解法简析 (转)

http://blog.sina.com.cn/s/blog_55954cfb0102e9y2.html 美国工程院士黄锷博士于1998年提出的一种信号分析方法:重点是黄博士的具有创新性的经验模态分解(Empirical Mode Decomposition)即EMD法,它是一种自适应的数据处理或挖掘方法,非常适合非线性,非平稳时间序列的处理,本质上是对数据序列或信号的平稳化处理. 1:关于时间序列平稳性的一般理解: 所谓时间序列的平稳性,一般指宽平稳,即时间序列的均值和方差为与时间无关的常数,