JSP的生命周期

解释和编译的工作完成之后,JSP的生命周期将分为三个阶段:
◆装载和实例化:服务端为JSP页面查找已有的实现类,如果没找到则创建新的JSP页面的实现类,然后把这个类载入JVM。在实现类装载完成之后,JVM将创建这个类的一个实例。这一步会在装载后立刻执行,或者在第一次请求时执行。
◆初始化:初始化JSP页面对象。如果你希望在初始化期间执行某些代码,那么你可以向页面中增加一个初始化方法(method),在初始化的时候就会调用该方法。
◆请求处理:由页面对象响应客户端的请求。需要注意的是,单个对象实例将处理所有的请求。在执行完处理之后,服务器将一个响应(response)返回给客户端。这个响应完全是由HTML标签和其他数据构成的,并不会把任何Java源码返回给客户端。
◆生命周期终止:服务器不再把客户端的请求发给JSP。在所有的请求处理完成之后,会释放掉这个类的所有实例。一般这种情况会发生在服务器关闭的时候,但是也有其他的可能性,比如服务器需要保存资源、检测到有JSP文件更新,或者由于其他某些原因需要终止实例等情况。如果想让代码执行清除工作,那么可以实现一个方法,并且在这个类实例释放之前调用该方法。


在我们调用bean的时候有3个参数是需要设定的 ,他们分别是:id=““ class=““ scope=““在这三个参数中,id表示我们要创建的事例对象名称;class表示我们调用的bean,也就是你编写bean完成后通过编译生成的.class文件;scope就表示我们创建的bean的事例对象的生命周期!
  我们经常看到这样的代码来控制bean的生命周期:
  <jsp:useBean id=“hello“ class=“helloworld“ scope=“page“>
  或者<jsp:useBean id=“hello“ class=“helloworld“ scope=“request“>
  或者<jsp:useBean id=“hello“ class=“helloworld“ scope=“session“>
  或者<jsp:useBean id=“hello“ class=“helloworld“ scope=“application“>
  在这里我们看到在生命周期的参数里有4个不同的值,他们分别是:page,request,session,application
  下边我们分别来分析一下:
  1. Page scope:他的生命周期是最短的,当一张网页由jsp程序产生,并送到客户端后,属于page scope的bean也将被释放到内存,失去它的作用。
  举例:(1)首先我们做一个表单页(pageform.htm),代码如下:
   <html>
  <head>
  <title>test page scope</title>
  <meta http-equiv=“Content-Type“ content=“text/html; charset=gb2312“>
  </head>
  <body bgcolor=“#FFFFFF“ text=“#000000“>
  <form name=“form1“ method=“post“ action=“pagescope.jsp“>
   <input type=“text“ name=“scope“>
   <input type=“submit“ name=“Submit“ value=“Submit“>
  </form>
  </body>
  </html>
   (2)然后用jsp页(pagescope.jsp)来处理表单
  <%@ page language=“java“ import=“java.lang.*,justfortest;“%>
  <jsp:useBean id=“hello“ class=“justfortest“ scope=“page“>
  <jsp:setProperty name=“hello“ property=“*“/>
  </jsp:useBean>
  <jsp:getProperty name=“hello“ property=“scope“/>
  (3)javabean的源代码(juestfortest.java):
  import java.lang.*;
  public class justfortest {
  private String scope;//私有变量
   public justfortest()//构造函数
   {
  }
   public void setscope(String scope)
   {this.scope=scope;
   }
   public String getscope()
   {
   return this.scope;
   }
  }
  2.request scope的生命周期和jsp 程序中的request对象同步;当一个jsp程序通过forward程序将request对象传到下一个 jsp页的时候,request的bean也将伴随 request对象一起送出,因此通过forward程序串起来的jsp程序都可以共享相同的Bean,使jsp程序间的信息传递更容易实现。
   举例:(1)首先我们做一个表单页(pageform.htm),代码如下:
  <html>
  <head>
  <title>test page scope</title>
  <meta http-equiv=“Content-Type“ content=“text/html; charset=gb2312“>
  </head>
  <body bgcolor=“#FFFFFF“ text=“#000000“>
  <form name=“form1“ method=“post“ action=“pagescope.jsp“>
   <input type=“text“ name=“scope“>
   <input type=“submit“ name=“Submit“ value=“Submit“>
  </form>
  </body>
  </html>
  (2)然后用jsp页(pagescope.jsp)来处理表单
  <%@ page language=“java“ import=“java.lang.*,justfortest;“%>
  <jsp:useBean id=“hello“ class=“justfortest“ scope=“request“>
  <jsp:setProperty name=“hello“ property=“*“/>
  </jsp:useBean>
  <jsp:forward page=“pagescope1.jsp“/>
  (3)pagescope1.jsp源代码
   <%@ page language=“java“ import=“java.lang.*,justfortest;“%>
  <jsp:useBean id=“hello“ class=“justfortest“ scope=“request“/>
  <jsp:getProperty name=“hello“ property=“scope“/>
  (4)对于Bean的代码我们不做任何改变
  我们可以看到浏览器输出的是你输入的字符,这个过程中:首先表单页(pageform.htm)提交信息到pagescope.jsp做处理,把信息送到justfortest 这个bean 并且通过setscope()函数把hellobean的私有变量做赋值,同时我们建立了hello这个对象实例,通过<jsp:forward page=“pagescope1.jsp“/>我们来到pagescope1.jsp, 在这里我们通过<jsp:getProperty name=“hello“ property=“scope“/>来输出我们在pagescope.jsp里边给hello的私有变量(private String scope)的值。Bean结束生命周期,释放内存;
  在这里我们清楚的看到两个页共享同一个bean 并且达到共享信息(private String scope)的目的;
  3. session scope的生命周期,他的生命周期和服务器设定的setMaxInactiveInterval(interval)是相同的,就是说session存在那么它就不消失。
  举例:(1)首先我们做一个表单页(pageform.htm),代码如下:
  <html>
  <head>
  <title>test page scope</title>
  <meta http-equiv=“Content-Type“ content=“text/html; charset=gb2312“>
  </head>
  <body bgcolor=“#FFFFFF“ text=“#000000“>
  <form name=“form1“ method=“post“ action=“pagescope.jsp“>
   <input type=“text“ name=“scope“>
   <input type=“submit“ name=“Submit“ value=“Submit“>
  </form>
  </body>
  </html>
  (2)然后用jsp页(pagescope.jsp)来处理表单
  <%@ page language=“java“ import=“java.lang.*,justfortest;“%>
  <jsp:useBean id=“hello“ class=“justfortest“ scope=“session“>
  <jsp:setProperty name=“hello“ property=“*“/>
  </jsp:useBean>
  /*如果我们在这里加一句<%session.setMaxInactiveInterval(1)%>让session在1秒内超时,那么我们在转向到pagescope1.jsp里边,虽然同样可以看到结果,但是当我们超过1秒后,刷新页面,我们就看到输出为null 这说明hello已经被回收;假如我们写的是<%session.setMaxInactiveInterval(1800)%>,那么在1800秒内你只要有互动,那么session不会过期,我们按刷新,它的值就不会消失*/
  <%response.sendRedirect(“pagescope1.jsp“)%>
  (3)pagescope1.jsp源代码
   <%@ page language=“java“ import=“java.lang.*,justfortest;“%>
  <jsp:useBean id=“hello“ class=“justfortest“ scope=“session“/>
  <jsp:getProperty name=“hello“ property=“scope“/>
  (4)对于Bean的代码我们不做任何改变
  4. application scope,它的生命周期是最长的,他可以和jsp container同步,就是说只要我们设定一个bean的生命周期是application,那么我们在其他任何jsp里边都可以共享这个bean,通过这个bean来共享信息。
   举例我就省了。
  

你可能感兴趣的:(java,jvm,jsp,bean,浏览器)