zz-浅谈tomcat和servlet的关系
https://www.cnblogs.com/llsblog/p/10634099.html
本文浅谈下对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的类等等,等我学习完进行讲解,大家也可以从我推荐的书籍和文章中学到。