今天我们要弄懂两个问题:
第一个就是jsp的运行原理,第二个就是为什么说jsp就是一个servlet
一、jsp的运行原理
1.访问jsp页面,首先tomcat服务器会去扫描jsp文件,把它翻译成java源文件
2、tomcat服务器翻译完jsp页面后,会对其java源文件进行编译成class字节码文件
3、tomcat服务器会构造这个jsp的类对象
4、tomcat服务器会调用这个jsp类对象里面的方法
二、jsp其实就是一个servlet,为什么呢?
1、在tomcat服务器的word文件上,存放着jsp文件对应的tomcat翻译的java源文件和编译的class文件
2、打开这个文件,看其继承的类,如下图
public final class _05_guess_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent { |
他继承了HttpJspBase这个类
3.我们再看看这个HttpJspBase这个类是继承了什么类呢?
在tomcat的源代码中,我们在jaspert.jar包中找到下面这里类
org.apache.jasper.runtime.HttpJspBase
看看该类继承的是哪个类:
public abstract class org.apache.jasper.runtime.HttpJspBase extends javax.servlet.http.HttpServlet implements javax.servlet.jsp.HttpJspPage {
现在我们看到,他们的继承关系了吧,tomcat服务器把jsp翻译的文件继承了HttpJspBase类,而该类又继承了HttpServlet类,所以得到的一个结论就是,其实jsp就是一个servlet
既然jsp就是一个servlet了,那么他们的生命周期又是怎么样的呢?
jsp的生命周期:
1、翻译(jsp文件->java文件)
2、编译(java源文件->class字节码文件(servlet程序))
3、构造函数 (第一次运行)
4、调用init方法 (第一次运行) -- 对应jsp编译的java文件的方法就是_jspInit()
5、调用service方法 --对应jsp编译的java文件的方法就是_jspService()
6、调用destroy方法 --对应jsp编译的java文件的方法就是_jspDestroy()
三、针对jsp的运行原理中的四个步骤,平常程序里是怎么运行的呢?
他分为两种情况,第一次运行和第n次运行
1、第一次运行的顺序:
走的是(1)->(2)->(3)->(4)
2、第n次运行的顺序:
走的是(4)
在这里,大家就要思考了,为什么除了第一次运行走(1)、(2)、(3)步骤,第n次就走这个步骤的呢?
大家想一下,第一次进来的时候,tomcat服务器扫描到了jsp文件,他就会在tomcat的安装目录下的work文件夹下面生成了对应的java源文件和编译好的class字节码文件,(注意了)在没有jsp文件没有改动的情况下,tomcat服务器是不会把这个翻译好编译好的文件删除掉重新编译一次的,所以就出现了第n次访问的时候,他在没有改动jsp文件的前提下,他就不会跑第一步和第二步了,这样大家明白了吧!
那为什么它连第三步创建类对象也不走了呢?
那就得从jsp的生命周期去说了,在jsp生命周期中的第三步创建构造函数和第四步调用init初始化方法的时候,他就创建了类对象,下次再进来的时候他就不需要再创建类对象了,所以第(3)步不用走的原因就再这里了。
写了一个多钟,希望可以帮到兄弟姐妹们!!!