默认连接器的UML图和流程分析

默认连接器

一、UML图:

 默认连接器的UML图和流程分析_设计制作_制造/封装

1、所有的连接器都要实现Connector接口,必须创建Request对象和Response对象,httpConnector作为默认连接器,肯定也是要实现Connector接口的,同时httpConnector. crea     te   Request方法创建了Request对象,httpConnector. createResponse方法创建了Response对象;

2、httpConnector接收到客户端请求后,解析请求参数、解析请求header信息、创建Response和Request对象如果放在Connector里面处理,势必会影响到后续其他客户端请求的及时响应,因此tomcat采取了HttpProcessor对象来进行这些后续处理,而且HttpProcessor是在单独的线程里面运行,不会卡住主线程,再有新的客户端请求到达时,会创建新的HttpProcessor对象并开启新的线程运行,这样就能保证连接器能高效及时的响应客户端请求;

3、httpConnector类维护着一个HttpProcessor的实例池,同时还有池的最小和最大个数的变量,如下:

 默认连接器的UML图和流程分析_设计制作_制造/封装

在start方法启动连接器时,会初始化minProcesso     rs   个HttpProcessor对象放到processors池子里面:

 默认连接器的UML图和流程分析_设计制作_制造/封装

创建HttpProcessor对象时,如果池子里有未使用的HttpProcessor对象,则直接从池子里面取,如果当前正在运行的HttpProcessor对象大于最大个数,则丢掉请求不处理,否则创建一个HttpProcessor对象并放到池子里,然后返回这个HttpProcessor对象:

 默认连接器的UML图和流程分析_设计制作_制造/封装

 默认连接器的UML图和流程分析_设计制作_制造/封装

 默认连接器的UML图和流程分析_设计制作_制造/封装

1、Request对象封装了客户端的请求信息,Response对象封装了返回给客户端的响应信息;

2、HttpReques     tI   mpl类是Request接口的实现类,cookies数组成员变量存储了请求的cookie信息,headers变量是一个hashMap类型,存储了请求head信息的键值对,pa     ram   eters存储了相关参数的键值对,这是一个ParameterMap类型的hash表类型,比hashMap封装扩展了锁定属性;

3、为避免servlet程序员拿到request对象,因为权限过大而造成安全问题,这里采用了门面模式封装了一个HttpRequestFacade对象,其所有功能都委托给Request对象实现,但是HttpRequestFacade提供的接口有限,将其提供给servlet程序员不会造成安全问题;

4、同样的,HttpResponseImpl类是Response接口的实现类,HttpResponseFacade作为HttpResponseImpl的门面对象提供给servlet程序员使用,从而很好的解决了安全性问题;

二、流程分析:

 默认连接器的UML图和流程分析_设计制作_制造/封装

1、httpConnector连接器实现了Runnable接口,也就是说他是运行在一个线程里面的,run方法作为线程的运行方法,首先调用ServerSocketFactory.createSocket创建一个ServerSocket对象,并且默认在8080端口上监听,然后调用ServerSocket.accept在8080端口等待客户端请求并阻塞线程;

2、如果有客户端连接请求到达,则httpConnector从accept处返回,然后调用CreateHttpProcessor创建HttpProcessor对象;

3、在创建HttpProcessor对象时,在HttpProcessor构造函数里面创建HttpRequest对象和HttpResponse对象;

4、httpConnector在调用CreateHttpProcessor后,会将服务器与客户端连接的socket对象赋值给HttpProcessor对象,然后调用HttpProcessor.start方法,由于HttpProcessor也实现了Runnable接口,因此在start方法里面就将HttpProcessor放到线程里运行;

5、HttpProcessor线程的run方法里面,首先获取刚才赋值的socket对象(如果socket为null则会阻塞到socket被赋值),然后对request请求调用parseConnec  TI on, parseRequest, parseHeaders解析请求信息并设置request的成员变量;

6、最后将request和response对象传递给Cont     ai   ner.invoke方法,将后续的请求处理交给Container容器处理;

56
148
0
69

相关资讯

  1. 1、《红警·坦克4D》改版新消息跨服军团战开启3465
  2. 2、《飞刀又见飞刀》将于7.14登陆APPStore4096
  3. 3、不孤单《口袋妖怪复刻》双十一双倍掉落全民狂欢4542
  4. 4、《把妹大作战》8月11日最强女帝来袭576
  5. 5、金箱免费领!《死神觉醒》瞬开新角佐马利1241
  6. 6、蓝港《黎明之光》手游飞行副本完全体即将问世4503
  7. 7、《指上弹兵》百万红包送现金新春活动精彩不停1976
  8. 8、百炼成仙手游5月21日内测开启新CG莫名感动928
  9. 9、《大秦帝国》自由交易玩法铸就你的商业帝国801
  10. 10、《风暴乱斗》要搬家?主城场景大变样!4805
全部评论(0)
我也有话说
0
收藏
点赞
顶部