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.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
->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);
servlet单例模式以及servlet的请求流程的更多相关文章
- Servlet简介与Servlet和HttpServlet运行的流程
1.Servlet [1] Servlet简介 > Server + let > 意为:运行在服务器端的小程序. > Ser ...
- Servlet 服务器性能提高--->数据库请求频率控制(原创)
首先我要说下我实现这个功能接口涉及到的业务和实现的详细流程,然后会说此接口涉及到的相关技术,最后会贴出注释后的详细代码, 这个接口涉及到的是 app上咻一咻功能,咻一咻中奖的奖品一共有七类,其中四类是 ...
- Servlet、Struts2、SpringMVC执行流程
Servlet 有以下四个阶段: 1.加载和实例化 Servlet容器负责加载和实例化Servlet. 当Servlet容器启动时,或者在容器检测到需要这个Servlet来响应第一个请求时,创建Ser ...
- Servlet(五):请求转发和重定向
请求转发: 问题: 服务器在接收到浏览器的请求后,仅仅使用一个 Servlet进行请求处理,会造成不同的Servlet逻辑代码 冗余,Servlet的职责不明确. 解决: 使用请求转发. 特点: 一次 ...
- 【Servlet】JavaWeb应用的执行流程
Tomcat与Servlet简介 Tomcat Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache.S ...
- Servlet交互【重定向 与 请求分派】详解
Servlet交互 在serlvet中,需要调用另外一个资源来对浏览器的请求进行响应,两种方式实现: 调用HttpServletResponse.sendRedirect 方法实现 重定向 调用Req ...
- servlet及jsp之间的请求转发
1.servlet间的请求转发 <dependencies> <dependency> <groupId>javax.servlet</groupId> ...
- jsp当做第二个servlet request的生命周期 请求 响应 不管中间经历多少个servlet 只要最后一个serlvt执行后 则生命周期结束 request的域消失
jsp当做第二个servlet request的生命周期 请求 响应 不管中间经历多少个servlet 只要最后一个serlvt执行后 则生命周期结束 request的域消失
- Servlet单例模式(注意)
package com.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax ...
随机推荐
- golang切片的一些自问自答
你好,我是轩脉刃.这篇是关于go切片的一些问题和回答. go的切片基本上是代码中使用最多的一种数据结构了,使用这种数据结构有哪些要注意的点,这个是非常必要了解的东西.基本上,以前写的一篇博客 http ...
- 第二十三个知识点:写一个实现蒙哥马利算法的C程序
第二十三个知识点:写一个实现蒙哥马利算法的C程序 这次博客我将通过对蒙哥马利算法的一个实际的实现,来补充我们上周蒙哥马利算法的理论方面.这个用C语言实现的蒙哥马利算法,是为一个位数为64的计算机编写的 ...
- Java Web程序设计笔记 • 【第3章 JSP内置对象】
全部章节 >>>> 本章目录 3.1 JSP 内置对象简介 3.1.1 JSP 内置对象概述 3.1.2 JSP 表单处理 3.1.2 request对象 3.1.2 开发 ...
- Hadoop组件启停命令和服务链接汇总
1.启停命令 Zookeeper zkServer.sh start zkServer.sh stop/status/restart zkCli.sh -server IP:Port Hadoop(h ...
- 2021 编程语言排行榜出炉!C#年度语言奖
IEEE Spectrum 发布了 2021 年度编程语言排行榜,其中 Python 在总榜单以及其他几个分榜单中依然牢牢占据第一名的位置.另外值得关注的是微软 C# 语言,它的排行从 2020 年的 ...
- nexus私服SNAPSHOT仓库maven-metadata.xml缺失导致的Could not find artifact:***.jar
环境:maven项目,使用Nexus私服(ip:192.168.10.100),jenkins实现代码的编译和打包. 问题分析思路:在2021年元旦假期前,jenkins上的编译打包任务一直正常工作, ...
- 官网下载mysql的方法
mysql官网 http://www.mysql.com/ 方法一: (1)登陆官网 (2)把页面拉到最底部,点击Downloads(GA) 下边的MySQL Community Serv ...
- Centos下查看cpu核数
1.概念物理CPU:实际Server中插槽上的CPU个数.物理cpu数量:可以数不重复的 physical id 有几个. 2.逻辑CPULinux用户对 /proc/cpuinfo 这个文件肯定不陌 ...
- Docker_创建自定义镜像(5)
生成docker镜像有两种方式 使用已有容器生成镜像 使用dockerfile生成镜像 一.使用已有容器生成镜像 1.下载centos镜像,并创建容器 2.进入容器部署python环境 centos镜 ...
- oracle 之 EXP、IMP 使用简介
注:DOS命令行中执行exp.imp 导出导入ORACLE数据,ORACLE操作者具有相应的权限! 1.1.导出整库或当前用户:关键字:full语法:exp 用户/密码@数据库实例名 file=导出文 ...