servlet初始化阶段(请求Servlet时,部署Servlet的容器要执行哪些步骤)

本文目录
- 请求Servlet时,部署Servlet的容器要执行哪些步骤
- servlet 何时被实例化、何时初始化、何时被创建、何时被加载
- servletoutputstream怎么初始化
- servlet的初始化init方法什么时候被调用
- 用户对servlet发出http请求时,相应的servlet类的构造方法就会被调用一次
- servlet的生命周期有哪几个阶段
请求Servlet时,部署Servlet的容器要执行哪些步骤
Servlet的生命周期是由servlet的容器来控制的。
分为3个阶段:初始化阶段、运行阶段、销毁阶段。
一、初始化阶段:
a Servlet容器加载servlet类,把它的.Class文件中的数据读到内存中。
b Servlet容器创建servletConfig对象。servletConfig对象包含了servlet的初始化配置信息。此外 servlet容器还会使得servletConfig对象与当前的web应用的servletContext对象关联。
c Servlet容器创建servlet对象。
d Servlet容器调用servlet对象的init(ServletConfig config)方法。
(2)在web.xml文件中为servlet设置了《load-on-startup》元素
《servlet》
《servlet-name》servlet1《/servlet-name》
《servlet-class》servlet.servlet1《/servlet-class》
《load-on-startup》0《/load-on-startup》
《/servlet》
说明:
在servlet的配置当中,《load-on-startup》5《/load-on-startup》的含义是:
标记容器是否在启动的时候就加载这个servlet。
当值为0或者大于0时,表示容器在应用启动时就加载这个servlet;
当是一个负数时或者没有指定时,则指示容器在该servlet被选择时才加载。
正数的值越小,启动该servlet的优先级越高。
(3) 当web应用被重新启动时,web应用中的所有servlet会在特定的时间被重新初始化。
二、运行阶段
在这个阶段sevlet可以随时响应客户端的请求。当servlet容器接到访问特定的servlet请求时,servlet容器会创建针对与这个请求的servletRequest和servletResponse对象,然后调用service()方法,并把这两个对象当做参数传递给service()方法。Service()方法通过servletRequest对象获得请求信息,并处理该请求,再通过servletResponse对象生成响应结果。
【不管是post还是get方法提交,都会在service中处理,然后,由service来交由相应的doPost或doGet方法处理,如果你重写了service方法,就不会再处理doPost或doGet了,如果重写sevice()方法,可以自己转向doPost()或doGet()方法】
注:当servlet容器把servlet生成的响应结果发送给客户后,servlet容器会销毁servletRequest和sevletResponse对象。
三、销毁阶段
当Web应用被终止时,servlet容器会先调用web应用中所有的servlet对象的destroy()方法,然后在销毁servlet对象。此外容器还会销毁与servlet对象关联的servletConfig对象。
在destroy()方法的实现中,可以释放servlet所占用的资源。如关闭文件输入输出流,关闭与数据库的连接。
注:sevlet的生命周期中,servlet的初始化和销毁只会发生一次,因此init()和destroy()方法只能被servlet容器调用一次,而service()方法取决与servlet被客户端访问的次数。
servlet 何时被实例化、何时初始化、何时被创建、何时被加载
pring三种实例化Bean的方法:
1、 构造器
《!-- 体验1 --》
《bean id="personService" class="com.persia.PersonServiceBean"》
《!-- index 代表方法的参数序号,由0开始,基本的类型Type可以不声明--》
《constructor-arg index="0" value="构造注入的name" /》
《constructor-arg index="1" type="com.persia.IDaoBean" ref="personDao"/》
《/bean》
对应类
public PersonServiceBean(String name, IDaoBean personDao) {
this.name = name;
this.personDao = personDao;
}
《!-- 体现2--》
《bean id="personDao" class="cn.itcast.dao.impl.PersonDaoBean" /》
《bean id="personServiceBean" class="cn.itcast.service.impl.PersonServiceBean"
lazy-init="true" init-method="init" destroy-method="destory"》
《!-- ref属性对应id personDao值 name属性对应接口的getter方法名称--》
《property name="personDao" ref="personDao" /》
《!-- 体验3 --》
《!-- 注入属性值 --》
《property name="name" value="123"/》
《!-- Set的注入 --》
《property name="sets"》
《set》
《value》sets:第一个值《/value》
《value》sets:第二个值《/value》
《value》sets:第三个值《/value》
《/set》
《/property》
《!-- List的注入 --》
《property name="lists"》
《list》
《value》lists:第一个值《/value》
《value》lists:第二个值《/value》
《value》lists:第三个值《/value》
《/list》
《/property》
《!-- Properties的注入 --》
《property name="properties"》
《props》
《prop key="props-key1"》:第一个值《/prop》
《prop key="props-key2"》:第二个值《/prop》
《prop key="props-key3"》:第三个值《/prop》
《/props》
《/property》
《!-- Map的注入 --》
《property name="maps"》
《map》
《entry key="maps-key1" value=":第一个值" /》
《entry key="maps-key2" value=":第二个值" /》
《entry key="maps-key3" value=":第三个值" /》
《/map》
《/property》
《/bean》
2、静态工厂:
《!-- 静态工厂获取bean --》
《bean id="personService2" class="com.persia.PersonServiceBeanFactory" factory-method="createInstance"/》
对应类
public static PersonServiceBean createInstance(){
return new PersonServiceBean();
}
3、 实例工厂:
没有静态方法,因此配置时,先实例化工厂,在实例化需要的bean。
《!-- 实例工厂获取bean,先实例化工厂再实例化bean--》
《bean id="fac" class="com.persia.PersonServiceBeanInsFactory"/》
《bean id="personService3" factory-bean="fac" factory-method="createInstance"/》
对应类
public PersonServiceBean createInstance(){
return new PersonServiceBean();
}
2. bean的作用域:
默认情况为单例方式:scope=”singleton”
singleton
单实例作用域,这是Spring容器默认的作用域,使用singleton作用域生成的是单实例,在整个Bean容器中仅保留一个实例对象供所有调用者共享引用。单例模式对于那些无会话状态的Bean(如辅助工具类、DAO组件、业务逻辑组件等)是最理想的选择。
prototype
原型模式,这是多实例作用域,针对每次不同的请求,Bean容器均会生成一个全新的Bean实例以供调用者使用。prototype作用域非常适用于那些需要保持会话状态的Bean实例,有一点值得注意的就是,Spring不能对一个prototype Bean的整个生命周期负责,容器在初始化、装配好一个prototype实例后,将它交给客户端,随后就对该prototype实例不闻不问了。因此,客户端要负责prototype实例的生命周期管理。
request
针对每次HTTP请求,Spring容器会根据Bean的定义创建一个全新的Bean实例, 且该Bean实例仅在当前HTTP request内有效,因此可以根据需要放心地更改所建实例的内部状态, 而其他请求中根据Bean定义创建的实例,将不会看到这些特定于某个请求的状态变化。 当处理请求结束,request作用域的Bean实例将被销毁。该作用域仅在基于web的Spring ApplicationContext情形下有效。
session
针对某个HTTP Session,Spring容器会根据Bean定义创建一个全新的Bean实例,且该Bean实例仅在当前HTTP Session内有效。 与request作用域一样,我们可以根据需要放心地更改所创建实例的内部状态,而别的HTTP Session中根据Bean定义创建的实例, 将不会看到这些特定于某个HTTP Session的状态变化。
当HTTP Session最终被废弃的时候,在该HTTP Session作用域内的Bean实例也会被废弃掉。该作用域仅在基于Web的Spring ApplicationContext情形下有效。
global session
global session作用域类似于标准的HTTP Session作用域,不过它仅仅在基于portlet的Web应用中才有意义。portlet规范定义了全局Session的概念,它被所有构成某个portlet Web应用的各种不同的portlet所共享。
在global session作用域中定义的Bean被限定于全局portlet Session的生命周期范围内。如果我们是在编写一个标准的基于Servlet的Web应用,并且定义了一个或多个具有global session作用域的Bean,系统会使用标准的HTTP Session作用域,并且不会引起任何错误。该作用域仅在基于Web的Spring ApplicationContext情形下有效。
3、 bean的生命周期
(1)什么时候实例化?
对于单例的形式,在容器实例化的时候对bean进行实例化的。www.cdtarena.com
ApplicationContext ctx=new ClassPathXmlApplicationContext(new String{"applicationContext.xml"});
单实例可以通过lazy-init=”true”,在getBean时进行实例化。
在beans里面default-lazy-init=”true”对所有bean进行延迟处理。
对于prototype,则是在getBean的时候被实例化的。
(2)在bean被实例化之后执行资源操作等方法:
Init-method=””
(3)在bean销毁之前执行的方法:
Destroy-method=””
什么时候被销毁?随着spring容器被关闭时被销毁。
调用spring容器的close方法来正常关闭。以前是随着应用程序执行完而关闭。
在Spring装载配置文件后,Spring工厂实例化完成,开始处理
(1)使用默认构造方法或指定构造参数进行Bean实例化。
(2)根据property标签的配置调用Bean实例中的相关set方法完成属性的赋值。
(3)如果Bean实现了BeanNameAware接口,则调用setBeanName()方法传入当前Bean的ID。
(4)如果Bean实现了BeanFactoryAware接口,则调用setBeanFactory()方法传入当前工厂实例的引用。
(5)如果Bean实现了ApplicationContextAware接口,则调用setApplicationContext()方法传入当前ApplicationContext实例的引用。
(6)如果有BeanPostProcessor与当前Bean关联,则与之关联的对象的postProcess- BeforeInitialzation()方法将被调用。
(7)如果在配置文件中配置Bean时设置了init-method属性,则调用该属性指定的初始化方法。
(8)如果有BeanPostProcessor与当前Bean关联,则与之关联的对象的postProcess- AfterInitialzation()方法将被调用。
(9)Bean实例化完成,处于待用状态,可以被正常使用了。
(10)当Spring容器关闭时,如果Bean实现了DisposableBean接口,则destroy()方法将被调用。
(11)如果在配置文件中配置Bean时设置了destroy-method属性,则调用该属性指定的方法进行销毁前的一些处理。
(12)Bean实例被正常销毁。
servletoutputstream怎么初始化
servletoutputstream初始化方法如下。
1、第一种是带参初始化。
2、第二种是无参初始化。
3、第三种是重写init方法,进行额外的初始化准备。①获取初始化参数值。②ServletContext和context-param。
servlet的初始化init方法什么时候被调用
有时候希望在servlet首次载入时,执行复杂的初始化任务,但并不想每个请求都重复这些任务的时候,用init()方法他在servlet初次创建时被调用,之后处理每个用户的请求时,则不在调用这个方法。因此,他主要用于一次性的初始化,和applet的init方法相同。
由于servlet初始化参数的使用非常依赖于部署描述文件(web.xml),该文件可存放servlet所需要的起始参数以及web应用程序的结构数据。当servlet容器读取web.xml文件内容后。可以将这些起始参数封装成一个对象并在调用init方法时传递个servlet,这个对象就是ServletConfig对象所以我们可以在Servlet内覆写init方法,并通过ServletCongig对象来取得某些初始参数。
以init参数的名称为参数,调用ServletConfig的getInitParameter方法。返回值就是init参数的值。
用户对servlet发出http请求时,相应的servlet类的构造方法就会被调用一次
init方法只会被调用一次。也就是构造方法被调用一次
这是因为servlet是运行在服务器端的,如果每次都构造的话,代价太大了。
servlet的生命周期有哪几个阶段
您好,
Servlet生命周期分为三个阶段:
1、初始化阶段 , 调用init()方法;
2、响应客户请求阶段, 调用service()方法;
3、终止阶段, 调用destroy()方法。
希望对您有帮助,如果有,请采纳,谢谢!!

更多文章:
avantage怎么设置为中文(Avantage安装丢失GIT)
2026年10月15日 03:00
activex控件未注册怎么办(登陆视频监控网页时提示activex控件未注册,怎么解决)
2026年10月14日 20:30
excel连接sql数据库教程(excel怎么连接sql数据库)
2026年10月14日 19:40






