描述Servlet生命周期

Servlet生命周期详解 在方法执行过程中,DispatcherServlet 会根据配置的 HandlerAdapter 对请求参数进行解析,将其转换为方法所需的类型,并将方法的执行结果封装为 ModelAndView 对象。在初始化阶段中,DispatcherServlet 会读取并解析配置文件(如 web.xml 或注解配置等),创建必要的组件对象(如 HandlerMapping、HandlerAdapter 等),并将它们存储在 ServletContext 中,以便于在后续的请求处理中使用。 阅读详情

目录

前言

一、servlet生命周期

    1、加载并实例化

    2、初始化

    3、服务

    4、销毁 

    5、总结

二、线程安全问题

        1、servlet是线程不安全的 

        2、解决线程安全问题 

总结


前言

        Servlet是在服务器端运行的Java程序,可以接收客户端请求并做出响应,是基于 Java 技术的 web 组件,该组件由容器托管,用于生成动态内容。他是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。

一、servlet生命周期

    1、加载并实例化

         Servlet容器负责加载和实例化Servelt。当Servlet容器启动时,或者在容器检测到需要这个Servlet来响应第一个请求时,创建Servlet实例。当Servlet容器启动后,Servlet通过类加载器来加载Servlet类,加载完成后再new一个Servlet对象来完成实例化。

    2、初始化

        在Servlet实例化之后,容器将调用init()方法,并传递实现ServletConfig接口的对象。在init()方法中,Servlet可以部署描述符中读取配置参数,或者执行任何其他一次性活动。在Servlet的整个生命周期类,init()方法只被调用一次。 

    3、服务

        当Servlet初始化后,容器就可以准备处理客户机请求了。当容器收到对这一Servlet的请求,就调用Servlet的service()方法,并把请求和响应对象作为参数传递。当并行的请求到来时,多个service()方法能够同时运行在独立的线程中。servlet会在适当的时候调用 doGet()doPost()doPut(),doDelete() 等方法。 

    4、销毁 

        当Tomcat容器关闭时或由于其他原因导致Servlet需要关闭或卸载时,容器会调用该对象的destroy()方法,以便让Servlet对象可以释放它所使用的资源,该方法同样只会执行一次。在容器调用destroy()方法前,如果还有其他的线程正在service()方法中执行,容器会等待这些线程执行完毕或者等待服务器设定的超时值到达。一旦Servlet对象的destroy()方法被调用,容器会释放这个Servlet对象,在随后的时间内,该对象会被java的垃圾收集器所回收。这四个阶段共同组成了Servlet的生命周期。

        5、总结

代码实现:

public class DemoServlet extends HttpServlet{
	//初始化servlet,调用init方法
	@Override
	public void init() throws ServletException {
		System.out.println("初始化时调用");
	}
	//开启服务
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		System.out.println("开启服务时调用");
	}
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		
	}
	//销毁时调用destory
	@Override
	public void destroy() {
		System.out.println("销毁时调用");
	}
}

生命周期过程:在一个servlet生命周期中,我们创建servlet实例、调用init()方法、调用destroy()方法,都只会执行一次,而调用service()方法和做出响应会反复执行。

二、线程安全问题

        1、servlet是线程不安全的 

        通过上面的Servlet生命周期可以看出,在Tomcat容器加载并实例化Servlet之后,会创建一个实例,并且这个实例是唯一的,无论多少用户访问Servlet,都共用这一个实例。而每次用户访问Servlet时,服务器都会为每个用户创建一个独立的线程,每个线程都有它自己的堆栈空间。所以说是单实例多线程,这种默认以多线程方式执行的设计可大大降低对系统的资源需求,提高系统的并发量及响应时间,但也同时引发了Servlet的线程安全问题。        

        对于Servlet中的局部变量,多线程下每个线程对局部变量都会有自己的一份copy,存在自己的堆栈空间中,这样对局部变量的修改只会影响到自己的copy而不会对别的线程产生影响,所以这是线程安全的;对于Servlet中的实例(全局)变量,多线程下所有线程共享实例变量,这一共享就可能导致多个线程之间互相影响,从而引发线程的不安全。

        2、解决线程安全问题 

(1)不使用实例变量

        既然实例变量能引发线程安全问题,那么只要在Servlet类的任何方法里面都不使用实例变量,该Servlet就是线程安全的。事实上,线程安全问题大部分是由实例变量造成的,在Servlet中避免使用实例变量是保证Servlet线程安全的最佳选择。

(2) 使用synchronized

        synchronized关键字能保证一次只有一个线程可以访问被保护的区段,所以理论上可以通过同步块操作来保证Servlet的线程安全。但因为其“一次只有一个线程可以访问”的特性,导致当大量用户访问同一资源时,只能排队访问,大量用户处于阻塞状态,这就大大降低了其用户的吞吐量,从而使系统的效率和性能大大降低,不推荐使用此方法

(3)   其他方式

        Java的有些集合类也会引发线程安全问题,应避免使用。比如用Vector代替ArrayList,用Hashtable代替HashMap等。另外,不要在Servlet中创建其他线程来完成某个功能,因为Servlet本身就是多线程的,再在Servlet中创建线程,更容易引发线程安全问题。


总结

        总的来说Servlet的生命周期主要是四个阶段,加载并实例化,然后调用init()方法进行初始化,初始化完成之后就可以调用service()方法,服务进行完之后,调动destroy()方法销毁,根据生命周期可以看出来,我们的servlet是线程不安全的,希望大家能够通过文章了解到servlet,谢谢。

Servlet生命周期、配置、创建时机及默认Servlet 阅读详情

相关推荐

描述Servlet生命周期Servlet是线程安全的吗? 为什么?

描述Servlet生命周期Servlet是线程安全的吗? 为什么?

qq_45582730的博客 693

Servlet生命周期

Servlet生命周期 servlet生命周期顾名思义就是从servlet出现到消亡(销毁)的全过程。 主要分为以下几个阶段:加载类—>实例化(为对象分配空间)—>初始化(为对象的属性赋值)—>请求响应(服务阶段)—>销毁 servlet生命周期三个方法: init()初始化阶段 service()处理客户端请求阶段 destroy()终止阶段 ​ 容器(tomcat等)装载servlet 实例化阶段 1.1 当客户端首次发送第一次请求后,由Serv

Ran小Ran的博客 2万+

说一说servlet生命周期

   Servlet生命周期就是servlet从创建到销毁的过程,包括加载和实例化,初始化,服务,和销毁4步。    当客户第一次请求时,首先判断是否存在servlet对象,第一次请求时不存在,则由tomcat创建对象,调用init()方法对其初始化,用service()方法判断是post请求还是get请求,调用对应的方法返回给客户。    当客户第二次请求时,还是判断是否存在servlet对象,由于之前已经创建过对象,所以直接到service()方法判断提交方式,调用对应的方法返回给客户端,    当tomcat关闭时,调用destory()方法销毁对象。    

servlet生命周期描述

加载并实例化 -> 初始化 -> 应用阶段(请求处理) -> 销毁 1.创建 Servlet 实例。 2.Web 容器调用 Servlet 的init()方法,对Servlet 进行初始化。 3.Servlet 初始化后,将一直存在于容器中,用于响应客户端请求。根据客户端的请求方式通过 Servlet 中service()方法去相应的 goGet(),或 doPost...

ncomer的博客 1768

描述Servlet生命周期

什么时候创建?创建时做了什么? 当需要Servlet来处理请求时,web容器会检查缓存中是否存在对应的Servlet,如果没有就创建,如果缓存中存在了,那么就直接拿来使用。所以说,Servlet是在接收到第一个处理请求时被创建的,也可以通过配置load-on-startup的值为1设置Servlet随服务器启动就创建对象。(特殊业务需求才使用程序启动自动创建Servlet对象,否则会增加服务器的启...

sinat_40880767的博客 1707

servlet生命周期的简单描述

一个servlet生命周期由不熟servlet的容器来控制,当一个请求映射到一个servlet的时候,该容器执行下列步骤。       1.如果一个Servlet的实例不存在,则Web容器            加载servlet类,创建一个servlet实例,调用init()方法初始化Servlet实例       2.调用Service方法,传递一个请求和相应对象,       3调

wuxinliulei的专栏 3473

Servlet生命周期描述!!!

简单的说分为三步: 1,实例化一个Servlet,并且调用init()初始化 2,调用service()方法,根据具体的请求调用doget()或者dopost()或者其他 3,卸载webApp之前,先调用destroy(),销毁示例,释放相应的资源; 详细解释: 当用户第一次向服务器发送请求时,服务器根据请求内容寻找对应的Servlet对象,因为是第一次请求,因此不存在Servlet对象

m1872216的专栏 3824

Servlet生命周期的简单描述

完整的Servlet生命周期描述: 1,服务器加载Servlet,感觉就是classLoader加载Servlet这个类。 2,执行Servlet的构造函数。 3,@PostConstruct修饰的方法执行。 4,执行Init(ServletConfig sc)方法。注意:Init的参数是Servlet的配置文件。 5,执行Service方法,doGet(),doPost()等,这些...

babyduncan的专栏 555

描述Servlet生命周期Servlet是线程安全的吗,为什么?

Servlet容器启动后,它必须要知道所需的Servlet类在什么位置,Servlet容器可以从本地文件系统、远程文件系统或者其他的网络服务中通过类加载器加载Servlet类,成功加载后,容器创建Servlet的实例。因为容器是通过Java的反射API来创建Servlet实例,调用的是Servlet的默认构造方法(即不带参数的构造方法),所以我们在编写Servlet类的时候,不应该提供带参数的构造方法。b.重写init()方法,doGet()方法,doPost()方法,destroy()方法。

qq_59510147的博客 593
上一篇: Mybatis一级缓存和二级缓存
下一篇: Java操作mongodb增删改查的基本操作
Friday.T
博客等级 码龄6年 267粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值