客户端
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。。。。。。
学习的最高境界:知其然并知其所以然