一 、生命周期

servlet 声明周期可以分四个阶段:

  • 类装载过程
  • init() 初始化过程
  • service() 服务过程,选择doGet \ doPost
  • destroy() 销毁过程

servlet接口如下

public interface Servlet {
void init(ServletConfig var1) throws ServletException; ServletConfig getServletConfig(); void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException; String getServletInfo(); void destroy();
}

1、创建servlet实例

时期:默认是第一个请求该servlet的时候就初始化此servlet,该servlet实例便一直存在,直到长

​ 时间不调用、服务器关闭才销毁 或者 类文件更新后重新载入 。也可手动设置:在服务器

​ 启动时便加载此servlet 。

<servlet>
<servlet-name>Xxx</servlet-name>
<servlet-class>com.lingz.Xxx</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

2、init()初始化

​ servlet实例一创建出来,便调用init(ServletConfig var1) 进行初始化, 其中的ServletConfig参数对象携带了该servlet的配置信息,比如初始化参数,此ServletConfig参数由服务器创建。

(1)那么,如何配置 servlet的初始化参数?

<servlet>
<servlet-name>Xxx</servlet-name>
<servlet-class>com.lingz.Xxx</servlet-class>
<!--两个自定义的初始化参数-->
<init-param>
<param-name>value1</param-name>
<param-value>key1</param-value>
</init-param>
  <init-param>
<param-name>value2</param-name>
<param-value>key2</param-value>
</init-param>
</servlet>

​ 通过这种配置方式,就不需要在Servlet中添加、修改,直接修改xml文件即可。

(2)如何读取上面的参数呢?

​ 通过 ServletConfig类提供的 getInitParameter(String name) 获取初始化参数

public interface ServletConfig {
String getServletName(); ServletContext getServletContext(); String getInitParameter(String var1); Enumeration<String> getInitParameterNames();
}

(3)init(ServletConfig var1) 在Servlet生命周期中,只执行一次。并且是单线程执行,不需要担心多线程安全。

3、service() 服务过程

(1)请求发到对应的Servlet,Servlet调用service(),service() 根据请求调用doGet \ doPost

​ service方法是处理业务的核心。

(2)service() 与多线程

​ servlet 是单例的,当多个请求请求同一个servlet时,需要主要注意线程安全,不过也存在可以不必考虑线程安全的情况。

①线程安全情况
  • 如果service()方法没有访问Servlet的成员变量也没有访问全局的资源比如静态变量、文件、数据库连接等,而是只使用了当前线程自己的资源,比如非指向全局资源的临时变量、request和response对象等。该方法本身就是线程安全的,不必进行任何的同步控制。
  • 如果service()方法访问了Servlet的成员变量,但是对该变量的操作是只读操作,该方法本身就是线程安全的,不必进行任何的同步控制。
②线程不安全情况
  • 如果service()方法访问了全局的静态变量,如果同一时刻系统中也可能有其它线程访问该静态变量,如果既有读也有写的操作,通常需要加上同步控制语句。
  • 如果service()方法访问了全局的资源,比如文件、数据库连接等,通常需要加上同步控制语句。

4 、destroy()销毁

​ 当web服务器认为此servlet没有存在的必要、类重新加载、服务器关闭、长时间未被访问,则可以从内存中销毁。而回收该Servlet内存前必须调用destroy(),web服务器保证该方法被调用时已经结束了请求调用的service()或等待剩余的请求执行完,并且不会再接收请求。当全部请求处理完并响应后,即可destroy() 并进行内存回收

二、执行流程

通过上面的描述,其实我们对执行流程已有了大体的认知:

1. 根据时机,Web容器加载对应的Servlet类,加载后进行init()初始化。
- 设置了容器启动时初始化
- 请求第一次请求此Servlet时初始化
- Servlet类文件被更新后,重新装载Servlet
2. 接收到请求,容器根据配置将请求交给对应的Servlet,同时创建HttpServletRequest 和 HttpServletResponse 对象,一并交给Servlet。
3. 在service()中根据HttpServletRequest得请求类型等信息,调用doGet\doPost 进行业务处理。
4. 处理后通过HttpServletResponse获得相应信息,返回给Web容器。
5. Web容器再将响应返回给客户端。

参考:https://www.cnblogs.com/Wonghy/p/5542277.html

servlet生命周期和执行流程的更多相关文章

  1. 测试Servlet生命周期学习笔记

    测试环境:windows xp旗舰版 软件环境:myclipse8.5+tomcat7.0 ****************************************************** ...

  2. Servlet生命周期及工作原理

    1 Servlet生命周期Servlet 生命周期:Servlet 加载--->实例化--->服务--->销毁. init():在Servlet的生命周期中,仅执行一次init()方 ...

  3. Java开发之Servlet生命周期

    Servlet会在服务器启动或第一次请求该Servlet的时候开始生命周期,在服务器结束的时候结束生命周期.无论请求多少次Servlet,最多只有一个Servlet实例.多个客户端并发请求Servle ...

  4. Java Servlet系列之Servlet生命周期

    Servlet生命周期定义了一个Servlet如何被加载.初始化,以及它怎样接收请求.响应请求,提供服务.在讨论Servlet生命周期之前,先让我们来看一下这几个方法: 1. init()方法 在Se ...

  5. servlet生命周期与工作原理

    →   Jsp的本质是Servlet,Servlet是服务器端的小程序,运行在服务器,用于处理及响应客户端的请求. Servlet和JSP的区别: servlet是特殊的Java类,必须继承HttpS ...

  6. Servlet 生命周期、工作原理

    按照单例的编码规则,Servlet本身只是一个Java,结构并不是单例结构. 只是Web容器在维护这些Servlet的时候只给创建一个实例存在JVM中,用户请求服务时,服务器只调用它已经实例化好的Se ...

  7. 【drp 9】Servlet生命周期

    一.基本概念 Servlet(Server Applet):全称Java Servlet,是用Java编写的服务器端程序.其主要功能在于交互式地浏览和修改数据,生成动态Web内容.狭义的Servlet ...

  8. javaweb学习总结二十一(servlet开发入门、servlet生命周期以及调用过程)

    一:servlet开发入门 servlet是sun公司一门开发动态web资源的技术,下面编写一个servlet入门程序: 1:在tomcat服务器webapps目录下新建firstServlet目录, ...

  9. Web---演示servlet技术(servlet生命周期),解决中文乱码问题

    本节讲解决中文乱码问题的4种方法. 还有更好的方法,也就是用过滤器,这里就不演示了,博主目前也不会~呼♪(^∇^*)~过段时间才会学. servlet生命周期演示: index.jsp: <%@ ...

随机推荐

  1. μC/OS-Ⅱ在C8051F060上的移植及其应用

    嵌入式操作系统是嵌入式应用的基础和核心.随着应用系统的不断复杂化和系统实时性需求的不断提高,对相应软件的逻辑结构.稳定性.实时性也提出了更高的要求,以传统的前后台编程模式编制软件将更加困难,而且容易出 ...

  2. 深拷贝数组 np.copy

    数组对象自带了浅拷贝和深拷贝的方法,但是一般用深拷贝多一些: 代码如下: >>> a = np.ones((2,2)) >>> b = a >>> ...

  3. Linux多线程的使用一:互斥锁

    多线程经常会在Linux的开发中用到,我想把平时的使用和思考记录下来,一是给自己做个备忘,二是分享给可能会用到的人. POSIX标准下互斥锁是pthread_mutex_t,与之相关的函数有: 1 i ...

  4. Densely Connected Convolutional Networks 论文阅读

    毕设终于告一段落,传统方法的视觉做得我整个人都很奔溃,终于结束,可以看些搁置很久的一些论文了,嘤嘤嘤 Densely Connected Convolutional Networks 其实很早就出来了 ...

  5. UE简单配置

    1 头上显示文件位置和名称,视图->视图列表——>打开文件标签,在右面点放大 2 函数列表,视图->视图列表——>打开文件标签

  6. HOG目标检测

    用HOG进行行人检测时,需要用训练好的支持向量机来对图片进行分类,在opencv中,支持向量机已经训练好,但自己来训练支持向量机才能更好的体会这一过程. 参考:http://blog.csdn.net ...

  7. 机器学习 Python实践-K近邻算法

    机器学习K近邻算法的实现主要是参考<机器学习实战>这本书. 一.K近邻(KNN)算法 K最近邻(k-Nearest Neighbour,KNN)分类算法,理解的思路是:如果一个样本在特征空 ...

  8. SQL Server中删除表中重复数据

    方法一:利用游标,但要注意主字段或标识列 declare @max integer,@id integer open cur_rows fetch cur_rows into @id,@max beg ...

  9. SQl查询数据库库名,表名、表的列名

    查询数据库 select * From master.dbo.sysdatabases where name='数据库名' and status<>512   --读取库中的所有表名 (当 ...

  10. Kubernetes 概述和搭建(多节点)

    一.Kubernetes整体概述和架构 Kubernetes是什么 Kubernetes是一个轻便的和可扩展的开源平台,用于管理容器化应用和服务.通过Kubernetes能够进行应用的自动化部署和扩缩 ...