servlet生命周期和执行流程
一 、生命周期
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容器再将响应返回给客户端。
上一篇: C++:C++11新特性详解(1)
下一篇: C语言之linux内核实现位数高低位互换
推荐阅读
-
一条查询sql的执行流程和底层原理
-
servlet生命周期和执行流程
-
Unary模式下客户端创建 default-executor 和 resolver-executor 线程和从启动到执行grpc_connector_connect的主要流程
-
Servlet框架基础和生命周期(结合源码)、destroy()的思考
-
【SSM - SpringMVC篇】02 - SpringMVC执行流程详解,SpringMVC三大核心组件和使用,SpringMVC头文件模板
-
MapReduce执行框架的组件和执行流程
-
Servlet执行流程及原理解析
-
Java Filter过滤器(拦截路径和方式的配置+生命周期+多个过滤器的先后执行顺序)
-
servlet的生命周期是什么?jsp都有哪些对象和动作?
-
JavaEE基础(01):Servlet实现方式,生命周期执行过程