• JSP和selevt 生命周期详解(JSP的生命周期和select很像,jsp底层就是一个selevt)


    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.pluginsorg.eclipse.wst.server.core mp0workCatalinalocalhostwebtest1orgapachejsplife_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("
    ");
          out.write("<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    ");
          out.write("<html>
    ");
          out.write("<head>
    ");
          out.write("<title>life.jsp</title>
    ");
          out.write("</head>
    ");
          out.write("<body>
    ");
          out.write("
    ");
          out.write("
    ");
          out.write("  
    ");
          out.write("
    ");
          out.write("
    ");
    
      serviceVar++;
      System.out.println("_jspService(): JSP共响应了"+serviceVar+"次请求");
    
      String content1="初始化次数 : "+initVar;
      String content2="响应客户请求次数 : "+serviceVar;
      String content3="销毁次数 : "+destroyVar;
    
          out.write("
    ");
          out.write("<p>");
          out.print(content1 );
          out.write("</p>
    ");
          out.write("<p>");
          out.print(content2 );
          out.write("</p>
    ");
          out.write("<p>");
          out.print(content3 );
          out.write("</p>
    ");
          out.write("
    ");
          out.write("</body>
    ");
          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()

  • 相关阅读:
    flask -服务端项目搭建
    蓝图 Blueprint
    flask-session
    flask-数据库操作 / ORM/Flask-SQLAlchemy/数据表操作/数据操作/数据库迁移
    在 Flask 项目中解决 CSRF 攻击
    Flask-Script 扩展/自定义终端命令/Jinja2模板引擎
    Flask项目创建/http的会话控制/Cookie/Session/请求钩子/异常捕获/context
    redtiger sql injection 练习
    流畅的python--序列构成的数组
    流畅的python--python的数据模型
  • 原文地址:https://www.cnblogs.com/mark5/p/11596344.html
Copyright © 2020-2023  润新知