2.1.3 JSP的执行原理
JSP的工作模式是请求/响应模式,JSP文件第一次被请求时,JSP容器把文件转换成Servlet,然后Servlet编译成.class文件,最后执行.class文件。过程如图2.5所示。
图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所示。
图2.6 Tomcat部署路径
进入目录“CATALINA_BASE/work/Catalina/localhost/ch02_war_exploded/org/apache/jsp”,其目录结构如图2.7所示,内有jsp_first.jsp转换和编译的结果文件。
图2.7 JSP转换和编译后的文件
可以看出,jsp_first.jsp被转换和编译成jsp_005ffirst_jsp.java和jsp_005ffirst_jsp.class,其中主要看转化成Servlet的代码,如图2.8所示。
图2.8 JSP转换和编译后的文件内容
怎么知道这个类就是Servlet呢?这个类继承了HttpJspBase,接着继续跟进HttpJspBase,可以看到这个类就是Servlet。由此可见,jsp_005ffirst_jsp.java就是Servlet,局部截图如图2.9所示。
图2.9 HttpJspBase源码部分内容
通过跟踪源码,不难发现JSP转换成Servlet,由Servlet容器接管执行页面显示代码,最终以HTML的形式返回给客户端。