Servlet的生命周期和线程安全问题

简单了解什么是Servlet:

       在JavaWeb项目中,请求和发送相应的过程就是一种叫做Servlet的程序实现的,也是为了解决动态页面而产出的东西。本质上来说就是一套 Java Web 开发的规范,并且遵循这个规范开发的一个Java类。Servlet是由服务器(tomcat)调用的,即tomcat作为Servlet的容器,将其运行在服务器端,处理由用户发来的请求,并将响应传送到客户端。而我们熟知的Jsp其实就是Servlet的二代版本,Servlet 是 JSP 的基础,Servlet 虽然不直接面向用户,但是它依然是 JSP 的后台支撑,想玩转 JSP,必须先玩转 Servlet。

          顺便了解下@WebServlet注解   用于将一个类声明为 Servlet,该注解会在部署时被容器处理,容器根据其具体的属性配置将相应的类部署为 Servlet。以避免在Servlet在项目中过多造成web.xml的冗长。

Servlet 生命周期:

   和人一样,Servlet也会经历从被创建(出生)—— 使用(工作)—— 销毁(死亡),这就是它的生命周期。

创建:即初始化阶段:

可分为两步:

1.加载和实例化 Servlet;

            之前提到Servlet是实现于容器中的,那其实容器就负责加载并且实例化Servlet。当容器启动或者首次请求Servlet,容器会读取 web.xml 或 @WebServlet 中的配置信息,对指定的 Servlet 进行加载。加载成功后,容器会通过反射对 Servlet 进行实例化。

2. 调用 init() 方法进行初始化

              加载和实例化完成后,Servlet 容器调用 init() 方法初始化 Servlet 实例。

              初始化的目的:让 Servlet 实例在处理请求之前完成一些初始化工作,例如建立数据库连接,获取配置信息等。
              在 Servlet 的整个生命周期内,init() 方法只能被调用一次。即出生一次
               初始化期间Servlet 实例可以通过 ServletConfig 对象获取在 web.xml 或者@WebServlet 中配置的初始化参数。

运行时阶段

            运行时阶段是 Servlet 生命周期中最重要的阶段。对应着人的一生。Servlet 容器接收到来自客户端请求时,容器会针对该请求分别创建一个 ServletRequst 对象和 ServletResponse 对象,将它们以参数的形式传入 service() 方法内,并调用该方法对请求进行处理。
           这里需要注意的是,执行 service() 方法前,init() 方法必须已成功执行。
           在 service() 方法中,Servlet 通过 ServletRequst 对象获取客户端的相关信息和请求信息。在请求处理完成后,通过 ServletResponse 对象将响应信息进行包装,返回给客户端。当 Servlet 容器将响应信息返回给客户端后,ServletRequst 对象与 ServletResponse 对象就会被销毁。
           在 Servlet 的整个生命周期内,对于 Servlet 的每一次请求,Servlet 容器都会调用一次 service() 方法,并创建新的 ServletRequest 和 ServletResponse 对象。即 service() 方法在 Servlet 的整个生命周期中会被调用多次。

销毁阶段

           即死亡阶段,当 Servlet 容器关闭、重启或移除 Servlet 实例时,容器就会调用 destory() 方法,释放该实例使用的资源,例如:关闭数据库连接,关闭文件的输入流和输出流等,随后该实例被 Java 的垃圾收集器所回收。
           对于每个 Servlet 实例来说,destory() 方法只能被调用一次

图解:

          在 Servlet 的整个生命周期中,创建 Servlet 实例、init() 方法和 destory() 方法都只执行一次。当初始化完成后,Servlet 容器会将该实例保存在内存中,通过调用它的 service() 方法,为接收到的请求服务。

线程安全问题

Servlet 是在单例多线程环境下运行的。也就是整个应用中只有一个实例对象,一个浏览器代表一个线程,多个浏览器代表多个线程。按理说我们期望的应该是每个浏览器查看的都应该是自己的用户名。而现在的结果是浏览器中数据混乱。因此,我们可以认为 Servlet 是线程不安全的!

解决办法:

1.使用同步锁(synchronized):

2.尽量使用局部变量。

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值