很多人都会认为JSP的执行性能会和Servlet相差很多,其实执行性能上的差别只在第一次的执行。因为JSP在执行第一次后,会被编译成 Servlet的类文件,即.class,当再重复调用执行时,就直接执行第一次所产生的Servlet,而不再重新把JSP编译成Servelt。

因此,除了第一次的编译会花较久的时间之外,之后JSP和Servlet的执行速度就几乎相同了。Web容器处理JSP文件请求的执行过程主要包括以下4个部分:

1.客户端发出Request请求

2.JSP Container 将JSP转译成Servlet的源代码

3.将产生的Servlet源代码经过编译后,并加载到内存执行

4.把结果Response(响应)至客户端

在执行JSP网页时,通常可以分为两个时期:转译时期(Translation Time)和请求时期(Request Time)。

◆转译时期:JSP网页转移成Servlet类。

◆请求时期:Servlet类执行后,响应结果至客户端。

转译期间做了两件事情:

◆转译时期:将JSP网页转移为Servlet源代码 .java.

◆编译时期:将Servlet 源代码 .java编译成 Servlet类 .class.

当JSP网页在执行时,JSP Container会做检查工作,如果发现JSP网页有更新修改时,JSP Container才会再次编译JSP成Servlet; 如果JSP没有更新时,就直接执行前面所产生的Servlet。

  1. (showdate.jsp)
  2. <%@ page language="java" contentType="text/html;charset=gb2312" import="java.text.*,java.util.*;"%>
  3. <html>
  4. <head>
  5. <title>Show time</title>
  6. </head>
  7. <body>
  8. Hello :
  9. <%
  10. SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");
  11. String str = format.format(new Date());
  12. %>
  13. <%=str %>
  14. </body>
  15. </html>

当部署好 showdate.jsp之后,启动Tomcat服务器。

1.在IE浏览器中输入配置好的路径 .... showdate.jsp 请求这个页面。

2.JSP Container 即Tomcat 服务器会将 showdate.jsp 转译成 showdate_jsp.java 源文件。

3.同时将 showdate_jsp.java 源文件编译成 showdate_jsp.class。

4.编译执行showdate_jsp.class 类,处理请求,返回响应,容器将生成的页面返回给客户端显示。

  1. (转移成的java源文件  showdate_jsp.java)
  2. package org.apache.jsp.ch04;
  3. import javax.servlet.*;
  4. import javax.servlet.http.*;
  5. import javax.servlet.jsp.*;
  6. import java.text.*;
  7. import java.util.*;;
  8. public final class showdate_jsp extends org.apache.jasper.runtime.HttpJspBase
  9. implements org.apache.jasper.runtime.JspSourceDependent {
  10. private static java.util.List _jspx_dependants;
  11. public Object getDependants() {
  12. return _jspx_dependants;
  13. }
  14. public void _jspService(HttpServletRequest request, HttpServletResponse response)
  15. throws java.io.IOException, ServletException {
  16. JspFactory _jspxFactory = null;
  17. PageContext pageContext = null;
  18. HttpSession session = null;
  19. ServletContext application = null;
  20. ServletConfig config = null;
  21. JspWriter out = null;
  22. Object page = this;
  23. JspWriter _jspx_out = null;
  24. PageContext _jspx_page_context = null;
  25. try {
  26. _jspxFactory = JspFactory.getDefaultFactory();
  27. response.setContentType("text/html;charset=gb2312");
  28. pageContext = _jspxFactory.getPageContext(this, request, response,
  29. null, true, 8192, true);
  30. _jspx_page_context = pageContext;
  31. application = pageContext.getServletContext();
  32. config = pageContext.getServletConfig();
  33. session = pageContext.getSession();
  34. out = pageContext.getOut();
  35. _jspx_out = out;
  36. out.write("\r\n");
  37. out.write("<html>\r\n");
  38. out.write("<head>\r\n");
  39. out.write("<title>Show time</title>\r\n");
  40. out.write("</head>\r\n");
  41. out.write("<body> \r\n");
  42. out.write("\tHello : \r\n");
  43. out.write("\t");
  44. SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");
  45. String str = format.format(new Date());
  46. out.write("\r\n");
  47. out.write("\t ");
  48. out.print(str );
  49. out.write("\r\n");
  50. out.write("</body>\r\n");
  51. out.write("</html>");
  52. } catch (Throwable t) {
  53. if (!(t instanceof SkipPageException)){
  54. out = _jspx_out;
  55. if (out != null && out.getBufferSize() != 0)
  56. out.clearBuffer();
  57. if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
  58. }
  59. } finally {
  60. if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context);
  61. }
  62. }
  63. }

当JSP页面被转译成Servlet时,内容主要包含三个部分:

  1. public void _jspInit(){ ..}
  2. -- 当JSP网页一开始执行时,最先执行此方法,执行初始化工作
  3. public void _jspDestory(){...} – JSP网页最后执行的方法
  4. public void _jspService(HttpServletRequest request, HttpServletResponse response)
  5. throws java.io.IOException, ServletException {

JSP网页中最主要的程序都是在此执行,将showdate.jsp和showdate_jsp.java做一个简单对比:

第一部分:页面属性的对比

  1. <%@ page language="java" contentType="text/html;charset=gb2312" %>
  2. response.setContentType("text/html;charset=gb2312");
  3. //通过 response响应设置返回客户端的页面属性

第二部分:HTML标签

  1. <html>
  2. <head>
  3. <title>Show time</title>
  4. </head>
  5. ..
  6. </html>
  7. out.write("\r\n");
  8. out.write("<html>\r\n");
  9. out.write("<head>\r\n");
  10. out.write("<title>Show time</title>\r\n");
  11. out.write("</head>\r\n");
  12. out.write("<body> \r\n");
  13. out.write("\tHello : \r\n");
  14. out.write("\t");
  15. //通过 out对象 向客户端写HTML标签

第三部分:声明的对象

  1. <%
  2. SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");
  3. String str = format.format(new Date());
  4. %>

在_jspService 方法中声明的局部变量:

  1. SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");
  2. String str = format.format(new Date());

第四部分:表达式

  1. <%=str %>
  2. out.print(str ); //写即打印str变量的值

JSP转译成Servlet详细过程的更多相关文章

  1. JSP转译成Servlet详细过程【转】

    JSP转译成Servlet详细过程 JSP是Servlet的扩展,在没有JSP之前,就已经出现了Servlet技术.Servlet是利用输出流动态生成HTML页面,包括每一个HTML标签和每个在HTM ...

  2. jsp页面编译成Servlet类文件

    package org.apache.jsp; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.js ...

  3. JSP编译成Servlet(三)JSP编译后的Servlet

    JSP编译后的Servlet类会是怎样的呢?他们之间有着什么样的映射关系?在探讨JSP与Servlet之间的关系时先看一个简单的HelloWorld.jsp编译成HelloWorld.java后会是什 ...

  4. JSP源码、改写Servlet为JSP、查看转译成为Servlet的文件、JSP字符编码设置

    概述 在Servlet中编写HTML太麻烦了,应该使用JSP.JSP中可以直接编写HTML,使用指示.声明.脚本(scriptlet)等元素来堆砌各种功能,但JSP最后还是会被容器转译为Servlet ...

  5. JSP九大内置对象详细介绍

    内置对象的特点: 1.由JSP规范提供,不用编写者实例化. 2.通过Web容器实现和管理 3. 所有JSP页面均可使用 4.只有在脚本元素的表达式或代码段中才可使用(<%=使用内置对象%> ...

  6. jsp页面转发到servlet

    一个简单的例子来了解一下jsp页面转发到servlet的过程,环境 eclipse.tomcat 1.工程目录结构如下 2.各部分代码如下 1>index.jsp <%@ page lan ...

  7. JSP编译成Servlet(四)JSP与Java行关系映射

    我们知道java虚拟机只认识class文件,要在虚拟机上运行就必须要遵守class文件格式,所以JSP编译成servlet后还需要进一步编译成class文件,但从JSP文件到java文件再到class ...

  8. IDEA搭建SSMM框架(详细过程)

    IDEA搭建SSMM框架(详细过程) 相关环境 Intellij IDEA Ultimate Tomcat JDK MySql 5.6(win32/win64) Maven (可使用Intellij ...

  9. Tomcat配置(三):tomcat处理连接的详细过程

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

随机推荐

  1. 基于DevExpress的Winform程序安装包的制作

    在我们做系统开发的时候,都会面临一个安装包制作的问题,如何把我们做好的系统,通过安装包工具整合成一个安装包给客户进行安装.安装包的优势就是一步步安装就可以了,不用复制一大堆文件给客户,还怕缺少那个文件 ...

  2. 初入网络系列笔记(6)TFTP协议

    一.借鉴说明,本博文借鉴以下博文 1.锤子,FTP协议,http://www.cnblogs.com/loadrunner/archive/2008/01/09/1032264.html 2.suna ...

  3. Spring容器深入(li)

    spring中最常用的控制反转和面向切面编程. 一.IOC IoC(Inversion of Control,控制倒转).对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的 ...

  4. js promise chain

    新的标准里增加了原生的Promise. 这里只讨论链式使用的情况,思考一下其中的细节部分. 一,关于 then() 和 catch() 的复习 then() 和 catch() 的参数里可以放置 ca ...

  5. Java--FutureTask原理与使用(FutureTask可以被Thread执行,可以被线程池submit方法执行,并且可以监控线程与获取返回值)

    package com; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; i ...

  6. 【工匠大道】Git的使用总结

    初衷是想将一些常用的代码整理在博客园上,但是考虑到博客园上的代码量多,需要折叠,折叠后就不能直接修改,于是想到了 大家都常用的 gitHub来进行代码的管理. 其实之前我是用过 Osa的git的,但是 ...

  7. ABP 初探 之 权限设计

    大.小项目都要设计权限,都想设计一个通用的权限,把权限做的比较复杂,现在了解了ABP的设计思路,觉得设计很简单,但实现方法与思路耐人寻味. 本篇只介绍AbpPermissions的数据库设计,其它表结 ...

  8. sqlserver性能调优第一步

    相信不少的朋友,无论是做开发.架构的,还是DBA等,都经常听说“调优”这个词.说起“调优”,可能会让很多技术人员心头激情澎湃,也可能会让很多人感觉苦恼,不知道如何入手.当然,也有很多人对此不屑一顾,因 ...

  9. ASP.NET Core 运行原理剖析1:初始化WebApp模版并运行

    ASP.NET Core 运行原理剖析1:初始化WebApp模版并运行 核心框架 ASP.NET Core APP 创建与运行 总结 之前两篇文章简析.NET Core 以及与 .NET Framew ...

  10. 使用javascript改变图片路径

    效果预览:http://keleyi.com/keleyi/phtml/jstexiao/16.htm 代码如下: <!DOCTYPE html> <html> <hea ...