Java 版 (精华区)

发信人: rhine (有雨无风), 信区: Java
标  题: 在JSP编译的时候,服务器内部做了什么?
发信站: 哈工大紫丁香 (2001年10月21日09:56:02 星期天), 站内信件

在JSP编译的时候,服务器内部做了什么? 作者:  
在JSP第一次获得请求时,不管请求来自于客户端浏览器还是服务器上的servlet,
 JSP文件将被JSP引擎(JSP engine)转换成为一个servlet。而这个引擎本身也是
一个servlet,在JSWDK,它就是 JspServlet。 

在编译时候如果发现jsp文件有任何语法错误,转换过程将中断,并向客户端发出
出错信息;而如果编译成功了,则所转换产生的servlet代码被编译,然后该
servlet被JSP引擎加载到内存中。此时JSP引擎还请求了jspInit()方法的执行,并
对此servlet做初始化。jspInit()方法在servlet的生命周期中只被请求一次。然
后jspService()方法被调用来处理客户端的请求和回复操作。对于所有的随后而来
的对该JSP文件的请求,服务器将检查该.jsp文件自最后一次被存取后是否经过修
改。如果没有修改则请求将交给还在内存中的servlet的jspService()方法以一种
同时发生的方式加以处理。注意,由于 servlet始终驻于内存,所以响应是非常快
的。
如果.jsp文件被修改了,服务器将自动地对文件重新编译,并将结果取代内存中的
servlet,并继续上述处理过程。 


虽然JSP效率很高,但在第一次调用时由于需要转换和编译而有一些轻微的延迟。
 此外,如果在任何时候如果由于系统资源不足的原因,JSP引擎将以某种不确定的
方式将servlet从内存中移去。当这种情况发生时jspDestroy()方法首先被调用, 
然后servlet实例便被标记加入“垃圾收集”处理。  


补充: 

jsp编译原理
JSP文件的Scriptlets在编译后将被包含于该JSP servlet的service()方法。当
JSP引擎处理客户端请求时,JSP Scriptlets在被请求的时候被执行。如果
scriptlet产生输出,输出将在out (JSPWriter)对象中进行缓存然后最终发送到客
户端。 


.jsp由一个Servlet"解释"执行 
这个Servlet就是/servlet/org.git.jsp.JspServlet(假如你把它放在servlet这个
区域里) 
第一次访问jsp文件的时候这个servlet会把.jsp编译成另一个servlet, 然后以后
每次访问这个jsp的时候就直接调用那个servlet了.


相关内容: 

jsp预编译器:
Jakarata Tomcat3.1 JSP服务器 (http://jakarta.apache.org)包含了一个 JSP编
译器(JSPC),可以进行预编译,既可以定义一个web应用的文件目录,也可以指定
某个特定jsp文件来进行编译。 
另外,oracle也有jspc。

 

--
           海纳百川,
                   有容乃大,
                           壁立千尺,
                                   无欲则刚。    

※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.239.176]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.057毫秒