本文将从4个方向讲述tomcat容器
一、tomcat中四大servlet容器
二、tomcat执行请求流程解析
三、tomcat与socket/tcp/http协议关系
四、tomcat io模型解析
Tomcat重要性:
web项目都需要tomcat,其作用用于连接用户和后台,图如下:
一、Tomcat中四大servlet容器
想必大家都知道Tomcat是servlet容器,其实Tomcat内部也存在容器
1、Engine–方便管理多个Host—List<Host>
2、Host—虚拟主机,存多个Context—List<Context>
3、Context—应用—List<Wrapper>
4、Wrapper–servlet容器–List<Servlet>
问题:为什么不是Context直接管理servlet,而是用Wrapper管理?
public class Test extends HttpServlet implements SingleThreadModel {
}
a、实现单线程model,则每个请求单独使用一个servlet
b、未实现则所有请求公用一个servlet实例
写servlet方法:
package cc.zhouzhou;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class Test extends HttpServlet {
//doGet方法由tomcat调用
//HttpServletRequest实现类由tomcat实现,由RequestFacade传递连接
//RequestFacade是Request类的门面模式
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//实现方法
super.doGet(req, resp);
}
}
问题:为什么应用程序是打war包的形式?而不是jar包?
因为如果是jar包,程序不知道是当做依赖包还是应用包,无法区分。
tomcat中判断是否是war包其实是hardcode的形式判断的。
二、tomcat执行请求流程解析
根据上图讲解最后部分的步骤:
1、请求Request是:Http://localhost:8080/HelloServlet/Servletdemo
2、Adapter 在这步骤进行设置值,伪代码如下:
request.setHost(Host)
request.setContext(Context)
request.setWrapper(Wrapper)
getEngine获取阀门
3、Engine
4、HOST
5、Context
6、Wrapper servlet=wrapper.allocate();简单来说是new DemoServlet
7、FilterChain
8、最终调用servlet.service()方法
根据源代码发现最终调用的是servlet的service方法,此service方式是父类的方法,其中会判断是Get,Post,Put等请求类型,调用不同的方法
三、tomcat与socket/tcp/http协议关系
数据–Tomcat—new Request
服务器–操作系统–Tomcat应用程序
服务器A–服务器B
可靠传输–TCP协议–操作系统
数据+Ip
Linux tcp_connnect()---创建tcp连接
1、构造数据
2、创建一个tcp连接--java--tcp_connect()
3、传输数据
TCP:socket----_sys_connect—tcp_connect
socket.getInputStream
byte[]--http协议转换--request--connect
UDP:DatagramSocket 是udp
四、tomcat io模型解析
Tomcat从socket获取数据
Bio或者Nio(最简单来说,区别是速度)
BIO阻塞:一个socket对应一个线程,不是一个http请求对应一个线程,多对一
Tomcat是打破双亲委派的