首页 > 代码库 > 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的生命周期