在JSP编译的时候,服务器内部做了什么?

fuzhan820 2003-07-17 08:50:29
在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。
...全文
48 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧