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

时间:2023-03-09 21:42:51
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和selevt 生命周期详解(JSP的生命周期和select很像,jsp底层就是一个selevt)

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

JSP和selevt 生命周期详解(JSP的生命周期和select很像,jsp底层就是一个selevt)
<%@ 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>
JSP和selevt 生命周期详解(JSP的生命周期和select很像,jsp底层就是一个selevt)

效果如下:

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

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

会发现如下结构:

JSP和selevt 生命周期详解(JSP的生命周期和select很像,jsp底层就是一个selevt)
/*
* 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()