![Java Web开发从0到1](https://wfqqreader-1252317822.image.myqcloud.com/cover/697/52842697/b_52842697.jpg)
2.1.3 JSP的执行原理
JSP的工作模式是请求/响应模式,JSP文件第一次被请求时,JSP容器把文件转换成Servlet,然后Servlet编译成.class文件,最后执行.class文件。过程如图2.5所示。
![](https://epubservercos.yuewen.com/61CE3A/31398315104711006/epubprivate/OEBPS/Images/Figure-P48_3924.jpg?sign=1739150226-qthYiUjxywp20MLfB5xtUyCI01IhbABv-0-7d0806e7f3075ea654a3e93671f3243a)
图2.5 JSP的执行原理
JSP执行的具体步骤如下:
首先是Client发出请求,请求访问JSP文件。
JSP容器将JSP文件转换为Java源代码(Servlet文件)。在转换过程中,如果发现错误,则中断转换并向服务端和客户端返回错误信息,请求结束。
如果文件转换成功,JSP容器会将Java源文件编译成.class文件。
Servlet容器会加载该.class文件并创建Servlet实例,然后执行jspInit()方法。
JSP容器执行jspService()方法处理客户端请求,对于每一个请求,JSP容器都会创建一个线程来处理,对于多个客户端同时请求JSP文件,JSP容器会创建多个线程,使得每一次请求都对应一个线程。
由于首次访问需要转换和编译,因此可能会产生轻微的延迟。另外,当遇到系统资源不足等情况时,Servlet实例可能会被移除。
处理完请求后,响应对象由JSP容器接收,并将HTML格式的响应信息发送回客户端。
为了更好地理解JSP的执行原理,接下来分析一下JSP生成的Servlet代码。
以第一个JSP页面为例,启动Tomcat过程中有参数:CATALINA_BASE,进入后面的目录,目录路径如图2.6所示。
![](https://epubservercos.yuewen.com/61CE3A/31398315104711006/epubprivate/OEBPS/Images/Figure-P49_3964.jpg?sign=1739150226-lJSjTACZuGm7kfAPGloa70mvO9rMUeCa-0-53d1a99cb9412aac4909dceef938b808)
图2.6 Tomcat部署路径
进入目录“CATALINA_BASE/work/Catalina/localhost/ch02_war_exploded/org/apache/jsp”,其目录结构如图2.7所示,内有jsp_first.jsp转换和编译的结果文件。
![](https://epubservercos.yuewen.com/61CE3A/31398315104711006/epubprivate/OEBPS/Images/Figure-P49_3965.jpg?sign=1739150226-epaBdCIKjXl7T8idYjZgBW31k2vzuXvH-0-2cfb3cff3ab97bf7de49a8e0ce7ae854)
图2.7 JSP转换和编译后的文件
可以看出,jsp_first.jsp被转换和编译成jsp_005ffirst_jsp.java和jsp_005ffirst_jsp.class,其中主要看转化成Servlet的代码,如图2.8所示。
![](https://epubservercos.yuewen.com/61CE3A/31398315104711006/epubprivate/OEBPS/Images/Figure-P49_3966.jpg?sign=1739150226-s20dC9RDQVHmKQTNBWrUHquCAJmqRVge-0-3a5b144bfe6c6f400faa029dd0b8943d)
图2.8 JSP转换和编译后的文件内容
怎么知道这个类就是Servlet呢?这个类继承了HttpJspBase,接着继续跟进HttpJspBase,可以看到这个类就是Servlet。由此可见,jsp_005ffirst_jsp.java就是Servlet,局部截图如图2.9所示。
![](https://epubservercos.yuewen.com/61CE3A/31398315104711006/epubprivate/OEBPS/Images/Figure-P49_3967.jpg?sign=1739150226-GXiS6hea6amKMfvUpMK41scmmS06uojt-0-eb9f336ec499bde1282738f3f28834c6)
图2.9 HttpJspBase源码部分内容
通过跟踪源码,不难发现JSP转换成Servlet,由Servlet容器接管执行页面显示代码,最终以HTML的形式返回给客户端。