Tomcat即是一个web容器
我认为这个容器要做的主要就是两件事:
(1)监听端口 (2)添加一个个的servlet对象
比如在开发每个web项目的时候 —> web.xml文件 —>标签 —>根据这些标签进行解析创建对象—>JVM —>内存模型—>最大的大小—>大小不够用—>垃圾回收—>GC—>CPU—>垃圾回收线程。。。。。
手写一个小型的tomcat
class Tomcat {
//java.net (1)监听端口 ---> source verify
ServerSocket server = ServerSocket(8080);
//client connect
Socket socket = server.accpet();
//web服务 client server 交互(io交互)
socket.getIo();
//servelt中已经拥有了request 和response
//Tomcat 源码中读取每个web项目里的web.xml,解析servlet标签,创建一个个servlet对象
//(2)添加每个web项目中的servlet
list.add(servlet);
}
分析源码来验证是不是这么做的
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
在tomcat的server.xml里有这么一个标签,很明显他是一个监听端口的标签,我们猜测tomcat的源码是解析xml里每一个标签为一个对象。所以再源码中找有没有Connector这个类。很快,我们找到了,追踪这个类的主要过程如下:
Connector.initInternal();
protocolHandler.init();
AbstracgProtocol.init();
endPoint.init();
bind(); —>这个方法是重点,绑定?自然就是绑定端口对吧!
我们可以看到这个方法里有多中绑定方法J(java) 、IoEndpoint.bind()–>java传统io、BIO、NIO;
serverSocket = serverSocketFactory.createSocket(getPort(),getBackLog());
//用工厂模式创建socket连接;
讲解context标签
类Context.class ---->表示一个web项目吗?
ContextConfig —>用来解析web.xml吗?
我们在ContextConfig 可以看到这么一行代码 public static final String WEB_XML_LOCATION ="/WEB-INFO/web.xml"。证实了是!
if(ok){
configureContext(web.xml);
}
for(ServletDef servlet : webxml.getServlets().values()){
Wrapper wrapper = context.createWrapper();
//Wraper 类对servlet进行了封装
........
}
context标签的使用,可以定义一个war包的路径,可以不用放在tomcat里面了!
list.add(servlet),源码是这么做的吗?
list.add(servlet);—>要去寻找 Context ContextConfig?
Tomcat源码的设计加载servlets一定是以web项目(Context)为单位的。
StandardContext.method() ---- list.add(wrappers);?
从上图源码可以看出,的确是这么做的!附tomcat原理架构图