JSP:

JSP的生命周期指从创建到销毁的整个过程。分为以下几个阶段:

    1:编译阶段:servlet引擎编译servlet源文件,生成servlet类。当浏览器请求JSP页面时,JSP引擎会首先去检查是否需要编译这个文件。如果之前没有被编译过或者编译后被更改过,则编译这个JSP文件。编译过程包含三个步骤:解析JSP文件--将JSP转换为servlet--编译servlet。

    2:初始化阶段:加载与JSP对应的servlet类,创建其实例并调用初始化方法。容器载入JSP文件后,会首先调用jspInit()方法。次方法可以重写,一般情况写程序只初始化一次,通常情况下可以在此方法中初始化数据库连接、打开文件和创建查询列表。

    3:执行阶段:调用与JSP对应的servlet实例的服务方法。当JSP网页初始化完成后,JSP引擎会调用_jspService()方法。此方法需要一个HttpServletRequest对象和一个HttpServletResponse对象作为参数。_jspService()方法在每个request中被调用一次并且负责产生与之对应的response对象,别且还负责产生HTTP方法对应的回应。

    4:调用JSP对应的servlet实例的销毁方法,然后销毁servlet实例。jspDestroy()负责执行JSP网页从容器中的清理。涉及到的工作为释放数据库连接、关闭文件夹等等。

JSP的生命周期也能这样描述:

Jsp页必须转换成Servlet,才能对请求进行服务,因此Jsp的底层完全是Servlet。这样看来Jsp的生命周期就包括六个阶段:转换、编译、加载并实例化、jspInit()调用(即初始化)、_jspService()调用(即请求处理)、jspDestroy()调用(即销毁)。

转换:就是web容器将Jsp文件转换成一个包含了Servlet类定义的java源文件。

编译:把在转换阶段创建的java源文件编译成类文件。

Jsp生命周期其他的四个阶段跟Servlet生命周期相同。

  现在来具体讲一下:

     前一部分:

            1.创建:就是创建一个JSP源文件

            2.部署:将JSP安装到服务器上(JaveEE服务器或单机运行的JSP服务器)

            3.解释和编译:将JSP源文件解释成java源代码文件,然后将该源文件编译成可在服务器上运行的java类,这个类成为JSP页面的实现类。(这一步可能在以后多个地方都会遇到)

     后一部分:

            1.装载和实例化:前提是完成了前一部分的几步得到了一个实现类。服务器端会为JSP页面查找已有的实现类,如果没有,就把这个实现类载入JVM中;载入JVM后就立刻产生一个该类的实例,或者在第一次请求时执行。

             2.初始化:初始化JSP页面对象。如果你希望在初始化期间执行某些代码,那么你可以向页面中增加一个初始化方法(method),在初始化的时候就会调用该方法。

            3.请求处理:由页面对象响应客户端的请求。需要注意的是,单个对象实例将处理所有的请求。在执行完处理之后,服务器将一个响应(response)返回给客户端。这个响应完全是由HTML标签和其他数据构成的,并不会把任何Java源码返回给客户端。
              4.生命周期终止:服务器不再把客户端的请求发给JSP。在所有的请求处理完成之后,会释放掉这个类的所有实例。一般这种情况会发生在服务器关闭的时候,但是也有其他的可能性,比如服务器需要保存资源、检测到有JSP文件更新,或者由于其他某些原因需要终止实例等情况。如果想让代码执行清除工作,那么可以实现一个方法,并且在这个类实例释放之前调用该方法

如下图所示的是servlet的生命周期和JSP非常的相似:

下面来测试一下JSP实现这些生命周期,在left.jsp页面如下写法:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>life.jsp</title>
</head>
<body>

<%!
  private int initVar=0;
  private int serviceVar=0;
  private int destroyVar=0;
%>

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

<%
  serviceVar++;
  System.out.println("_jspService(): JSP共响应了"+serviceVar+"次请求");

  String content1="初始化次数 : "+initVar;
  String content2="响应客户请求次数 : "+serviceVar;
  String content3="销毁次数 : "+destroyVar;
%>
<p><%=content1 %></p>
<p><%=content2 %></p>
<p><%=content3 %></p>

</body>
</html>

效果如下:

然后打开工作空间的生成的java文件:“\workspace_web_test\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\webtest1\org\apache\jsp\life_jsp.java”

会发现如下结构:

/*
 * Generated by the Jasper component of Apache Tomcat
 * Version: Apache Tomcat/7.0.68
 * Generated at: 2016-12-14 13:18:33 UTC
 * Note: The last modified time of this file was set to
 *       the last modified time of the source file after
 *       generation to assist with modification tracking.
 */
package org.apache.jsp;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;

public final class life_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent {


  private int initVar=0;
  private int serviceVar=0;
  private int destroyVar=0;


  public void jspInit(){
    initVar++;
    System.out.println("jspInit(): JSP被初始化了"+initVar+"次");
  }
  public void jspDestroy(){
    destroyVar++;
    System.out.println("jspDestroy(): JSP被销毁了"+destroyVar+"次");
  }

  private static final javax.servlet.jsp.JspFactory _jspxFactory =
          javax.servlet.jsp.JspFactory.getDefaultFactory();

  private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;

  private volatile javax.el.ExpressionFactory _el_expressionfactory;
  private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager;

  public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
    return _jspx_dependants;
  }

  public javax.el.ExpressionFactory _jsp_getExpressionFactory() {
    if (_el_expressionfactory == null) {
      synchronized (this) {
        if (_el_expressionfactory == null) {
          _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
        }
      }
    }
    return _el_expressionfactory;
  }

  public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() {
    if (_jsp_instancemanager == null) {
      synchronized (this) {
        if (_jsp_instancemanager == null) {
          _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
        }
      }
    }
    return _jsp_instancemanager;
  }

  public void _jspInit() {
  }

  public void _jspDestroy() {
  }

  public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
        throws java.io.IOException, javax.servlet.ServletException {

    final javax.servlet.jsp.PageContext pageContext;
    javax.servlet.http.HttpSession session = null;
    final javax.servlet.ServletContext application;
    final javax.servlet.ServletConfig config;
    javax.servlet.jsp.JspWriter out = null;
    final java.lang.Object page = this;
    javax.servlet.jsp.JspWriter _jspx_out = null;
    javax.servlet.jsp.PageContext _jspx_page_context = null;


    try {
      response.setContentType("text/html; charset=UTF-8");
      pageContext = _jspxFactory.getPageContext(this, request, response,
                  null, true, 8192, true);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      session = pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;

      out.write("\r\n");
      out.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\r\n");
      out.write("<html>\r\n");
      out.write("<head>\r\n");
      out.write("<title>life.jsp</title>\r\n");
      out.write("</head>\r\n");
      out.write("<body>\r\n");
      out.write("\r\n");
      out.write("\r\n");
      out.write("  \r\n");
      out.write("\r\n");
      out.write("\r\n");

  serviceVar++;
  System.out.println("_jspService(): JSP共响应了"+serviceVar+"次请求");

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

      out.write("\r\n");
      out.write("<p>");
      out.print(content1 );
      out.write("</p>\r\n");
      out.write("<p>");
      out.print(content2 );
      out.write("</p>\r\n");
      out.write("<p>");
      out.print(content3 );
      out.write("</p>\r\n");
      out.write("\r\n");
      out.write("</body>\r\n");
      out.write("</html>");
    } catch (java.lang.Throwable t) {
      if (!(t instanceof javax.servlet.jsp.SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          try {
            if (response.isCommitted()) {
              out.flush();
            } else {
              out.clearBuffer();
            }
          } catch (java.io.IOException e) {}
        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
        else throw new ServletException(t);
      }
    } finally {
      _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }
}

selevt:

1.实例化一个selevt

2.初始化 init()

3.执行service()方法 ,来处理请求

4.根据请求调用doget()或者doPost()方法

5.销毁selevt : destroy()

01-20 22:49