servlet单例模式以及servlet的请求流程

目录

 

一、servlet 单例模式:

 

 二、servlet的请求流程:

★ 流程:

★ 详细过程如下:


 

 

一、servlet 单例模式:

tomcat服务器,通过Java的反射机制来自动调用servlet的init、service过程中,利用了反射机制,在创建servlet对象之前,先在以map为数据结构的cache缓存池中,判断是否已经存在servlet对象

-------存在直接使用缓存池的servlet对象,不存在才创建一个servlet对象,然后添加进servlet的缓存池单例的原理

--------然后判断是利用map的key 是否相同,其中key就是servlet 的全限定名称的别名(String),value是servlet的全限定名称。

 


 

 

 二、servlet的请求流程:

流程

发送请求 -》②域名解析 -》③tomcat 服务器解析请求上下文、资源名

-》④上下文的匹配【server.xml文件的上下文元素<Context>的path,匹配上之后,读取该<Context/>元素docBase属性值当前访问的Web项目的根路径

-》⑤资源名的匹配【Context的属性docBase值--->找到当前项目的根路径,读取项目根路径下的web.xml文件,在web.xml文件中匹配规则元素<url-pattern>】,找不到(404)找到了就获取到Servlet类的全限定名

-》⑥使用servlet对象【判断Servlet缓存池是否已经存在(全限定名为**)servlet对象,不存在(第一次请求),创建(全限定名为**) servlet对象并存储到缓存池,存在,直接使用该servlet对象

-》⑦ 初始化操作【Tomcat-web容器创建servlet配置对象ServletConfig,并调用init方法

-》⑧创建请求和响应对象并在service方法处理请求【web容器创建请求和响应对象ServletRequest和ServletResponse 对象调用service方法处理请求和做出响应

 


★ 详细过程如下:

1、浏览器发送请求http://localhost:8080/day2/hello

2、DNS域名解析【本地host文件进行域名解析,找不到,再通过域名解析服务器进行解析】

3、Tomcat 服务器进行解析请求/day2/hello

   上下文路径:/day2

   资源名称:/hello

4、首先进行上下文路径的匹配:

① 解析Tomcat根/conf/server.xml文件,获取所有的<Context/>元素,遍历匹配找到path属性为/day2的元素。

② 再读取该<Context/>元素docBase属性值【当前访问的Web项目的根路径

5、其次进行资源名的匹配:

从该Web项目的根路径/WEB-INF 下找到web.xml 文件,读取该web.xml 文件,获取所有的<url-pattern>元素,遍历匹配找到<url-pattern>的文本内容是/hello的:

  • 找不到:404
  • 找到了:-> 6

6然后便找到当前的Servlet 的全限定名:com.shan.hello.HelloServlet

7、从Servlet的实例缓冲池中去获取全限定名为com.shan.hello.HelloServlet的对象:[缓冲池使用map数据结构]

 Map<String, Servlet> cache = …;
 Servlet obj = cache.get("com.shan.hello.HelloServlet");
 if(obj == null){
      //第一个次请求:使用反射创建对象……->8
 }else{
      //不是第一次请求,使用已经Servlet实例缓冲池中已经存在的Servlet对象…->10
 }

 

8、使用反射创建Servlet对象并存储到缓存池中,供下一次请求使用

Servlet obj = Class.forName("com.shan.hello.HelloServlet").newInstance();
cache.put("com.shan.hello.HelloServlet", obj);

 

9、初始化:Tomcat-web容器创建servlet配置对象ServletConfig,并调用init方法,完成初始化操作。

obj.init(config);

 

10、web容器创建请求和响应对象ServletRequest和ServletResponse 对象,并调用service方法处理请求,service方法中对当前请求的客户端做出响应

obj.service(req, resp);

 

posted @ 2022-02-02 13:52  一乐乐  阅读(207)  评论(0编辑  收藏  举报