servlet的请求流程

客户端 

         TomCat服务器

      

               

                <content docBase="/autoumatic/javaWeb" path="day1"/>//注意 Server.xml中content是可以允许存在多个  但是path不允许重复

                <content docBase="/autoumatic/javaWeb" path="day2"/>//每一个都是一个单独的项目

                <content docBase="/autoumatic/javaWeb" path="day3"/>              

                

                web.xml

<servlet>

<servlet-name>helloworld</servlet-name>

<servlet-class>helloworld01.helloworldServlet</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>helloworld</servlet-name>

<url-pattern>/hello</url-pattern>

</servlet-mapping>

                                               

                javaWeb程序代码

                创建对象  init初始化  service方法 destroy销毁方法

流程:

   客户端第一次请求:

          http://localhost:8080/day1/hello

          创建对象 init初始化 service方法

   服务端第一次响应:

          首先解析上下文路径:/day1和资源路径/hello

             然后解析Server.xml文件,获取所有的content(在以后的部署当中有可能存在多个content),再判断content元素中的path值为day1,接着再找docBase的值 寻找当前访问的是哪个javaweb项目

                然后找到对应的项目 在当前项目中找到WEB—INF目录 读取web.xml文件,获取所有servlet-mapping下的url-pattern是否存在当前的资源路径/hello,找不到返回404 找到继续往下

                   然后根据当前servlet-mapping下的url-pattern找到对应servlet-name的值,接着查找属于哪个servlet。

                      然后根据找到的servlet 找到对应的servlet-class的值 项目的全限定名称 

                          然后项目的全限定名称 通过反射调用servlet中的无参数构造器创建对象 Servlet obj=Class.forname("helloworld01.helloworldServlet") 

                             然后tomcat容器创建servletConfig对象,在使用servlet对象调用init方法  obj.init(servletConfig);

                                然后创建request和response对象 在使用servlet对象调用service方法 obj.service(request,response);

                                   最后在service方法中返回对客户端的响应信息

                                   

    客户端非第一次请求:

         只有调用service方法

         首先解析上下文路径:/day1和资源路径/hello

             然后解析Server.xml文件,获取所有的content(在以后的部署当中有可能存在多个content),再判断content元素中的path值为day1,接着再找docBase的值 寻找当前访问的是哪个javaweb项目

                然后找到对应的项目 在当前项目中找到WEB—INF目录 读取web.xml文件,获取所有servlet-mapping下的url-pattern是否存在当前的资源路径/hello,找不到返回404 找到继续往下

                   然后根据当前servlet-mapping下的url-pattern找到对应servlet-name的值,接着查找属于哪个servlet。

                      然后根据找到的servlet 找到对应的servlet-class的值 项目的全限定名称  

                         因为servlet对象属于单例,不会再创建对象和初始化                                

                         然后创建request和response对象 在使用servlet对象调用service方法 obj.service(request,response);

                         注意:只创建一次servlet对象和初始化  然而请求不只有一个,问题是不同的请求 所使用的servlet对象是同一个对象吗?

                         第二次请求  会再创建一个servlet对象?  不会的,

                         服务器中存在一个实例缓存池,第一次创建servlet对象后 servlet对象被缓存在了实例缓存池中了,每次请求的时候  servlet对象在缓存池中获取

                            最后在service方法中返回对客户端的响应信息。

                            

问题:分析的请求 为第一次和非第一次 但是你是怎么区分第一次和第二次或者第三次。。。。  实力缓存池之前是没有的  怎么突然就有了一个实例缓存池了呢?

每一个servlet在第一次请求的时候,都会在实例缓存池中创建一个对象,以map的形式 key--value的形式存在,key(String) servlet全限定名称  value(Servlet) 就是servlet对象

 

每一个servlet在非第一次请求的时候,首先会去实例缓存池中去找 ,是否存对应的servlet对象  有 则为非第一次请求,就会使用存在的对象,如果没有则为第一次请求 首次创建对应的servlet对象并使用对象。

 

创建helloworldServlet对象。。。。

初始化

servelet。。。。。。

 

创建helloworldServlet对象s。。。。

初始化s

servelets。。。。。。               

 

学习的最高境界:知其然并知其所以然

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值