`
qilixiang012
  • 浏览: 202967 次
文章分类
社区版块
存档分类
最新评论

javaEE jsp运行原理

 
阅读更多
Jsp运行原理
在一个JSP文件第一次被请求时,JSP引擎把该JSP文件转换成为一个Servlet。而这个引擎本身也是一个Servlet。JSP的运行过程如下所示:
(1)JSP引擎先把该JSP文件转换成一个Java源文件(Servlet),在转换时如果发现JSP文件有任何语法错误,转换过程将中断,并向服务端和客户端输出出错信息。
(2)如果转换成功,JSP引擎用javac把该Java源文件编译成相应的class文件。
(3)创建一个该Servlet(JSP页面的转换结果)的实例,该Servlet的jspInit()方法被执行,jspInit()方法在Servlet的生命周期中只被执行一次。
(4)jspService()方法被调用来处理客户端的请求。对每一个请求,JSP引擎创建一个新的线程来处理该请求。如果有多个客户端同时请求该JSP文件,则JSP引擎会创建多个线程。每个客户端请求对应一个线程。以多线程方式执行可以大大降低对系统的资源需求,提高系统的并发量及响应时间。但不过也应该注意多线程的编程限制,由于该Servlet始终驻于内存,所以响应是非常快的。
(5)如果.jsp文件被修改了,服务器将根据设置决定是否对该文件重新编译,如果需要重新编译,则将编译结果取代内存中的Servlet,并继续上述处理过程。
(6)虽然JSP效率很高,但在第一次调用时由于需要转换和编译而有一些轻微的延 迟。此外,在任何时候如果由于系统资源不足的原因,JSP引擎将以某种不确定的方式将Servlet从内存中移去。当这种情况发生时jspDestroy()方法首先被调用。
(7)然后Servlet实例便被标记加入“垃圾收集”处理。可在jspInit()中进行一些初始化工作,如建立与数据库的连接,或建立网络连接,从配置文件中取一些参数等,在jspDestory()中释放相应的资源。
1 请求应答模式,客户端发送请求,服务器进行响应
2 JSP文件是在服务器端执行的
3 返回给客户端的结果是JSP文件执行的结果,不包含任何JSP语法
4 内部对象是在把JSP文件转换为Java代码的时候生成的
5 执行的并不是JSP文件本身,而是JSP转换成的Java类的对象的方法,所以有时候修改JSP文件不起作用
JSP 工作原理
所有JSP页面,在执行的时候都会被服务器端的JSP引擎转换为Servelet(.java),然后又由JSP引擎调用Java编译器,将Servelet(.java)编译为Class文件(.class),并由Java虚拟机(JVM)解释执行。下面验证这一点:

有一个JSP页面Test.jsp,在浏览器地址栏中输入http://localhost:8080/Test.jsp,将会出现执行结果。同时在%CATALINA_HOME%\work\Catalina\localhost下多出两个文件:_Test_jsp.java和_Test_jsp.class,他们分别就是Servelet和Class文件


下面看看JSP文件在各个阶段的内容。

源文件:success.jsp

<%@ page contentType="text/html;charset=gb2312"%>

<html>

   <head>

      <title>登录成功</title>

   </head>

   <body>

      <h2>${sessionScope.userid}您好,欢迎登录网上书店!</h2>

   </body>

</html>

与Servlet的运行原理不同的是,JSP需要先转换成Java文件。

success.jsp文件被转换成的Java文件的内容如下(位于Tomcat安装目录下的work/Catalina/localhost/ch2/org/apache/jsp文件夹中,ch2是我的应用的名字):

package org.apache.jsp;

import javax.servlet.*;

import javax.servlet.http.*;

import javax.servlet.jsp.*;

public final class success_jsp

extends org.apache.jasper.runtime.HttpJspBase

    implements org.apache.jasper.runtime.JspSourceDependent {

private static java.util.Vector _jspx_dependants;

public java.util.List getDependants() {

    return _jspx_dependants;

}

public void (HttpServletRequest request, HttpServletResponse response)

        throws java.io.IOException, ServletException {

    JspFactory _jspxFactory = null;

    PageContext pageContext = null;

    HttpSession session = null;

    ServletContext application = null;

    ServletConfig config = null;

    JspWriter out = null;

    Object page = this;

    JspWriter _jspx_out = null;

    PageContext _jspx_page_context = null;

    try {

      _jspxFactory = JspFactory.getDefaultFactory();

      response.setContentType("text/html;charset=gb2312");

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

                 null, true, 8192, true);

      _jspx_page_context = pageContext;

      application = pageContext.getServletContext();

      config = pageContext.getServletConfig();

      session = pageContext.getSession();

      out = pageContext.getOut();

      _jspx_out = out;

      out.write("/r/n");

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

      out.write("   <head>/r/n");

      out.write("      <title>登录成功</title>/r/n");

      out.write("   </head>/r/n");

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

      out.write("      <h2>");

      out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${sessionScope.userid}", java.lang.String.class, (PageContext)_jspx_page_context, null, false));

      out.write("您好,欢迎登录网上书店!</h2>/r/n");

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

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

} catch (Throwable t) {

      if (!(t instanceof SkipPageException)){

        out = _jspx_out;

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

          out.clearBuffer();

        if (_jspx_page_context != null)

_jspx_page_context.handlePageException(t);

      }

    } finally {

      if (_jspxFactory != null)

_jspxFactory.releasePageContext(_jspx_page_context);

    }

}

}

从JSP被转换成的Java文件可以看出如下几点:

1) JSP文件中的内容基本都被包含在了_jspService方法中,实际上页面执行的过程就是这个方法执行的过程;

2) 页面中显示给用户的HTML信息都被转换成了out.println("XXXX")的形式;

3) 在_jspService方法中有两个参数request和response,

4) 在方法中生成了如下几个对象:

PageContext pageContext = null;

HttpSession session = null;

ServletContext application = null;

ServletConfig config = null;

JspWriter out = null;

Object page = this;

这就是传说中的内置对象(预定义对象)。

返回给客户端的代码(通过在客户端浏览器可以查看源文件):

<html>

   <head>

      <title>登录成功</title>

   </head>

   <body>

      <h2>zhangsan您好,欢迎登录网上书店!</h2>

   </body>

</html>

在此文件中看不到任何JSP的代码,而是纯HTML代码。与源文件不同的地方:

n 源文件中的page指令没有了

n 源文件中的${sessionScope.userid}没有了,而使用zhangsan代替了原来的表达式。

浏览器把这段HTML代码解析成界面显示给用户。

这就是从你编写的JSP文件到客户端看到的结果的转换过程。


参考:http://hi.baidu.com/mingfang0219/item/b09d720ad4a83fdadde5b022

分享到:
评论

相关推荐

    18-el&jstl源代码.rar

    2.jsp运行原理-----jsp本质就是servlet(面试) 3.jsp指令(3个) 4.jsp内置/隐式对象(9个)----- 笔试 5.jsp标签(动作) 1.EL 表达式概述 2.EL从域中取出数据(EL最重要的作用) 3.EL的内置对象11个 4.EL...

    Javaee的影视创作论坛BS_sql server 设计软件源码+数据库+WORD毕业论文文档.zip

    在传统的影视行业中,影视最重要的原理是”视觉暂留”, 通过蒙太奇组合成顺畅而生动的影片整体将按照一定的时序摄制的景物各运动阶段的静止画面连续映现出来,把外界事物的影像及声音摄录在胶片上,运用照相以及...

    Java学习指南(6) 网站入门篇 JavaEE / Servlet

    一、课程简介『Java学习指南系列』的第6篇教程,介绍JavaEE中的网站开发相关的技术 ( Servlet / JSP )。相关术语: Servlet | JSP | AJAX | RESTful | 文件上传 | HTTP GET | HTTP POST | URL Encode | 框架 | 抓...

    Java/JavaEE 学习笔记

    第七章 指定运行时变量..................133 第八章 数据模型和数据库设计......134 第九章 Creating Tables(创建表)......135 第十章 Oracle Data Dictionary(数据字典表)........................138 第十一章 ...

    JavaEE技术问题汇总.docx

    JSP中有个概念,静态包含和动态包含? Strust2和Springmvc的对比? SpringMvc的核心组件和运行流程 SpringMvc常用的注解 Shiro核心组件 Shiro的运行流程 什么RESTful(表现层状态转化)架构? Redis...

    javaee-nosql:通过 CDI 等将 NoSQL 数据库集成到 Java EE 中

    我们计划在未来添加新的数据库支持,届时将使用 MongoDB 验证该原理 本项目在 Apache License 2.0 下获得许可 测试 该项目在 Junit + Arquillian 下提供独立(无需安装第 3 方软件即可运行)测试。 默认情况下,...

    Java Web编程宝典-十年典藏版.pdf.part2(共2个)

    2.2.2 理解JSP运行原理 2.3 使用JSP指令标识 2.3.1 页面指令page的使用 2.3.2 文件包含指令include的使用 2.3.3 引用标签库指令taglib的使用 2.4 使用JSP脚本 2.4.1 在JSP中应用代码片段 2.4.2 使用JSP表达式 2.4.3 ...

    Java Web程序设计教程

    第2章 javaee运行及开发环境 15 2.1jdk的下载与安装 15 2.1.1jdk的下载与安装 15 2.1.2配置环境变量 17 &gt;2.2tomcat的下载与安装 19 2.2.1下载并安装tomcat服务器 19 .2.2.2基本配置 22 2.2.3服务器页面介绍...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    1.2.1 JSP、Servlet和JavaBean及 替代技术 14 1.2.2 JSF及替代技术 15 1.2.3 EJB组件技术简介 15 1.3 JBoss的下载和安装 15 1.3.1 下载和安装JBoss服务器 16 1.3.2 配置JBoss的服务端口 18 1.3.3 进入控制台 19 ...

    J2EE学习笔记(J2ee初学者必备手册)

    第七章 指定运行时变量..................133 第八章 数据模型和数据库设计......134 第九章 Creating Tables(创建表)......135 第十章 Oracle Data Dictionary(数据字典表)........................138 第十一章 ...

Global site tag (gtag.js) - Google Analytics