JSP 编译和运行过程与JSP转移源码简单分析

Web容器处理JSP文件请求的执行过程主要包括以下4个部分:
1. 客户端发出Request请求
2. JSP Container 将JSP转译成Servlet的源代码
3. 将产生的Servlet源代码经过编译后,并加载到内存执行
4. 把结果Response(响应)至客户端

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

在执行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.

showdate.jsp

<%@ page language="java" contentType="text/html;charset=gb2312" import="java.text.*,java.util.*;"%><html><head><title>Show time</title></head><body>      Hello :      <%         SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");         String str = format.format(new Date());      %>      <%=str %></body></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 类,处理请求,返回响应,容器将生成的页面返回给客户端显示

转移成的 java 源文件 showdate_jsp.java

package org.apache.jsp.ch04;

import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.jsp.*;import java.text.*;import java.util.*;;

public final class showdate_jsp extends org.apache.jasper.runtime.HttpJspBase    implements org.apache.jasper.runtime.JspSourceDependent {

  private static java.util.List _jspx_dependants;

  public Object getDependants() {    return _jspx_dependants;  }

  public void _jspService(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>Show time</title>\r\n");      out.write("</head>\r\n");      out.write("<body> \r\n");      out.write("\tHello : \r\n");      out.write("\t");

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

      out.write("\r\n");      out.write("\t ");      out.print(str );      out.write("\r\n");      out.write("</body>\r\n");      out.write("</html>");    } 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 页面被转译成Servlet时,内容主要包含三个部分:

public void _jspInit(){ ..}     -- 当JSP网页一开始执行时,最先执行此方法,执行初始化工作

public void _jspDestory(){...} – JSP网页最后执行的方法

public void _jspService(HttpServletRequest request, HttpServletResponse response)        throws java.io.IOException, ServletException {

-- JSP网页中最主要的程序都是在此执行

将 showdate.jsp 和 showdate_jsp.java 做一个简单对比

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

<%@ page language="java" contentType="text/html;charset=gb2312" %>response.setContentType("text/html;charset=gb2312");  

//通过 response响应设置返回客户端的页面属性

第二部分:HTML标签

<html><head><title>Show time</title></head>..</html>
out.write("\r\n");out.write("<html>\r\n");out.write("<head>\r\n");out.write("<title>Show time</title>\r\n");out.write("</head>\r\n");out.write("<body> \r\n");out.write("\tHello : \r\n");out.write("\t");

//通过 out对象 向客户端写HTML标签

第三部分:声明的对象

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

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

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

第四部分:表达式

<%=str %>

out.print(str ); //写 即打印str变量的值

JSP 编译和运行过程与JSP源码简单分析相关推荐

  1. poco源码简单分析

    自动化工具poco源码简单分析 Airtest简介 Airtest是网易游戏开源的一款UI自动化测试项目,目前处于公开测试阶段,该项目分为AirtestIDE.Airtest.Poco.Testlab ...

  2. FFmpeg的HEVC解码器源码简单分析:概述

    ===================================================== HEVC源码分析文章列表: [解码 -libavcodec HEVC 解码器] FFmpeg ...

  3. Hessian 源码简单分析

    Hessian 源码简单分析 Hessian 是一个rpc框架, 我们需要先写一个服务端, 然后在客户端远程的调用它即可. 服务端: 服务端通常和spring 做集成. 首先写一个接口: public ...

  4. FFmpeg的HEVC解码器源码简单分析:解码器主干部分

    ===================================================== HEVC源码分析文章列表: [解码 -libavcodec HEVC 解码器] FFmpeg ...

  5. 线程的3种实现方式并深入源码简单分析实现原理

    前言 本文介绍下线程的3种实现方式并深入源码简单的阐述下原理 三种实现方式 Thread Runnable Callable&Future 深入源码简单刨析 Thread Thread类实现了 ...

  6. Linux·内核源码简单分析

    目录 系统总体流程: 各个目录的阅读总结: (一) boot (二)内核初始化init (三)kernel: (四)mm内存管理 (五)文件系统模块fs: 系统总体流程: 系统从boot开始动作,把内 ...

  7. MyBatis源码简单分析

    准备工作 Mybatis官网地址:https://blog.mybatis.org/ MyBatis官方文档地址:https://mybatis.org/mybatis-3/ MyBatis源码下载地 ...

  8. 基于OK6410开发板Uboot源码简单分析

    2018-04-07 OK6410开发板是基于三星S3C6410芯片设计的一款开发板,资源比较丰富,可是想要使用这些资源就需要编写相应的启动引导程序,即BootLoader.当然,想要自己凭空写出Bo ...

  9. Enemy源码简单分析

    这是这个项目的网页链接,以下是关于enemy源代码的粗略分析. https://github.com/freakanonymous/enemy 弗兰克,是一个全职的恶意代码工程师,会不定期更新enem ...

最新文章

  1. Spring Boot req中@NotNull, @NotEmpty和@NotBlank之间的区别是什么?
  2. CML 2020 | 显式引入对分类标签的描述,如何提高文本分类的效果?
  3. 代号“沙尘暴”:黑客剑指日本关键基础设施
  4. 3d制作中需要注意的问题_珠宝首饰工艺篇-戒指3D造型设计制作注意要点
  5. win7 php 上传文件,在LNMP原来的基础上,win7环境下如何上传PHP文件到Linux环境下...
  6. PyQt特殊对话框介绍
  7. github 和git_Google编码文档:Git和GitHub
  8. Hyper Text Transfer Protocol(超文本传输协议)
  9. 重构计算力 浪潮M5新一代服务器闪耀登场
  10. python制作fnt字体打包工具
  11. 写一个函数days,实现第一题的计算。由主函数将年月日传递给days函数。计算后将日子数传回主函数输出
  12. 关于R中的统计量----t检验
  13. 如何获得一个RAC Oracle数据库(从Github - oracle/docker-images) - 本地版
  14. javascript 递归乘阶
  15. 微信聊天,对方回复“哦”怎么办?学会这3个技巧,永不尬聊
  16. RN学习和开发笔记(一)
  17. 6-1 数据结构实验之排序八:快速排序 (20 分)
  18. 【四足机器人】学习笔记 欧拉角与旋转矩阵之间的转化关系
  19. SpringBoot开发网页即时聊天室/IM通信/WebSocket/即时通讯
  20. python数据分析考试题库_Python数据分析与数据可视化章节考试题库

热门文章

  1. Linux命令入门教程(三):文件基础篇
  2. win10 docker部署gpu项目
  3. Codeforces Round #644 (Div. 3) E.Polygon
  4. 信息安全之访问控制策略
  5. 蔬菜(vegetable)
  6. 修改本地hosts文件,出现不能写只能读权限,近root账户,密码忘记怎么办?
  7. java如何实现获取客户端公网IP地址?若不会,我手把手教你|非常详细,建议收藏
  8. 仿真软件算法(MOM/FDTD/FEM/BEM/FDID)
  9. 数据处理案例一之求同存异
  10. 晶圆在低温探针台中的安装方式——N-Grease真空油脂和夹具