1. 1、web项目执行属性

      1. 启动web项目后,web容器首先回去找web.xml文件,读取这个文件。

      2. 容器会创建一个 ServletContext ( servlet 上下文),整个 web 项目的所有部分都将共享这个上下文。

      3. 容器将 转换为键值对,并交给 servletContext(),<context-pram>使用上下文初始化参数

      4. 容器创建 中的类实例,创建监听器。

      5. 容器加载filter,创建过滤器, 要注意对应的filter-mapping一定要放在filter的后面。依赖servlet。Servlet过滤器和Servlet十分相似,但具有拦截浏览器请求的功能。创建过滤器链,满足业务需求。

      6. 拦截器。

      7. 容器加载servlet,加载顺序按照 Load-on-startup 来执行,<load-on-startup>1</load-on-startup><servlet>

因此它的完整加载顺序就是 :ServletContext -> context-param -> listener-> filter -> servlet

不过有一点需要注意的是: spring容器的加载要在servlet之后,因此在有些过滤器当中需要提前用到spring bean的时候,就需要改成 Listener 的方式

org.springframework.web.context.ContextLoaderListener

ContextLoaderListener的作用就是启动Web容器时,自动装配ApplicationContext的配置信息。因为它实现了ServletContextListener这个接口,在web.xml配置这个监听器,启动容器时,就会默认执行它实现的方法。

容器监听器ServletContextListener 是 ServletContext 的监听者,如果 ServletContext 发生变化,如服务器启动时 ServletContext 被创建,服务器关闭时 ServletContext 将要被销毁。

要求每次访问action都无需加载新的xml文件,利用框架的监听器实现只在服务器启动时加载一次xml配置,用于提高性能。

2.servlet的运行过程:

1.浏览器发出请求,被web容器获取到 
2.Web服务器首先检查是否已经装载并创建了该Servlet的实例对象。如果是,则直接执行第④步,否则,执行第②步。 
3.装载并创建该Servlet的一个实例对象,调用Servlet实例对象的init()方法。 
4.创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去。 
5.WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法。

一般情况,servlet是在被请求的时候才去创建的,但是当添加时,就会在初始化的时候创建它,利用这点特性,我们可以初始化创建数据库等等。

使用servlet时,一般都是继承httpServlet,然后分别实现doGet或者doPost方法,但是在这里面要注意的是,这servlet并不是线程安全的,多线程单实例执行的,当并发访问同一个资源的话,就有可能引发线程安全问题,

servlet的config对象:

ServletConfig是Servlet的一个配置对象. 每一个servlet都有一个对应的ServletCofnig。
ServletConfig是由web服务器创建的,它通过Servlet的init方法传递到了Sevlet中.

1.可以获取Servlet的名称   getServletName();---web.xml文件中的<servlet-name>的值.
2.可以获取初始化参数,获取application内容。
    getInitParameter(String name);   根据name获取value,(等于this.getServletConfig().getInitParameter(name))
    getIniteParameterNames();  获取所有的name值,它返回的是一个Enumeration.

3.可以获取ServletContext上下文对象,即application对象。

getServletContext().getInitParameter("param0") = this.getServletConfig().getServletContext().

4.在Servlet中要获取ServletConfig对象,只需要直接调用getServletConfig()就可以。(前三个是ServletConfig方法,后一个是Servlet方法包含,init.service,destory)

5.继承关系

HttpServlet extends GenericServlet,

GenericServlet implements Servlet, ServletConfig, Serializable

Servlet的生命周期可以分为四个阶段,即装载类及创建实例阶段、初始化阶段、服务阶段和实例销毁阶段。

  1、初始化阶段  调用init()方法。(单线程)

  2、响应客户请求阶段。调用service()方法,由service()方法根据提交的方式选择执行doGet()或者doPost()方法(多线程)

  3、终止阶段  调用destroy()方法

3.异常情况

一旦ServletException抛出,Web服务器不会将客户端请求交给该Servlet实例来处理,而是报告初始化失败异常信息给客户端,该Servlet实例将被从内存中销毁。

如果继承了HttpServlet没有实现任何的doXxx方法或者重新service方法。则会抛出一个异常

 

Servlet启动运行顺序的更多相关文章

  1. delphi软件启动的顺序解密。

    运行顺序 1.主窗体的oncreate -- onshow ---- onActivate ---- onResize --- 然后继续走,这个时候主窗体已经显示出来了,猜想delphi的思路是先让主 ...

  2. 老李推荐:第5章5节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 获取系统服务引用

    老李推荐:第5章5节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 获取系统服务引用   上一节我们描述了monkey的命令处理入口函数run是如何调用optionP ...

  3. Unity3D中组件事件函数的运行顺序

    事件函数的运行顺序 Unity 脚本中有很多按预设顺序以脚本身份执行的事件函数. 其执行顺序例如以下: 载入第一个场景 启动场景时调用这些函数(为场景中的每一个对象调用一次). Awake: 始终在调 ...

  4. shell学习三十八天----运行顺序和eval

    运行顺序和eval shell从标准输入或脚本中读取的每一行称为管道,它包括了一个或多个命令,这些命令被一个或多个管道字符(|)隔开. 其实嗨哟非常多特殊符号可用来切割单个的命令:分号(;),管道(| ...

  5. spring boot中servlet启动原理

    启动过程及原理 1 spring boot 应用启动运行run方法 StopWatch stopWatch = new StopWatch(); stopWatch.start(); Configur ...

  6. cad.net IExtensionApplication接口的妙用 分开写"启动运行"函数

    cad提供的 IExtensionApplication 接口 是不能实现一次以上的,那么这给编写代码带来了一种不好的情况是,每次都要去修改实现这个接口的类, 如果是一个小的测试功能,你又要去动前面的 ...

  7. RocketMQ详解(三)启动运行原理

    专题目录 RocketMQ详解(一)原理概览 RocketMQ详解(二)安装使用详解 RocketMQ详解(三)启动运行原理 RocketMQ详解(四)核心设计原理 RocketMQ详解(五)总结提高 ...

  8. load-on-startup元素:控制Servlet启动优先级

    load-on-startup 是 web.xml 中的一个节点,是 servlet 元素的子元素,用来标记 Servlet 容器启动时是否初始化当前 Servlet,以及当前 Servlet 的初始 ...

  9. Java类的基本运行顺序是怎样

    我们以下面的类来说明一个基本的 Java 类的运行顺序: public class Demo{ private String name; private int age; public Demo(){ ...

随机推荐

  1. Vijos1655 - 萌萌的糖果博弈

    Portal Description 两人轮流操作两堆初始数量分别为\(a,b(a,b\leq2^{127})\)的石子.每人每次进行如下操作: 取走一堆石子,并将另一堆分成两个非零堆. 如果另一堆只 ...

  2. 2017"百度之星"程序设计大赛 - 初赛(B)度度熊的交易计划

    n个村庄m条带权路,权值为花费,村庄可以造东西卖东西,造完东西可以换地方卖,给出每个村庄造东西花费a和最多个数b.卖东西价值c和最多个数d,求最大收益. 裸的费用流.然而还WA了一发.很好. 建源向每 ...

  3. python学习之-- redis模块基本介绍

    数据缓存系统: 1:mongodb:是直接持久化,直接存储于硬盘的缓存系统 2:redis: 半持久化,存储于内存和硬盘 3:memcache:数据只能存储在内存里的缓存系统关于memcache 学习 ...

  4. eclipse 修改Java代码 不用重新启动tomcat

    例子: 1.在tomcat server.xml文件配置加上这句话: <Context debug="0" docBase="C:\Users\admin\Desk ...

  5. 从Java代码到字节码

    http://www.importnew.com/13107.html http://blog.csdn.net/dc_726/article/details/7944154/ http://www. ...

  6. javascript实现 京东淘宝等商城的商品图片大图预览功能(图片放大器)

      在京东和淘宝等购买东西的时候,我们会经常预览左侧商品展示图片,把鼠标放到原图,右侧就会有个大图显示出细节.本文将带领大家写一个这样简单的功能! 一.实现原理 当鼠标移入某一图片内部时,图片上部会出 ...

  7. C# 错误!!容量超出了最大容量。参数名: capacity 这个是什么问题呢?

    C# 错误!!容量超出了最大容量.参数名: capacity 这个是什么问题呢?   对于这个问题我纠结了好久老是报错误,报这个错误的原因是应为我加了皮肤的控件,在没有加皮肤控件的时候没有这个错误, ...

  8. kvm虚拟化学习笔记(三)之windows kvm虚拟机安装

    KVM虚拟化学习笔记系列文章列表----------------------------------------kvm虚拟化学习笔记(一)之kvm虚拟化环境安装http://koumm.blog.51 ...

  9. 【Nginx】如何建立新连接

    处理新连接事件的回调函数是ngx_event_accept,原型如下: void ngx_event_accept(ngx_event_t *ev) 具体流程如下: 1)首先调用accept方法试图建 ...

  10. 一个重绘MFC的文件传输client

     一个重绘MFC的文件传输client,TCP/IP协议的文件传输client(支持上传.下载.续传.管理等功能,本处仅仅选择了上传功能).从用户视觉上看,肯定比原生MFC界面要有感觉,啥也不说了 ...