`
chenruieye
  • 浏览: 38465 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

jsp运行原理

    博客分类:
  • 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. PageContext pageContext = null;

21. HttpSession session = null;

22. ServletContext application = null;

23. ServletConfig config = null;

24. JspWriter out = null;

25. Object page = this;

26. JspWriter _jspx_out = null;

27. PageContext _jspx_page_context = null;

28.

29.

30. try {

31. _jspxFactory = JspFactory.getDefaultFactory();

32. response.setContentType("text/html");

33. pageContext = _jspxFactory.getPageContext(this, request, response,

34. null, true, 8192, true);

35. _jspx_page_context = pageContext;

36. application = pageContext.getServletContext();

37. config = pageContext.getServletConfig();

38. session = pageContext.getSession();

39. out = pageContext.getOut();

40. _jspx_out = out;

41.

42. out.write("<html>\r\n");

43. out.write(" <head><title>Hello</title></head>\r\n");

44. out.write("</html>\r\n");

45. out.write("<body>\r\n");

46. out.write(" ");

47.

48. out.println("Hello World!");

49.

50. out.write("\r\n");

51. out.write("</body>\r\n");

52. out.write("</html>");

53. } catch (Throwable t) {

54. if (!(t instanceof SkipPageException)){

55. out = _jspx_out;

56. if (out != null && out.getBufferSize() != 0)

57. out.clearBuffer();

58. if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);

59. }

60. } finally {

61. if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context);

62. }

63. }

64.}

    代码的第5行,导入javax.servlet.jsp包中所有的类,与JSP相关的类定义在这个包中。在Tomcat的文档中,包含了JSP API的文档,该文档的位置是:�TALINA_HOME%\webapps\tomcat-docs\ jspapi\index.html。

在JSP2.0规范中定义,JSP页面转换后的Servlet类必须实现javax.servlet.jsp.JspPage接口(与 Servlet类似,Servlet类必须实现javax.servlet.Servlet接口),该接口继承自javax.servlet.Servlet接口。除了继承的方法外,JspPage接口还定义了下面两个方法:

? public void jspInit()

这个方法在JSP页面初始化时被调用,它类似于Servlet中的init()方法。页面编写者可以在JSP的声明元素中覆盖这个方法,以提供任何的初始化工作。

? public void jspDestroy()

在JSP页面将要被销毁时调用这个方法。它类似于Servlet中的destroy()方法。页面编写者可以在JSP的声明元素中覆盖这个方法,以提供任何的JSP清除工作。

因为绝大多数情况下,JSP页面都是使用HTTP协议,所以JSP页面转换后的Servlet类实际上必须实现 javax.servlet.jsp.HttpJspPage接口,该接口继承自JspPage接口。除了继承的方法外,HttpJspPage接口只定 义了一个方法:

? public void _jspService(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServlet Response response) throws javax.servlet.ServletException, java.io.IOException

这个方法对应于JSP页面的主体(body)部分,它类似于Servlet中的service()方法。这个方法由JSP容器自动定义,页面编写者不应当提供该方法的实现。代码的第16~63行,就是JSP容器自动生成的_jspService()方法。

代码的第7行,hello_jsp类从org.apache.jasper.runtime.HttpJspBase 类派生,HttpJspBase类是Tomcat提供的实现了HttpJspPage接口的类。HttpJspBase类的部分代码如下。

package org.apache.jasper.runtime;

import …;

public abstract class HttpJspBase extends HttpServlet implements HttpJspPage

{

static

{

if( JspFactory.getDefaultFactory() == null )

{

JspFactoryImpl factory = new JspFactoryImpl();

JspFactory.setDefaultFactory(factory);

}

}

public final void init(ServletConfig config) throws ServletException

{

super.init(config);

jspInit();

}

public String getServletInfo()

{

return Localizer.getMessage("jsp.engine.info");

}

public final void destroy()

{

jspDestroy();

}

public final void service(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException

{

_jspService(request, response);

}

public void jspInit(){}

public void jspDestroy(){}

public abstract void _jspService(HttpServletRequest request,

HttpServletResponse response)

throws ServletException, IOException;

}

读者看HttpJspBase类是否感觉非常熟悉,实际上,这就是一个实现了HttpJspPage接口的Servlet类,在Servlet类的 init()方法中调用jspInit()方法,在Servlet类的destory()方法中调用jspDestroy()方法,在Servlet类的 service ()方法中调用_jspService ()方法。从Tomcat提供的HttpJspBase类可以看出,JSP页面运行的底层仍然是Servlet技术。

在例12-2的第20~25行,定义了一些对象变量,第33~39行,分别对这些对象进行了初始化,这些代码都是由JSP容器自动产生的,也就是说,在JSP页面中,可以直接使用这些服务器端对象(详见12.4节)。

代码的第42~52行,打印输出HTML页面,这段代码对应的是例12-1 hello.jsp文件中的代码。

 

 

jsppageBaseà httpJspPageàjsppageàjavax.servlet.servlet

分享到:
评论

相关推荐

    jsp运行原理.txt

    jsp运行原理.txt

    JavaWeb开发技术-JSP运行原理.pptx

    **JSP运行原理** 1. **客户端请求**:用户在浏览器中输入URL,发起对JSP页面的请求。 2. **JSP容器处理**:服务器接收到请求后,由JSP容器负责处理。如果JSP文件尚未被翻译成Servlet,容器会进行以下步骤: - **...

    韩顺平_细说jsp第2讲.jsp运行原理分析.page指令详解

    韩顺平_细说jsp第2讲.jsp运行原理分析.page指令详解

    JSP运行原理和九大隐式对象说明

    JSP运行原理和九大隐式对象说明,需要的朋友可以参考一下

    jsp九大内置对象讲解

    一、JSP运行原理 在了解JSP九大内置对象之前,首先需要了解JSP的运行原理。JSP网页的执行可以分为两个时期:转译时期和请求时期。在转译时期,JSP网页被转换为Servlet类;在请求时期,Servlet类被执行,响应结果被...

    jsp入门学习资料

    - **JSP运行原理**:JSP文件在第一次被请求时会被转换为Servlet,并被编译成Java类,之后每次请求都将执行这个编译好的Servlet。 - **项目结构**:典型的JSP项目包含多个目录,如`WEB-INF`用于存放配置文件、类文件...

    jsp工作原理

    ### JSP工作原理详解 #### 一、JSP的基本概念 JSP(JavaServer Pages)是一种基于Java技术的Web开发技术,它允许开发者在HTML页面中嵌入Java代码,从而实现动态网页的功能。JSP技术使得开发人员能够在静态网页的...

    韩顺平2013版“细说JSP”视频教程

    开山篇【】第2讲.jsp运行原理分析.page指令详解【】第3讲.include指令.脚本元素.动作元素【】第4讲.jsp九大内置对象.jsp版本计算器①【】第5讲.jsp版本计算器②[ED2000.COM]【】第6讲.jsp版本计算器③【】第7讲....

    JSP快速入门教程---全十讲

    **JSP运行原理**: - 启动服务器,将应用部署到服务器(默认`webapps`目录)。 - 客户端浏览器发起HTTP请求到指定URL(如`http://127.0.0.1:8080/bookstore/hello.jsp`)。 - 服务器查找对应的Java类,如果不存在,...

    JSP程序设计期末复习总结及模拟试题.docx

    JSP 程序设计期末复习总结及模拟试题 ...本资源摘要信息涵盖了 JSP 程序设计的基本概念、运行原理、JSP 指令标记、JSP 动作标记、JSP 内置对象、JSP 元素和 JSP 编程技巧等知识点,是 JSP 程序设计的必备知识。

    jsp教程免费文库

    3. **JSP运行原理**:当客户端请求JSP页面时,服务器会将JSP转换为对应的Servlet类,然后执行这个类来处理请求和生成响应。生成的HTML内容随后被发送回客户端。 4. **安装配置JSP运行环境**:为了运行JSP,你需要...

    《JSP网页设计》教学设计参考.pdf

    《JSP网页设计》这门课程的教学设计,目的在于培养学生理解和掌握JSP动态网页设计的基础知识和实践技能,课程主要围绕两大核心课题展开:WEB程序设计模式与运行原理,以及JSP页面与JSP运行原理。 首先,课程的第一...

    jsp ppt

    【JSP运行原理】 JSP页面在第一次被请求时,会被服务器转换为Java源文件(.java),然后编译为字节码文件(.class)。这个过程称为“转译编译”。当再次被请求时,服务器直接执行已经编译好的字节码文件,提高了运行...

    JSP详解OK.pdf

    #### 二、JSP运行原理 当服务器接收到对JSP页面的请求时,它首先将JSP页面转换成一个Servlet源文件,然后编译这个源文件生成一个.class文件,最后执行这个Servlet来生成动态内容并将其发送回客户端。这一过程确保了...

    j2ee实验三:学习使用JSP技术

    - **JSP运行原理**:JSP文件首先被转换为Servlet源码,然后编译为Servlet类,最后由Web容器执行。 5. **实验步骤**: - 安装并配置JDK,确保环境变量JAVA_HOME正确设置。 - 安装Jboss应用服务器和Eclipse IDE,...

    JSP入门教程,项目实例

    **JSP运行原理**: 1. 启动服务器,将应用部署到webapps下。 2. 浏览器发起HTTP请求,请求指定的JSP页面。 3. 服务器检查JSP页面是否已编译为Java类,如果未编译,则先转化为Java源码,再编译为`.class`文件。 4. ...

    了解JSP工作原理.ppt

    了解JSP工作原理 JSP(Java Server Pages)是一种服务器端的WEB程序开发技术,由Sun公司发布,具有跨平台、通用性好、安全可靠等特点。JSP是基于Java的,页面程序由HTML或XML标记和JSP脚本共同组成,文件以“ .jsp...

Global site tag (gtag.js) - Google Analytics