浅谈Tomcat和Servlet
本文浅谈下对Tomcat和Servlet总体的理解,初学时有用过一段时间,但当时疲于应对如何xml配置和使用,对他们的理解就像是一个黑匣子。现在回顾一下帮助自己加深网络的理解。开始还是先推荐我看的文章和书。
https://www.cnblogs.com/zhouyuqin/p/5143121.html
以下都是IBM Developer上的文章,该网站上还是有很多优质文章。
https://www.ibm.com/developerworks/cn/java/j-lo-servlet/ Servlet 工作原理解析
https://www.ibm.com/developerworks/cn/java/j-lo-tomcat1/index.html Tomcat 系统架构与设计模式,第 1 部分 工作原理
书籍
《How Tomcat Works》 深入浅出,从零开始较你构建一个Tomcat服务器
正文
我们刚接触JavaWeb时不可避免的要跟Servlet打交道,那么Servlet到底是什么呢?其实从狭义上来说,Servlet通常指的是我们继承了Servlet接口的类,我们开发Servlet时一般就是继承HttpServlet重写它的doGet、doPost方法达到提供服务的目的。Servlet不仅仅是这些,我们用的JSP在编译器也会被编译成Servlet类,JSP是一种页面渲染更为方便的Servlet。
Servlet是一个提供服务的类,那它又是怎么发挥作用的呢?要了解Servlet,我们有必要了解一下它的容器比如Tomcat,想象一下在一栋大楼里有非常多特殊服务者Servlet,这栋大楼有一套智能系统帮助接待顾客引导他们去所需的服务提供者那接受服务。这里顾客就是一个个请求,特殊服务者就是Servlet,而这套智能系统就是Tomcat容器。
Tomcat服务器本质是通过ServerSocket与客户端进行通信,要进行通信首先就要进行TCP连接,Tomcat有两个核心组件,Connecter和Container,Connecter将在某个指定的端口上侦听客户请求,接收浏览器的发过来的 tcp 连接请求,创建一个 Request 和 Response 对象分别用于和请求端交换数据,Request包含了用户的请求信息,Response负责记录了服务器的答复内容。然后会产生一个线程来处理这个请求并把产生的 Request 和 Response 对象传给Container处理。
Connector 最重要的功能就是接收连接请求然后分配线程让 Container 来处理这个请求,所以这必然是多线程的,多线程的处理是 Connector 设计的核心。
当Connector处理完后会调用Container的invoke()方法,你可以想象Container容器里有一条管道,管道上有很多阀门,每个阀门都会根据request进行一些操作,request和response请求会依次经过这些阀门,而Servlet就是该管道的最后一道阀门,之前的阀门就是filter。
Tomcat容器也分有上下层级关系如下图,Tomcat的四层容器不都是必须的,一般简单的容器只有Context和Wrapper两层,Contenxt负责管理多个Wrapper,负责将映射转发到对应Wrapper,当然期间还要经过filter过滤。Wrapper是最低层的容器,它只包裹着一个Servlet,Wrapper负责加载并管理调用Servlet服务。
有了以上知识我们可以想象下简单的只有Context和Wrapper的服务器是怎么处理请求的。
1、Connector监听到socket请求,读取信息并创建request和repsonse对象,将信息存放在request中,将两个对象发往到对应Context处理。
2、Context根据请求找到对应Wrapper,然后根据需求创建Filter链,将两个对象传入Filter链中。
3、对象经过Filter链最后经过Servlet为他们进行服务。
4、然后一层层返回Filter链回到Context
5、返回Connector,将response发送会客户端。
以上仅仅是Tomcat和Servlet的概观。Tomcat还有一些重要的组件或功能比如 负责启动Tomcat的LifeCycle接口,管理Session的类等等,等我学习完进行讲解,大家也可以从我推荐的书籍和文章中学到。
浅谈Tomcat和Servlet的更多相关文章
- 浅谈tomcat中间件的优化【转】
今天来总结一下tomcat的一些优化的方案,由于本人才疏学浅,写的不好,勿喷! tomcat对于大多数从事开发工作的童鞋应该不会很陌生,通常做为默认的开发环境来为大家服务,不过tomcat默认的一些配 ...
- 浅谈tomcat的配置及数据库连接池的配置
1.如何修改tomcat的端口 在某些情况下,可能需要修改tomcat监听的端口8080,比如: a.需要启动两份tomcat服务器 b.某个服务占用了8080端口(1433,1521,3306... ...
- 浅谈tomcat 、apache、 nginx的区别及优缺点
(~~排版垃圾~~,此文纪念自己18年6月所作为,如有不适合之处,请告知.) 本文主要说明tomcat .apache. nginx的定义.区别及优缺点 一. 定义: 1. Apache Apache ...
- 浅谈Eclipse调用Tomcat服务的原理
浅谈Eclipse调用Tomcat服务的原理 转:http://www.thinksaas.cn/group/topic/341645/ 转:http://www.173it.cn/Html/?581 ...
- 浅谈JavaWEB入门必备知识之Servlet入门案例详解
工欲善其事.必先利其器,想要成为JavaWEB高手那么你不知道servlet是一个什么玩意的话,那就肯定没法玩下去,那么servlet究竟是个什么玩意?下面,仅此个人观点并通过一个小小的案例来为大家详 ...
- 浅谈 JSP & Servlet
body { text-align: center; } div.develon { background-color: #cccccc; font-size: 20px; } 背景 相信大家都见过这 ...
- 【架构】浅谈web网站架构演变过程
浅谈web网站架构演变过程 前言 我们以javaweb为例,来搭建一个简单的电商系统,看看这个系统可以如何一步步演变. 该系统具备的功能: 用户模块:用户注册和管理 商品模块:商品展示和管 ...
- !! 浅谈Java学习方法和后期面试技巧
浅谈Java学习方法和后期面试技巧 昨天查看3303回复33 部落用户大酋长 下面简单列举一下大家学习java的一个系统知识点的一些介绍 一.java基础部分:java基础的时候,有些知识点是非常重要 ...
- 浅谈web应用的负载均衡、集群、高可用(HA)解决方案(转)
1.熟悉几个组件 1.1.apache —— 它是Apache软件基金会的一个开放源代码的跨平台的网页服务器,属于老牌的web服务器了,支持基于Ip或者域名的虚拟主机,支持代理服务器,支持安 ...
随机推荐
- 《重构-改善既有代码的设计》学习笔记----Extract Method(提炼函数)
看见一个过长的函数或者需要一段注释才能让人理解的代码,可以考虑将这段代码放进一个独立函数中. 创造一个新的函数,根据这个函数的意图来对它命名(以它“做什么”来命名,而不是以它“怎么做”命名). 需要重 ...
- PAT 乙级 1044 火星数字 (20 分)
1044 火星数字 (20 分) 火星人是以 13 进制计数的: 地球人的 0 被火星人称为 tret. 地球人数字 1 到 12 的火星文分别为:jan, feb, mar, apr, may, j ...
- 一、新建springBoot项目
三种方式新建SpringBoot项目: 官网, myeclipse, idea 1.官方网站新建(https://start.spring.io/) 1)打开官网,选择自己需要的springBo ...
- mysql 备份命令
mysqldump --socket=/home/work/mysql/var/mysql.sock -u用户名 -p密码 -P端口 -h10.28.4.64 feedback > feedba ...
- LDAP & Implentation
LDAP: LDAP是轻量目录访问协议,英文全称是Lightweight Directory Access Protocol,一般都简称为LDAP.它是基于X.500标准的,但是简单多了并且可以根据需 ...
- Asp.NET 简易通用WebServices 附件服务
[toc] 总述: 用了很久的附件分离服务, .NET 2.0平台开始使用. 配置好服务后, 由调用端定义并管理目录级次. 调用端存储目录即可. 附件服务: 相应配置节点放入 web.confi ...
- 对象名 'dbo.__MigrationHistory' 无效 错误解决
// 在数据库上下文的构造方法里 public GewPeAppContext() : base(ConnectionStrings.GewPeAppConnectionString) { // 添加 ...
- 从零开始学习python:demo2.5
for 循环语句 1.单个for循环: s1 = 'Python'for s2 in s1: print(s2) ------------------------- Python ------- ...
- Ajax 请求请求 MVC WebAPI跨域问题;XMLHttpRequest cannot load
问题:XMLHttpRequest cannot load http://192.168.1.4:9010//api/contacts. The 'Access-Control-Allow-Origi ...
- C# 反射获取属性值、名称、类型以及集合的属性值、类型名称
实体类 class Product { public string Id { get; set; } public string Name { get; set; } public List<P ...