精华内容
下载资源
问答
  • Servlet的生命周期

    万次阅读 多人点赞 2019-06-02 17:36:53
    Servlet的生命周期 servlet的生命周期就是从servlet出现到销毁的全过程。主要分为以下几个阶段: 加载类—>实例化(为对象分配空间)—>初始化(为对象的属性赋值)—>请求处理(服务阶段)—>销毁 服务器启动...

    Servlet的生命周期

    servlet的生命周期就是从servlet出现到销毁的全过程。主要分为以下几个阶段:
    加载类—>实例化(为对象分配空间)—>初始化(为对象的属性赋值)—>请求处理(服务阶段)—>销毁

    服务器启动时(web.xml中配置load-on-startup=1,默认为0)或者第一次请求该servlet时,就会初始化一个Servlet对象,也就是会执行初始化方法init(ServletConfig conf),该servlet对象去处理所有客户端请求,service(ServletRequest req,ServletResponse res)方法中执行,最后服务器关闭时,才会销毁这个servlet对象,执行destroy()方法。其中加载阶段无法观察,但是初始化、服务、销毁阶段是可以观察到的。

    在这里插入图片描述

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

    在这里插入图片描述
    思考问题
    为什么创建的servlet是继承自httpServlet,而不是直接实现Servlet接口?

    解答:
    首先我们来看下源码,HttpServlet的继承结构
    在这里插入图片描述
    HttpServlet继承了GenericServlet,GenericServlet是一个通用的Servlet,那么他的作用是什么呢?大概的就是将实现Servlet接口的方法,简化编写servlet的步骤。
    GenericServlet的继承结构:
    在这里插入图片描述
    实现了Servlet接口和ServletConfig接口

    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();
    }
    

    从这里可以看到,Servlet生命周期的三个关键方法,init、service、destroy。还有另外两个方法,一个getServletConfig()方法来获取ServletConfig对象,ServletConfig对象可以获取到Servlet的一些信息,ServletName、ServletContext、InitParameter、InitParameterNames、通过查看ServletConfig这个接口就可以知道

    public interface ServletConfig {
    	String getServletName();
    
    	ServletContext getServletContext();
    
    	String getInitParameter(String var1);
    
    	Enumeration<String> getInitParameterNames();
    }
    

    其中ServletContext对象是servlet上下文对象,功能有很多,获得了ServletContext对象,就能获取大部分我们需要的信息,比如获取servlet的路径,等方法。

    到此,就知道了Servlet接口中的内容和作用,总结起来就是,三个生命周期运行的方法,获取ServletConfig,而通过ServletConfig又可以获取到ServletContext。而GenericServlet实现了Servlet接口后,也就说明我们可以直接继承GenericServlet,就可以使用上面我们所介绍Servlet接口中的那几个方法了,能拿到ServletConfig,也可以拿到ServletContext,不过那样太麻烦,不能直接获取ServletContext,所以GenericServlet除了实现Servlet接口外,还实现了ServletConfig接口,那样,就可以直接获取ServletContext了。

    在这里插入图片描述
    上图我们观察到,init方法存在两个,一个带参,一个无参

    private transient ServletConfig config;
    public void init(ServletConfig config) throws ServletException {
    		this.config = config;
    		this.init();
    	}
    
    	public void init() throws ServletException {
    	}
    	public ServletConfig getServletConfig() {
    		return this.config;
    	}
    

    通过这几个方法一起来讲解,首先看init(ServletConfig config)方法,因为只有init(ServletConfig config)中带有ServletConfig对象,为了方便能够在其他地方也能直接使用ServletConfig对象,而不仅仅局限在init(ServletConfig config)方法中,所以创建一个私有的成员变量config,在init(ServletConfig config)方法中就将其赋值给config,然后通过getServletConfig()方法就能够获取ServletConfig对象了,这个可以理解,但是在init(ServletConfig config)中,158行,还调用了一个init()方法,并且这个init()方法是空的,什么读没有,这是为什么呢?这个原因是为了防止一件事情,当我们需要在init方法中做一点别的事情,我们想到的方法就是继承GenericServlet并且重写了init(ServletConfig config)方法,这样依赖,就破坏了原本在GenericServlet类中init(ServletConfig config)写的代码了,也就是在GenericServlet类中的成员变量config会一直是null,无法得到赋值,因为被重写了,就不会在执行GenericServlet中init(ServletConfig config)方法中的代码。要想赋值,就必须在重写的init(ServletConfig config)方法中调用父类的init(ServletConfig config)方法,也就是super.init(ServletConfig config),这样一来,就很不方便,怕有时候会忘了写这句代码,所以在GenericServlet类中增加一个init()方法,以后需要在init方法中需要初始化别的数据,只需要重写init()这个方法,而不需要去覆盖init(ServletConfig config)这个方法,这样设计,就好很多,不用在管init(ServletConfig config)这个其中的内容了。也不用出现其他的问题。

    总结:
    Servlet的生命周期分为:加载阶段、实例化阶段、初始化阶段、服务阶段、销毁阶段。上面我们说了servlet默认是第一次被访问的时候初始化的,这种情况当用户要使用的时候才创建,也可以在服务器一启动的时候就创建好servlet(这种方式一般不用),要实现这样的操作需要进行配置,在web.xml中进行配置
    在这里插入图片描述

    展开全文
  • servlet的生命周期

    2017-06-16 22:46:49
    servlet的生命周期
    servlet的生命周期
    
    展开全文
  • Servlet 的生命周期

    2021-03-31 16:58:41
    一,Servlet的生命周期是什么 Servlet 生命周期可被定义为从创建直到毁灭的整个过程。 1.Servlet 初始化后调用 init () 方法。 2.Servlet 调用 service() 方法来处理客户端的请求。 3.Servlet 销毁前调用 destroy() ...

    一,Servlet的生命周期是什么

    Servlet 生命周期可被定义为从创建直到毁灭的整个过程。
    1.Servlet 初始化后调用 init () 方法。
    2.Servlet 调用 service() 方法来处理客户端的请求。
    3.Servlet 销毁前调用 destroy() 方法。
    4.最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。

    二,生命周期的方法

    1.init() 方法
    在Servlet的生命周期中,仅执行一次init()方法。它是在服务器装入Servlet时执行的,负责初始化Servlet对象。可以配置服务器,以在启动服务器或客户机首次访问Servlet时装入Servlet。无论有多少客户机访问Servlet,都不会重复执行init()。
    init 方法的定义如下:

    public void init() throws ServletException {
      // 初始化代码...
    }
    

    2.service() 方法
    service() 方法是执行实际任务的主要方法。Servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。

    每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务。service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并在适当的时候调用 doGet、doPost、doPut,doDelete 等方法。

    下面是该方法的特征:

    public void service(ServletRequest request, 
                        ServletResponse response) 
          throws ServletException, IOException{
    }
    

    3.destroy() 方法
    destroy() 方法只会被调用一次,在 Servlet 生命周期结束时被调用。destroy() 方法可以让您的 Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动。

    在调用 destroy() 方法之后,servlet 对象被标记为垃圾回收。destroy 方法定义如下所示:

     public void destroy() {
        // 终止化代码...
      }
    

    三,Servlet运行原理

    在这里插入图片描述

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,803
精华内容 4,321
关键字:

servlet的生命周期