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(默认配置了DefaultServletJspServlet),此初始化时调用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解析相关推荐

  1. 信息学奥赛真题解析(笨鸟)

    2020年全国信息学线上测试活动_普及组_T4   笨鸟 [题目描述] 小王特别喜欢玩flappy birds,但是他比较菜,所以向大家寻求帮助,游戏规则大家都懂,横坐标+1时,点一下屏幕,纵坐标+1 ...

  2. Java程序员从笨鸟到菜鸟全部博客目录

    本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.NET/csh624366188 欢迎关注微信账号:java那些事:csh624366188.每天一篇java相关的文章 大 ...

  3. Java程序猿从笨鸟到菜鸟之(九十二)深入java虚拟机(一)——java虚拟机底层结构具体解释...

    本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 在曾经的博客里面,我们介绍了在java领域中大部分的知识点,从最基础的java最基本的语法 ...

  4. Java程序员从笨鸟到菜鸟之(序言)+全部链接

    http://blog.csdn.net/csh624366188 大学上了一年半,接触java也一年半了,虽然中间也有其他东西的学习,但是还是以java为主路线,想想这一年半,除去前半年几乎全玩了, ...

  5. Java程序员由笨鸟到菜鸟 电子版书正式发布 欢迎大家下载

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 欢迎关注 ...

  6. Java程序员从笨鸟到菜鸟之——总结和声明

    前段时间经过大约二十天的时间把javaSE的内容总结了一下,最近由于个人原因和一些乱七八糟的事情,一直没在更新,首先感谢那些一如既往支持我的朋友.最近不知道为什么,一直很懒,做东西也一直是效率很低,生 ...

  7. Java程序员从笨鸟到菜鸟之(五)java开发常用类(包装,数字处理集合等)(下)...

     本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 写在前面:由于前天项目老师建设局的项目快到验收阶段,所以,前天晚上通宵,昨天睡了大半天, ...

  8. Java程序员从笨鸟到菜鸟之(九十一)跟我学jquery(七)jquery动画大体验

    本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 最近一直感觉自己好忙,每天都浑浑噩噩的过着,转眼间,好像有好长时间没有更新笨鸟到菜鸟了.现 ...

  9. Java程序员从笨鸟到菜鸟之(一百零九)一步一步学习webservice(三)开发第一个基于XFire的webservice

    在日常开发中,常用的webservice引擎主要有Axis,axis2,Xfire以及cxf(Xfire的升级版).现在只有axis2和cxf官方有更新.今天我们先以一个比较老的引擎为例.来讲诉一下w ...

最新文章

  1. 解决PHP大文件上传问题
  2. 微软笔试题 2013暑期实习笔试题目
  3. MyBatis中提示:Invalid Bound statemnet(not found )com.
  4. java监控数据库性能_Java:GraalVM数据库流性能
  5. Eclipse 创建第一个 springboot 应用
  6. 使用jquery检查/取消选中复选框? [重复]
  7. cad怎么表示出一个孔_怎么训练出一个NB的Prophet模型
  8. java json data_java中json数据格式的处理
  9. 电脑PC端实现微信多开
  10. 国内在线查看Java源码(支持下载)
  11. 线性分类器和非线性分类器总结
  12. 金蝶KIS专业版 反过账脚本
  13. 原生Js放大镜实例(附图附讲解可直接复制研究使用,小白福利)
  14. one world,one dream
  15. 高清视频会议终端市场现状及未来发展趋势分析
  16. MySQL将字段数据自增自减
  17. 教你如何从零基础基础到深入学习UI设计
  18. 安装与配置NC产品(NC65)
  19. 手动建库:按标准快速创建MDB数据库,快速创建Arcgis数据库。
  20. SCRM和CRM有什么区别?

热门文章

  1. 使用树莓派制作的远程开门器
  2. chatGPT Access denied访问被拒绝(已解决)
  3. Kafka分区副本重分配源码分析
  4. 采集到竞品数据的10个经典方法
  5. 供给云SAAS平台企微助手再升级
  6. php echo,print,print_r,var_dum的区别
  7. 将电脑新建文本文档txt的默认编码从ANSI改为utf-8
  8. java subject类_RxJava 常见误区(一):过度使用 Subject
  9. 从功能测试进阶自动化测试涨薪7k,终究是逼了自己一把...
  10. python编写程序、实现一个数字金字塔_python实现输入任意一个大写字母生成金字塔的示例...