首页 > 代码库 > Jsp的生命周期

Jsp的生命周期

     今天学习了Jsp的一些基本知识,当看到jsp的生命周期时,稍微查阅了资料,这里大概总结一下。

     首先,Jsp的生命周期粗略的划分为3个阶段,分别是初始化阶段、执行阶段、销毁阶段;细分为4个阶段,分别是编译阶段、初始化阶段、执行阶段、销毁阶段。

  其中编译阶段是指当第一次执行Jsp时,Jsp引擎需要判断这个Jsp是否需要编译成servlet,如果需要,那么就对其进行编译三部曲(哪三部曲呢?1.先解析Jsp    2.转换成servlet   3.编译servlet),并且每次修改之后,jsp也要进行重新编译;如果不需要直接访问字节码文件。

       初始化阶段:是指将jsp对应的servlet进行初始化,调用jspInit()方法进行初始化,创建servlet实例,一般来讲初始化只执行一次,如果你需要执行自定义的初始化任务,那么重写jspInit()方法。当然,一般可以在jspInit()方法中进行数据库的连接、文件的打开创建查询表等

public void jspInit(){
//需要初始化的代码

}

    执行阶段:调用与jsp对应的servlet实例的服务方法。这一个阶段是和请求相关的一切交互,直到实例被销毁。当网页完成初始化后,Jsp引擎就会调用_jspService()方法,响应请求,这里需要一个HttpServletRequest对象和一个httpServletResponse对象,其中httpServletRequest对象负责传递请求,携带请求的内容,在此方法中获取请求的内容,然后该方法内部生成回应response由 HttpServletResponse带回。

void _jspService(HttpServlettRequest request , HttpServletResponse response){
    //获取request中的内容,并且形成一个响应response返回
}


 

   销毁阶段:当不再需要该jsp时,可以从容器中去除该jsp生成的servlet的实例,调用的是jspDestroy()方法,在该方法内可以实现数据库的关闭、打开文件的关闭等资源的释放

 

public void jspDestroy(){
//执行想要做的清理工作,如关闭数据库的连接、文件的关闭等
}

 

 这里我找了菜鸟教程的一段非常典型的代码

<%@ page contentType="text/html;charset=UTF-8" language="java" import="java.util.*" %>
<%@ page import="java.text.*" %>
<html>
  <head>
    <title>我的个人主页</title>
  </head>
  <body>
 
  <%!
    private int initVar = 0;
    private int serviceVar = 0;
    private int destroyVar = 0;
  %>

  <%!
    public void jspInit(){
        initVar++;
        System.out.println("初始化了"+initVar+"次");
  }
    public void jspDestroy(){
        destroyVar++;
        System.out.println("销毁了"+destroyVar+"次");
  }
  %>

  <%
    serviceVar++;
    System.out.println("请求了多少次"+serviceVar+"次");

    String content1 = "初始化的次数:"+initVar;
    String content2 = "请求的次数:"+serviceVar;
    String content3 = "销毁的次数:"+destroyVar;


  %>
  <h1>测试jsp的生命周期</h1>
  <p><%=content1%></p>
  <p><%=content2%></p>
  <p><%=content3%></p>
  </body>
</html>

 

运行结果: 

 技术分享    

      当打开服务器,开始运行该程序时,进行了编译阶段、初始化阶段(但是目前我还不知道这个为什么会有请求一次在那里),接着请求一次,请求的次数增加,当关闭服务器或者关闭浏览器的请求窗口时就会出现销毁了1次。

这个程序的内容就是自己定义完成各方法,其中只有变量是显示在浏览器中的,每次的System.out.println()都是打印在服务端的。

       总结一下:jsp总共是四个阶段,举个不太恰当的例子,每个阶段就好比一个人的出现,从孕育到死亡,编译阶段就好比我们从胚胎到修成人身一样,编译成servlet,初始化阶段就是出生,出现了一个servlet 实例,接着这个实例长大了,接受知识,接受礼仪的教育,并且时不时对外提供互动,并且他的父母可能对他的生活有一个安排(系统默认的jspService()方法),但是随着他的长大,他渐渐有了自己的想法,有了自己定义的jspService()方法,一直到他寿终正寝不能动,死亡,嗯,这个时候后辈需要对其安葬(火化)完成了servlet实例的销毁,当然后辈也可以对他进行他们认为的销毁(比如连带着用过的东西也进行了火化等等)。

Jsp的生命周期