首页 > 其他分享 >8 Servlet的生命周期1

8 Servlet的生命周期1

时间:2023-03-14 18:34:34浏览次数:38  
标签:生命周期 请求 Servlet 方法 MyServlet4 HttpServlet servlet

      Servlet的生命周期

 
Servlet的生命周期是由容器管理的,分别经历四各阶段:

阶段           次数        时机

创建          1次          第一次请求

初始化       1次          实例化之后

执行服务    多次        每次请求

销毁           1次         停止服务

 

当客户端浏览器第一次请求Servlet时,容器会实例化这个Servlet,然后调用一次init方法,并在新的线程中执行service方法处理请求。service方法执行完毕后容器不会销毁这个Servlet而是做缓存处理,当客户端浏览器再次请求这个Servlet时,容器会从缓存中直接找到这个Servlet对象,并再一次在新的线程中执行Service方法。当容器在销毁Servlet之前对调用一次destory方法。

在Servlet中我们一般不要轻易使用成员变量!!!! 可能会造成线程安全问题

如果要使用的话,应该尽量避免对成员变量产生修改

如果要产生修改我们应该注意线程安全问题

如果我们自己添加线程安全编码处理,会严重影响效率

综上所述:原则,能不用成员变量就不用!!!

 

Servlet代码 
 

package com.mashibing.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
 * @Author: Ma HaiYang
 * @Description: MircoMessage:Mark_7001
 */
public class MyServlet4 extends HttpServlet {
    // 成员变量
    public MyServlet4()   {// 构造一个Servlet对象的方法
        System.out.println("MyServlet4 Constructor invoked");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    @Override
    public void init() throws ServletException {// 初始化
        System.out.println("MyServlet4 init invoked");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 执行服务
        System.out.println("MyServlet4 service invoked");
    }
    @Override
    public void destroy() {// 销毁
        System.out.println("MyServlet4 destory invoked");
    }
}

 

 

配置Servlet

  <servlet>
        <servlet-name>myServlet4</servlet-name>
        <servlet-class>com.mashibing.servlet.MyServlet4</servlet-class>
        <load-on-startup>6</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>myServlet4</servlet-name>
        <url-pattern>/myServlet4.do</url-pattern>
    </servlet-mapping>

 

多次请求servlet并查看控制台输出即可印证上述结论,值得注意的是,如果需要Servlet在服务启动时就实例化并初始化,我们可以在servlet的配置中添加load-on-startup配置启动顺序,配置的数字为启动顺序,应避免冲突且应>6

 

Servlet处理请求的过程

当浏览器基于get方式请求我们创建Servlet时,我们自定义的Servlet中的doGet方法会被执行。doGet方法能够被执行并处理get请求的原因是,容器在启动时会解析web工程中WEB-INF目录中的web.xml文件,在该文件中我们配置了Servlet与URI的绑定,容器通过对请求的解析可以获取请求资源的URI,然后找到与该URI绑定的Servlet并做实例化处理(注意:只实例化一次,如果在缓存中能够找到这个Servlet就不会再做次实例化处理)。在实例化时会使用Servlet接口类型作为引用类型的定义,并调用一次init方法,由于HttpServlet中重写了该方法所以最终执行的是HttpServlet中init方法(HttpServlet中的Init方法是一个空的方法体),然后在新的线程中调用service方法。由于在HttpServlet中重写了Service方法所以最终执行的是HttpServlet中的service方法。在service方法中通过request.getMethod()获取到请求方式进行判断如果是Get方式请求就执行doGet方法,如果是POST请求就执行doPost方法。如果是基于GET方式提交的,并且在我们自定义的Servlet中又重写了HttpServlet中的doGet方法,那么最终会根据Java的多态特性转而执行我们自定义的Servlet中的doGet方法。


标签:生命周期,请求,Servlet,方法,MyServlet4,HttpServlet,servlet
From: https://www.cnblogs.com/2324hh/p/17215906.html

相关文章

  • 7 Servlet的继承结构1
    Servlet的继承结构 Servlet接口1.init(),创建Servlet对象后立即调用该方法完成其他初始化工作。2.service(),处理客户端请求,执行业务操作,利用响应对象响应客户端请求。......
  • 7 Servlet的继承结构1
    Servlet的继承结构 Servlet接口1.init(),创建Servlet对象后立即调用该方法完成其他初始化工作。2.service(),处理客户端请求,执行业务操作,利用响应对象响应客户端请求。......
  • servlet部署和访问
    Servlet没有main()方法,不能独立运行,但它可以作为JavaWeb应用的一个组件被部署到Servlet容器中,由容器来实例化和调用Servlet的方法,例如:doGet()、doPost()等。那......
  • Servlet
    ServletHelloServlet1、构建一个普通的Maven项目,这个空的工程就是主工程2、关于Maven父子工程的理解:​父项目中会有:<modules><module>Servlet</module><......
  • thymeleaf 工具类 ( Servlet 模板 TemplateEngine 引擎)
    publicclassThymeleafUtil{privatestaticfinalTemplateEngineengine;static{engine=newTemplateEngine();ClassLoaderTemplateR......
  • 线程的生命周期
    创建使用Threadt=newThread()创建的线程。可运行状态调用start()方法后,进入可运行状态,此时线程可以获取CPU的timeSlience时间片。运行状态线程获取到时间片后,进......
  • 2_Servlet初识
    ​ Servlet开发流程在后台随机生成一个整数当浏览器请求一个Servlet时如果生成的是奇数,返回"happynewyear"如果生成的是偶数,返回"happybirthday"1创建一个JAVA......
  • 2_Servlet初识
    ​ Servlet开发流程在后台随机生成一个整数当浏览器请求一个Servlet时如果生成的是奇数,返回"happynewyear"如果生成的是偶数,返回"happybirthday"1创建一个JAVA......
  • 1_Servlet简介
     Servlet介绍Servlet是ServerApplet的简称,称为服务端小程序,是JavaEE平台下的技术标准,基于Java语言编写的服务端程序。Web容器或应用服务器实现了Servlet标准所以Servlet......
  • 1_Servlet简介
     Servlet介绍Servlet是ServerApplet的简称,称为服务端小程序,是JavaEE平台下的技术标准,基于Java语言编写的服务端程序。Web容器或应用服务器实现了Servlet标准所以Servlet......