前面提到了JSP这个玩意儿,也说了JSP的代码实际上是被翻译成了一个servlet,那么其过程又是如何?JSP最终是以servlet的形式在幕后操作,但是和servlet还是有区别的,在JSP中可以有HTML元素,HTML元素是给浏览器看到的,可以这么说,我们上网,浏览器解析的就是HTML,当这两个在一个JSP文件中的时候,又是如何解析的呢?
不断有问题出现,不断在脑海中回荡,实在难受,我知道只言片语是解释不清楚,就算解释清楚了,我也不知道这个玩意是如何做的,如何实现的,我能做的就是让这个流程走完,至于具体的实现,非我这样的凡夫俗子所能理解。
如果说HTML元素是给浏览器看的,那么JSP的代码片段肯定是给服务器看的,这一点毋庸置疑,但是浏览器先解析呢还是服务器呢?
1.先执行JSP代码片段(其实就是Java),即先和服务器交互,把交互后的结构和当前的html页面进行整合,整合成一个新的JSP页面,这个JSP里已没有了Java代码,也就是HTML.
2.对于这个新的JSP,按照从上到下的顺序执行。
其实验证的方法很容易,只要查看源文件即可。
在书籍上我们都可以看到这样的话语:
客户端发出请求
Web容器将JSP翻译成servlet源代码
Web容器将产生的源代码进行编译
Web容器将加载编译后的代码并执行
把执行结果响应至客户端
这个也就是一个翻译-编译-加载的过程(具体实现,我不知道)
这个过程我们都耳熟能详,那么我们可以继续深究,JSP是和一个页面相关,而Serlvet却没有这个功效,使用Servlet其实就是一个Java类,一般都是和Java代码直接打交道,处理用户的请求和响应请求,,而在JSP中,可以写一些HTML相关的东西,更适合做数据美化和显示,我们就不由的猜测,这个JSP被翻译的东西应该是继承了Servlet。
JSP的生命周期:
1.首先由JSP引擎(org.apache.jasper.servlet.JspServlet)将JSP页面翻译成Java代码;
2.将java代码编译才class字节码文件;
3.加载到容器;
4.有容器实例化成对象;
5.初始化阶段,相关的方法是jspInit();
6.请求到达,调用服务阶段相关方法_jspService(),客户端每次请求都会调用这个方法;
7.销毁阶段,相关的方法的jspDestroy()。
这里冒出来一个jspInit,_jspService,可以联想一下servlet的几个方法Init,Service。其实这些方法来自HttpJspPage接口,而该接口是Servlet的子接口,所以所有的JSP本质都是Servlet,对Tomcat而言,JSP类继承org.apache.jasper.runtime.HttpJspBase类,而该类实现了HttpJspPage接口,所以满足JSP规范。(不同的容器可能实现不一样)
那么现在整个过程就很清楚了,那么上面的JSP引擎是什么玩意儿?
我们有的时候将这个称之为JSP容器,我不知道将这个称之为应用服务器为不为过(或者说是应用服务器的一个部分)?之所以有这个,是因为我们的Web容器是不能处理JSP文件的,它只能处理HTML相关的东西,所以说这JSP容器实际是是对Web服务器的一个补充。
至此整个过程一目了然。
看来了解一个东西很不容易,有自己的处理手段,有自己的生命周期和流程,一些看起来相似的东西,其背后居然蕴含这么多不可思议的操作。这个算起清楚了,但是让我想起另外一个东西那就是ASPX,ASPX里面也可以写HTML的东西,而且还可以写服务器的控件?其背后又是如何运作的?我现在还不得而知,但是想我这样的人,永远都会剖根问底,只要脑子有疑问,就想法去解决,要不然放在脑子中就是一种负担,喜欢快乐学习,喜欢理解学习,喜欢了解其本质!