日期:2014-05-16  浏览次数:20351 次

jsp运行原理

JSP运行原理

(2011-08-23 17:54:52)
转载
标签:

杂谈

我们先来看一个简单的JSP文件,如例12-1所示。

?

例12-1 hello.jsp

<html>

<head><title>Hello</title></head>

</html>

<body>

<%

out.println("Hello World!");

%>

</body>

</html>

??? 这个JSP页面向客户端输出“Hello World!”。我们把这个页面复制到?TALINA_HOME%\webapps \ROOT目录下,启动Tomcat,打开浏览器,在地址栏中输入http://localhost:8080/hello.jsp,看到“Hello World!”的输出后,读者可以转到?TALINA_HOME%\work\Catalina\localhost目录,在这个目录下,有一些读者熟悉 的目录,这些目录都是以前面章节的Web应用程序的上下文路径命名的,其中“_”目录对应的是ROOT目录。在_\org\apache\jsp目录下, 可以看到两个文件:“hello_jsp.java”和“hello_jsp.class”,这两个文件就是在我们访问hello.jsp文件时,由 JSP容器生成的,整个过程如图12-1所示。

??? JSP容器管理JSP页面生命周期的两个阶段:转换阶段(translation phase)和执行阶段(execution phase)。当有一个对JSP页面的客户请求到来时,JSP容器检验JSP页面的语法是否正确,将JSP页面转换为Servlet源文件,然后调用 javac工具类编译Servlet源文件生成字节码文件,这一阶段是转换阶段。接下来,Servlet容器加载转换后的Servlet类,实例化一个对 象处理客户端的请求,在请求处理完成后,响应对象被JSP容器接收,容器将HTML格式的响应信息发送到客户端,这一阶段是执行阶段。

??? 从整个过程中我们可以知道,当第一次加载JSP页面时,因为要将JSP文件转换为Servlet类,所以响应速度较慢。当再次请求时,JSP容器就会直接执行第一次请求时产生的Servlet, 而不会再重新转换JSP文件,所以其执行速度和原始的Servlet执行速度几乎就相同了。在JSP执行期间,JSP容器会检查JSP文件,看是否有更新 或修改。如果有更新或修改,JSP容器会再次编译JSP或Servlet;如果没有更新或修改,就直接执行前面产生的Servlet,这也是JSP相对于 Servlet的好处之一。

??? 下面我们看一下JSP容器在后台针对hello.jsp生成的Servlet源文件。虽然JSP页面转换为Servlet是在后台由JSP容器自动进行 的,但通过阅读JSP容器生成的源代码来了解JSP背后运行的机制,将有助于我们更好地理解JSP页面的运行,编写更加健壮、安全的JSP页面。

?

hello_jsp.java的完整代码如例12-2所示。

例12-2 hello_jsp.java

1.package org.apache.jsp;

2.

3.import javax.servlet.*;

4.import javax.servlet.http.*;

5.import javax.servlet.jsp.*;

6.

7.public final class hello_jsp extends org.apache.jasper.runtime.HttpJspBase

8. implements org.apache.jasper.runtime.JspSourceDependent {

9.

10. private static java.util.Vector _jspx_dependants;

11.

12. public java.util.List getDependants() {

13. return _jspx_dependants;

14. }

15.

16. public void_jspService(HttpServletRequest request, HttpServletResponse response)

17. throws java.io.IOException, ServletException {

18.

19. JspFactory _jspxFactory = null;

20. Pag