原文同步发表至个人博客【夜月归途】

原文链接:http://www.guitu18.com/se/java/2018-07-22/19.html

作者:夜月归途
出处:http://www.guitu18.com/
本博客中未标明转载的文章归作者夜月归途和博客园所有。
欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

Servlet生命周期和加载机制

查看Servlet3.1源码,其接口定义如下:

  1. package javax.servlet;
  2. public interface Servlet {
  3. public void init(ServletConfig config)
  4. throws ServletException;
  5. public ServletConfig getServletConfig();
  6. public void service(ServletRequest req, ServletResponse res)
  7. throws ServletException, IOException;
  8. public String getServletInfo();
  9. public void destroy();
  10. }

init(ServletConfig config);

init方法在容器启动时会被容器调用,且只会被调用一次;
调用的时机是跟Servlet的配置项'load-on-startup'有关系的;

  1. <servlet>
  2. <servlet-name>springmvcdemo</servlet-name>
  3. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  4. <init-param>
  5. <param-name>contextConfigLocation</param-name>
  6. <param-value>classpath:springmvc.xml</param-value>
  7. </init-param>
  8. <load-on-startup>1</load-on-startup>
  9. </servlet>

<load-on-startup>1</load-on-startup>:配置的值如果不小于0,那么标识容器在启动时就会加载这个Servlet,配置的值越小,加载的优先级越高;如果没有配置或者配置的值小于0时,容器会在该Servlet第一次被调用时才会被加载;不论哪种配置,init方法只会被调用一次;

init方法的参数,是容器传进去的;我们在web.xml中配置的contextConfigLocation参数,就保存在ServletConfig中;

这项参数我们不配置的话,它有默认值:WEB-INF/${ServletName}-servlet.xml,变量${ServletName}是xml中配置的'servlet-name';

getServletConfig();

getServletConfig方法用于获取ServletConfig;

service(ServletRequest req, ServletResponse res);

service方法用于具体处理一个请求;每次访问,都会执行一次,server方法内部会根据请求方式的不同,调用不同的doXXX方法;

getServletInfo();

getServletInfo方法可以获取一些Servlet相关的信息,如作者、版权等;这个方法需要自己实现,默认返回空字符串;

destroy();

destroy方法主要用于Servlet销毁时释放资源,同init一样只会被调用一次;

Servlet生命周期测试demo

  1. 新建web工程,创建三个都实现Servlet接口的ServletDemo对象;
    这里创建的分别是Servlet1,Servlet2,Servlet3,代码都是一样的只贴上Servlet1的代码;

    1. package com.guitu18.servlet;
    2.  
    3. import java.io.IOException;
    4.  
    5. import javax.servlet.Servlet;
    6. import javax.servlet.ServletConfig;
    7. import javax.servlet.ServletException;
    8. import javax.servlet.ServletRequest;
    9. import javax.servlet.ServletResponse;
    10.  
    11. public class Servlet_1 implements Servlet {
    12.  
    13. @Override
    14. public void destroy() {
    15. System.out.println("Servlet_1:destroy()执行销毁...");
    16. }
    17.  
    18. @Override
    19. public ServletConfig getServletConfig() {
    20. return null;
    21. }
    22.  
    23. @Override
    24. public String getServletInfo() {
    25. return null;
    26. }
    27.  
    28. @Override
    29. public void init(ServletConfig arg0) throws ServletException {
    30. System.out.println("Servlet_1:init()执行初始化...");
    31. }
    32.  
    33. @Override
    34. public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
    35. System.out.println("Servlet_1:service()执行中...");
    36. }
    37.  
    38. }
  2. web.xml配置如下:

    1. <servlet>
    2. <servlet-name>servlet_1</servlet-name>
    3. <servlet-class>com.guitu18.servlet.Servlet_1</servlet-class>
    4. </servlet>
    5. <servlet-mapping>
    6. <servlet-name>servlet_1</servlet-name>
    7. <url-pattern>/servlet_1</url-pattern>
    8. </servlet-mapping>
    9. <servlet>
    10. <servlet-name>servlet_2</servlet-name>
    11. <servlet-class>com.guitu18.servlet.Servlet_2</servlet-class>
    12. <load-on-startup>2</load-on-startup>
    13. </servlet>
    14. <servlet-mapping>
    15. <servlet-name>servlet_2</servlet-name>
    16. <url-pattern>*.guitu18</url-pattern>
    17. </servlet-mapping>
    18. <servlet>
    19. <servlet-name>servlet_3</servlet-name>
    20. <servlet-class>com.guitu18.servlet.Servlet_3</servlet-class>
    21. <load-on-startup>1</load-on-startup>
    22. </servlet>
    23. <servlet-mapping>
    24. <servlet-name>servlet_3</servlet-name>
    25. <url-pattern>/abc/*</url-pattern>
    26. </servlet-mapping>
    27. <servlet-mapping>
    28. <servlet-name>servlet_2</servlet-name>
    29. <url-pattern>/servlet_4</url-pattern>
    30. </servlet-mapping>

    我在xml中分别配置了这三个Servlet,配置了4个servlet-mapping,其中'/servlet2.guitu'和'/servlet4'都是指向servle_2的;
    这里就涉及到Servlet中<url-pattern>的配置方式了,一共有3种:

    1. 完全路径匹配
      以'/'开始;比如:/servlet_1
    2. 目录匹配
      以'/'开始,以'/'结束;比如:/abc/
    3. 扩展名匹配
      不能以'/'开始,要以''开始;比如:.guitu18

    为了是匹配时不产歧义,这三种匹配方式是有优先级的:
    完全路径匹配 > 目录匹配 > 扩展名匹配

  3. 启动项目:
    因为Servlet2和Servlet3都配置了<load-on-startup>项,且配置的值不小于0,所以在项目启动时,Servlet2和Servlet3就会被初始化,控制台输出:

    1. Servlet_3init()执行初始化...
    2. Servlet_2init()执行初始化...

    这里看出,Servlet3比Servlet2有限初始化,因为Servlet_3配置的<load-on-startup>的值比Servlet2小,所以优先被加载;Servlet1因为没有配置<load-on-startup>所以只有其第一次被访问时才会被加载初始化;

    访问Servlet1的地址:http://localhost:8080/servletdemo/servlet1

    1. Servlet_1init()执行初始化...
    2. Servlet_1service()执行中...

    此时Servlet_1才被初始化;

  4. Servlet对象销毁 现在关闭Tomcat服务,Servlet对象会被销毁;

    1. Servlet_2destroy()执行销毁...
    2. Servlet_3destroy()执行销毁...
    3. Servlet_1destroy()执行销毁...

    可以看出销毁的顺序和加载的顺序相同,优先被加载的也会最先被销毁;

JaveWeb学习之Servlet(一):Servlet生命周期和加载机制的更多相关文章

  1. 整理ViewController的生命周期和加载过程

    按照执行顺序排列 - initWithCoder:通过nib文件初始化时触发 - awakeFromNib:nib文件被加载的时候,会发送一个awakeFromNib的消息到nib文件中的每个对象 p ...

  2. Java Web学习总结(9)——servlet和Jsp生命周期解读

    一.servlet的工作工程 Servlet是运行在Servlet容器(有时候也叫Servlet引擎,是web服务器和应用程序服务器的一部分,用于在发送的请求和响应之上提供网络服务,解码基于MIME的 ...

  3. 面试之jsp、Servlet相关知识——生命周期, 区别等

    1.servlet生命周期 所谓生命周期,指的是servlet容器如何创建servlet实例.分配其资源.调用其方法.并销毁其实例的整个过程. 阶段一: 实例化(就是创建servlet对象,调用构造器 ...

  4. servlet反射、生命周期、接口

    什么是Servlet Servlet是JavaWeb的三大组件之一,它属于动态资源.Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,在Servlet中通常需要: l  ...

  5. Java Servlet(二):servlet配置及生命周期相关(jdk7+tomcat7+eclipse)

    该篇文章记录了Servlet配置相关用法及Servlet在Servlet容器中生命周期方法. Tomcat是一个Servlet容器: 1.Servlet容器管理了Servlet的整个生命周期,并调用s ...

  6. Servlet和JSP生命周期概述

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt374 Servlet生命周期分为三个阶段: 1,初始化阶段  调用init( ...

  7. servlet简介及生命周期

    Servlet 简介 Servlet 是什么? Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上 ...

  8. jsp当做第二个servlet request的生命周期 请求 响应 不管中间经历多少个servlet 只要最后一个serlvt执行后 则生命周期结束 request的域消失

    jsp当做第二个servlet  request的生命周期   请求 响应  不管中间经历多少个servlet 只要最后一个serlvt执行后 则生命周期结束  request的域消失

  9. java Web servlet简介及其生命周期

    Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容. 我们可 ...

随机推荐

  1. c# Winform Invoke 的用法

    在Winform中线程更新UI线程 例如:Form中有一个DataGridView,我们使用Thread查询后,更新这个表格,如果在Thread中直接更新会报错. Thread th = new Th ...

  2. java 根据某个数字,计算前后多少天的具体日期

    import java.text.ParsePosition; import java.text.SimpleDateFormat; import java.util.Calendar; import ...

  3. 关于AngularJS学习整理---核心特性

    接触.学习AngularJS已经三个多月了,随着学习的深入,有些东西刚开始不明白,现在开始慢慢明白起来.于是,开始整理这几个月的学习成果.要不又要忘了...  初学Angular,是看到慕课网大漠穷秋 ...

  4. Java作业七(2017-10-30)

    /*造人*/ public class Tman { public int id; public String name; public int age; public String city; pu ...

  5. [Swift]LeetCode434. 字符串中的单词数 | Number of Segments in a String

    Count the number of segments in a string, where a segment is defined to be a contiguous sequence of ...

  6. jquery配合.NET实现点击指定绑定数据并且能够一键下载

    最近在做培训管理系统中遇到一个问题,需求需点击绑定的数据,将指定的附件下载下来,并且是批量下载(绑定的数据非datagrid,后台拼接的绑定). 效果图如下: 大体思路: 1.jquery得到选中的绑 ...

  7. Visual Studio 2017 怎么将自动生成属性设置为旧版格式

    工具:Visual Studio 2017 1.点击工具,进入选项 2.选项窗口左侧找到C#--代码样式,点击 3.找到表达式首选项中:使用属性的表达式主体.使用索引器的表达式主体和使用访问器的表达式 ...

  8. Python内置函数(24)——frozenset

    英文文档: class frozenset([iterable]) Return a new frozenset object, optionally with elements taken from ...

  9. PrismCDN 网络的架构解析,以及低延迟、低成本的奥秘

    5 月 19.20 日,行业精英齐聚的 WebRTCon 2018 在上海举办.又拍云 PrismCDN 项目负责人凌建发在大会做了<又拍云低延时的 WebP2P 直播实践>的精彩分享. ...

  10. 死磕 java集合之HashMap源码分析

    欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. 简介 HashMap采用key/value存储结构,每个key对应唯一的value,查询和修改 ...