参考:web
Tomcat详解(1)---Tomcat 的顶层结构及启动过程设计模式
Tomcat详解(2)---Tomcat 的生命周期管理浏览器
Tomcat详解(3)---Container 分析tomcat
Tomcat详解(4)---Pipeline-Value 管道安全
详解Servlet多线程
四张图带你了解Tomcat系统架构 总结的很好架构
一、用户点击网页内容,请求被发送到本机端口8080,被在那里监听的Coyote HTTP/1.1 Connector得到。
二、Connector把该请求交给它所在的Service的Engine来处理,并等待Engine的回应。
三、Engine得到请求localhost/test/index.jsp,匹配全部的虚拟主机Host。
四、Engine匹配到名为localhost的Host(即便匹配不到也把请求交给该Host处理,由于该Host被定义为该Engine的默认主机),名为localhost的Host得到请求/test/index.jsp,匹配它所拥有的全部的Context。Host匹配到路径为/test的Context(若是匹配不到就把该请求交给路径名为“ ”的Context去处理)。
五、path=“/test”的Context得到请求/index.jsp,在它的mapping table中寻找出对应的Servlet。Context匹配到URL PATTERN为*.jsp的Servlet,对应于JspServlet类。
六、构造HttpServletRequest对象和HttpServletResponse对象,做为参数调用JspServlet的doGet()或doPost().执行业务逻辑、数据存储等程序。
七、Context把执行完以后的HttpServletResponse对象返回给Host。
八、Host把HttpServletResponse对象返回给Engine。
九、Engine把HttpServletResponse对象返回Connector。
十、Connector把HttpServletResponse对象返回给客户Browser。
Tomcat 是Web应用服务器,是一个Servlet/JSP容器. app
Tomcat 做为Servlet容器,负责处理客户请求,把请求传送给Servlet,并将Servlet的响应传送回给客户。而Servlet是一种运行在支持 Java语言的服务器上的组件。 Servlet最多见的用途是扩展Java Web服务器功能,提供很是安全的、可移植的.jsp
一、Connecter组件
一个Connecter将在某个指定的端口上侦听客户请求,接收浏览器的发过来的 tcp 链接请求,建立一个 Request 和 Response 对象分别用于和请求端交换数据,而后会产生一个线程来处理这个请求并把产生的 Request 和 Response 对象传给处理Engine(Container中的一部分),从Engine出得到响应并返回客户。
Tomcat中有两个经典的Connector,
- 一个直接侦听来自Browser的HTTP请求,
- 另一个来自其余的WebServer请求。
- Cotote HTTP/1.1 Connector在端口8080处侦听来自客户Browser的HTTP请求,Coyote JK2 Connector在端口8009处侦听其余Web Server的Servlet/JSP请求。
Connector 最重要的功能就是接收链接请求而后分配线程让 Container 来处理这个请求,因此这必然是多线程的,多线程的处理是 Connector 设计的核心。
二、Container是容器的父接口,
该容器的设计用的是典型的责任链的设计模式,它由四个自容器组件构成,分别是Engine、Host、Context、Wrapper。这四个组件是负责关系,存在包含关系。
Tomcat 的容器等级中,Context 容器是直接管理 Servlet 在容器中的包装类 Wrapper,因此 Context 容器如何运行将直接影响 Servlet 的工做方式。一个 Context 对应一个 Web 工程,
客户端的请求直接打到tomcat,它监听端口,请求过来后,根据url等信息,肯定要将请求交给哪一个servlet去处理,而后调用那个servlet的service方法,service方法返回一个response对象,tomcat再把这个response返回给客户端。
service( HttpServletRequest req, HttpServletResponse resp)
这个方法就是判断浏览器过来的请求方式是哪一种,每种的处理方式不同,咱们经常使用的就是get,post,而且,咱们处理的方式可能有不少的内容,因此,在该方法内会将get,post等其余5种请求方式提取出来,变成单个的方法,而后咱们须要编写servlet时,就能够直接重写doGet或者doPost方法就好了,而不是重写service方法,更加有针对性。
因此在编写servlet时,继承httpServlet,只要重写两个方法,一个doGet,一个doPost,其实就是service方法会调用这两个方法中的一个(看请求方式)。
从建立到毁灭:
由下面能够看见,servlet的init方法和destroy方法,通常容器调用这两个方法之间的过程,就叫作servlet的生命周期。