tomcat 架构、源码学习(一)
阅读:how tomcat works笔记
?
1. 一个简单的server服务器。
通过socket实现。
ServerSocket server = new ServerSocket(int , int , InetAddress );
Socket socket = server.accept();
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
????? ...
?
2.解析http请求,获得uri。从中得到ServletName。
3.通过ClassLoader查找并导入相应的Servlet。并实例化
??????? java classloader原理初探
4.包装Request,Response为RequestFacade,ResponseFacade,并在调用相应Servlet的service方法时传入这2个对象。
??????? Facade模式。
5.tomcat中对错误信息处理的国际化处理。每一个包下对应一个StringManager对象,读取该包下的LocalStirngs.properties文件。
?????? StringManager:单例,内部以HashTable为数据结构,key为包名。
???????????????????????????? .getManager(packegeName);
6.Tomcat组件:(粗)
?????? 连接器/容器(web容器、应用服务器)
?????? 3个模块:Connector、Startup、Core
??????????????? Startup:bootstrap,用来启动应用
??????????????? Connector:分为五组。
????????????????????????????? 连接器和它的支撑类<处理类>(HttpConnector和HttpProcessor)。
????????????????????????????? HttpRequest及其辅助类。
????????????????????????????? HttpResponse及其辅助类。
????????????????????????????? Facade包装类(RequestFacade,ResponseFacade)。
????????????????????????????? Constant类。
???????????????? Core:分为2组。
??????????????????????????? ServletProcessor(处理Servlet动态数据请求)。
??????????????????????????? StaticResourceProcessor(处理服务器静态资源)。
?????????????????????? 猜想:正因为有了这两个分支,才使得tomcat可以通过配置集成到其他web服务器中,使用其静态资源处理能力。而tomcat专注于动态应用的处理。
7.解析Http请求。(难点)<也是性能调节之处>
?????????? 从获得的socket中解析出requestLine、headers、cookies、parameters;
?????????? 几个步骤:1.获取socket的输入流。
????????????????????????? 2.解析请求行(method uri protocol)。
????????????????????????? 3.解析头部(name:value)<cookie:name=value;name=value;>。
????????????????????????? 4.解析cookie,jsessionid。
????????????????????????? 5.获取参数,查询字符串中即(?userName=tarzan&password=pwd),以及请求内容中。
8.tomcat连接器:(可插拔的)有coyote,mod_jk, mod_jk2, mod_webapp.
?????????? 满足条件:1.实现org.apache.catalina.Connector接口。
????????????????????????? 2.必须创建请求对象,该对象要实现org.apache.catalina.Request接口。
????????????????????????? 3.必须创建响应对象,该对象要实现org.apache.catalina.Response接口。
问题1.字节数值代替字符串有什么好处?
????? 2.对象池,连接池。
HTTP 1.1新特性
????? 1.持久连接。请求头部中connection:keep-alive;
????? 2.块编码。<4\r\n abcd 0\r\n(结束)>
????? 3.状态100(持续状态)的使用。<轮询请求发送>
9.connector,container,processor。
?
?