笨鸟之Serlvet解析
Web是当今主流的互联网Web技术,而Servlet是JavaWeb的基础核心。按照自己的理解粗略的记录下了概要内容,以共同学习!
一,以我们所熟悉的Tomcat为例,记录下容器加载的原理知识点。
1,启动Tomcat --> StandardServer ---> StandardService ---> StandardEngine(引擎) --->StandardHost--->StandardContext ---> ContextConfig ---> Connector ---> MapperListener 。
2,一个Web应用就对应一个Context,就创建一个StandardContext,即通常所说的Context容器,也就是Servlet运行时的容器。
3,启动Tomcat后调用Tomcat类的start(),因为Tomcat是基于观察者模式设计的,所有的类都继承自Lifecycle接口,它管理着整个容器的生命周期,所有容器的修改和状态的改变都会通知注册的观察者(Listener),所以当创建StandardContext 调用init()时,就出发初始化很重要的配置ContextConfig,这个类负责整个Web工程的解析工作,最终将Context容器添加到Host容器当中。
4,下面就来说说负责整个Web工程解析工作的类ContextConfig。打开源码org.apache.catalina.startup.ContextConfig就可以看到:
· (1) 调用inti()创建用与解析配置文件的contextDigester对象。接下来就是解析context.xml和Host的一些配置文件了,然后设置Context的docBase;
(2) 调用startInteral()来初始化context内部的一些组件,这个类比较复杂,主要包括以下几个部分:
a,创建读取文件资源的对象
b,创建classLoader对象
c,设置应用的工作目录
d,启动相关的辅助类,例如logger等
e,修改启动状态,此时肯定要通知注册的监听者
f ,子容器的初始化工作,为servlet容器设置参数(ServletMapping)到Context容器中,并初始化load-on-startup的Servlet(默认配置了DefaultServlet和JspServlet),此初始化时调用inti(),设置了ServletConfig,包含了Servlet本身的参数和容器的参数。
(3) 如何启动Web应用呢?调用configureStart(),其实初始化web应用主要就是解析web.xml,web.xml是Web应用的入口。
在web.xml中配置的Servlet对象、Filter和Listener等都是此时初始化的。
5,在Context容器完成对Web应用的初始化后,容器(Servlet)的引擎StandardEngine会在后台启动一个线程来处理一些定时的操作或监控等。
6,线程启动后,就根据Http请求的url根据MapperListener来分配Servlet容器(ServletContext)。此时问题来?为什么能根据url就能准确的找到相应的Servlet容器呢?这种映射工作专门有个类org.apchae.tomcat.util.Mapper在Http请求request到达Container容器之前,就根据Host和contextpath设置到了mapperData属性中了,当request到container容器时就对应上。
二,Servlet的总结:
1,Servlet来就是普通的java类,只不过它需要在Servlet容器中才能运行,它是个组件供Servlet引擎调用的。
2,了解Serlvet的结构图:
(1) 两个接口Servlet(管理者Servlet的生命周期)和ServletConfig(管理着Servlet和Servlet容器(ServletContext)的参数)。
在ContextConfig.startInteral()初始化Context的Servlet的组件时就设置了ServletConfig。
(2) Servlet的生命周期:
init(ServletConfig servletConfig) --- 只执行一次,初始化时servlet引擎将servletConfig对象传递进来。
service(ServletRequest,ServletResponse) --- 在init()执行完之后才会执行。
在这个方法中HttpServlet中的service()分配Http请求,doGet、doPost、doPut、doDeleted、doHead等7种请求方式。
destroy() --- 从容器中移除Servlet组件。
另: getServletConfig()返回init(ServletConfig servletConfig)中的servletConfig对象。
3,GenericServlet和HttpServlet好像作用重合了? 其实HttpServlet主要是负责Http请求的serlvet。
另外GenericServlet中有重载init()方法的作用? 在有参的init(ServletConfig servletConfig)中调用了init(),方便子类的重写。
4,处理Http请求需要主要几个字段:Last-Modified和If-Modified-Since
在这里有两个HTTP字段需要注意,一个是响应实体首部Last-Modified,表示Servlet的修改时间;一个是请求头部,If-Modified-Since,如果资源在指定的时间之后没有修改过,那么表示缓存有效,可以直接使用缓存。如果HttpServlet.getLastModified()返回-1表示没有缓存。如果返回正数且比If-Modified-Since要新,表示缓存失效了,否则返回304表示用缓存。
笨鸟之Serlvet解析相关推荐
- 信息学奥赛真题解析(笨鸟)
2020年全国信息学线上测试活动_普及组_T4 笨鸟 [题目描述] 小王特别喜欢玩flappy birds,但是他比较菜,所以向大家寻求帮助,游戏规则大家都懂,横坐标+1时,点一下屏幕,纵坐标+1 ...
- Java程序员从笨鸟到菜鸟全部博客目录
本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.NET/csh624366188 欢迎关注微信账号:java那些事:csh624366188.每天一篇java相关的文章 大 ...
- Java程序猿从笨鸟到菜鸟之(九十二)深入java虚拟机(一)——java虚拟机底层结构具体解释...
本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 在曾经的博客里面,我们介绍了在java领域中大部分的知识点,从最基础的java最基本的语法 ...
- Java程序员从笨鸟到菜鸟之(序言)+全部链接
http://blog.csdn.net/csh624366188 大学上了一年半,接触java也一年半了,虽然中间也有其他东西的学习,但是还是以java为主路线,想想这一年半,除去前半年几乎全玩了, ...
- Java程序员由笨鸟到菜鸟 电子版书正式发布 欢迎大家下载
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 欢迎关注 ...
- Java程序员从笨鸟到菜鸟之——总结和声明
前段时间经过大约二十天的时间把javaSE的内容总结了一下,最近由于个人原因和一些乱七八糟的事情,一直没在更新,首先感谢那些一如既往支持我的朋友.最近不知道为什么,一直很懒,做东西也一直是效率很低,生 ...
- Java程序员从笨鸟到菜鸟之(五)java开发常用类(包装,数字处理集合等)(下)...
本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 写在前面:由于前天项目老师建设局的项目快到验收阶段,所以,前天晚上通宵,昨天睡了大半天, ...
- Java程序员从笨鸟到菜鸟之(九十一)跟我学jquery(七)jquery动画大体验
本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 最近一直感觉自己好忙,每天都浑浑噩噩的过着,转眼间,好像有好长时间没有更新笨鸟到菜鸟了.现 ...
- Java程序员从笨鸟到菜鸟之(一百零九)一步一步学习webservice(三)开发第一个基于XFire的webservice
在日常开发中,常用的webservice引擎主要有Axis,axis2,Xfire以及cxf(Xfire的升级版).现在只有axis2和cxf官方有更新.今天我们先以一个比较老的引擎为例.来讲诉一下w ...
最新文章
- 解决PHP大文件上传问题
- 微软笔试题 2013暑期实习笔试题目
- MyBatis中提示:Invalid Bound statemnet(not found )com.
- java监控数据库性能_Java:GraalVM数据库流性能
- Eclipse 创建第一个 springboot 应用
- 使用jquery检查/取消选中复选框? [重复]
- cad怎么表示出一个孔_怎么训练出一个NB的Prophet模型
- java json data_java中json数据格式的处理
- 电脑PC端实现微信多开
- 国内在线查看Java源码(支持下载)
- 线性分类器和非线性分类器总结
- 金蝶KIS专业版 反过账脚本
- 原生Js放大镜实例(附图附讲解可直接复制研究使用,小白福利)
- one world,one dream
- 高清视频会议终端市场现状及未来发展趋势分析
- MySQL将字段数据自增自减
- 教你如何从零基础基础到深入学习UI设计
- 安装与配置NC产品(NC65)
- 手动建库:按标准快速创建MDB数据库,快速创建Arcgis数据库。
- SCRM和CRM有什么区别?
热门文章
- 使用树莓派制作的远程开门器
- chatGPT Access denied访问被拒绝(已解决)
- Kafka分区副本重分配源码分析
- 采集到竞品数据的10个经典方法
- 供给云SAAS平台企微助手再升级
- php echo,print,print_r,var_dum的区别
- 将电脑新建文本文档txt的默认编码从ANSI改为utf-8
- java subject类_RxJava 常见误区(一):过度使用 Subject
- 从功能测试进阶自动化测试涨薪7k,终究是逼了自己一把...
- python编写程序、实现一个数字金字塔_python实现输入任意一个大写字母生成金字塔的示例...