1.JSP的结构

网络服务器需要一个JSP引擎,也就是一个容器来处理JSP页面。容器负责截获对JSP页面的请求。JSP容器和Web服务器协同合作,为JSP的正常运行提供必要的运行环境和其它服务,并且能够正确识别专属于JSP网页的特殊元素。

下图显示了JSP容器和JSP文件在Web应用中所处的位置:

2.JSP处理

Web服务器是通过如下步骤使用JSP来创建网页的:

  1. 客户浏览器给服务器发送一个HTTP请求;
  2. Web服务器识别出这是一个JSP网页的请求,并且将该请求传递给JSP引擎。通过使用URL或.jsp文件来完成;
  3. JSP引擎从磁盘中载入JSP文件,然后将它们转化为servlet。这种转化只是简单地将所有模板文本改用println()语句,并且将所有的JSP元素转化成Java代码;
  4. JSP引擎将servlet编译成可执行类,并且将原始请求传递给servlet引擎;
  5. Web服务器的某组件将会调用servlet引擎,然后载入并执行servlet类。在执行的过程中,servlet产生HTML格式的输出并将其内嵌与HTTP的response上交给Web服务器;
  6. Web服务器以静态HTML网页的形式将HTTP的response返回给浏览器;
  7. 最终,Web浏览器处理HTTP response中动态产生的HTML网页,就好像在处理静态网页一样;
流程如下图:
一般情况下,JSP引擎会检查JSP文件对应的servlet是否已经存在,并且检查JSP文件的修改日期是否早于servlet。如果JSP文件的修改时间早于对应的servlet,那么容器就可以确定JSP文件没有被修改过并且servlet有效。 这使得整个流程与其他脚本语言相比要高效快捷一些。
3.JSP的生命周期
理解JSP的生命周期是理解JSP底层功能的关键。
JSP的生命周期包括以下几个阶段:

  • 编译阶段:servlet容器编译servlet源文件,生成servlet类;
  • 初始化阶段:加载与JSP对应的servlet类,创建其实例,并调用它的初始化方法;
  • 执行阶段:调用与JSP对应的servlet实例的服务方法;
  • 销毁阶段:调用与JSP对应的servlet实例的销毁方法,然后销毁servlet实例;
生命周期如下图所示:
(1)JSP编译
当浏览器发起请求时,JSP引擎将编译JSP文件。流程如下图:
有三个步骤:

  1. 解析JSP文件;
  2. 将JSP文件转化为servlet;
  3. 编译servlet;
这里,首先判断是不是第一次请求,如果是的话,也就是说JSP还没有被编译过,JSP引擎就把相应的JSP文件编译成servlet,生成字节码文件,并调用jspInit();如果不是第一次请求,说明已经有了字节码文件,那么就开始解析执行,调用jspServive()。
jspService()方法被调用来处理客户端的请求,对于每一个请求,JSP引擎将创建一个新的线程来处理请求。如果有多个客户端同时请求JSP文件,则JSP引擎将会创建多个线程,每个客户端对应一个线程。同时,servlet始终存在内存中,因此相应很快。
(2)JSP初始化
容器载入JSP文件后,它会在为请求提供任何服务前调用jspInit()方法。如果需要执行自定义的JSP初始化任务,复写jspInit()方法就行了,就像下面这样:
public void jspInit() {//init code
}

通常,程序只初始化一次。

(3)JSP执行
这一阶段描述了JSP生命周期中一切与请求相关的交互行为,直到被销毁。
当JSP页面完成初始化后,调用jspService()方法执行。
(4)JSP清理
JSP生命周期的销毁阶段描述了当一个JSP网页从容器中被移除时所发生的一切。
jspDestroy()方法在JSP中等价于servlet中的销毁方法。当您需要执行任何清理工作时复写jspDestroy()方法,比如释放数据库连接或者关闭文件夹等等。

JSP的结构和生命周期相关推荐

  1. React Native组件的结构和生命周期

    React Native组件的结构和生命周期 一.组件的结构 1.导入引用 可以理解为C++编程中的头文件. 导入引用包括导入react native定义的组件.API,以及自定义的组件. 1.1 导 ...

  2. JavaWeb(十)——jetty服务器、创建jsp项目、servlet生命周期及url的匹配规则

    文章目录 1. jetty服务器的下载与安装 1.1 jetty简介 1.2 jetty的下载与安装 2. idea创建jsp项目 3. idea给jsp项目导入jar包 4. 编写第一个servle ...

  3. jsp学习(1)jsp请求过程和生命周期

    一.服务器处理jsp请求的过程: 以下步骤表明了 Web 服务器是如何使用JSP来创建网页的: 1.浏览器发送一个 HTTP 请求给服务器. 2.Web 服务器识别出这是一个对 JSP 网页的请求,并 ...

  4. 微信小程序(文件组成 、目录结构、生命周期方法、AppId、组件(标签)、语法、事件、Api、开发工具)

    目录 AppID 文件组成 目录结构 app.json 其它全局配置链接 app.js app.wxss App 参考文档 生命周期方法 App.js中周期方法 onload(opt) onReady ...

  5. JSP四大作用域的生命周期

    servletContxt是Web的四大作用域中最大的,他的范围为整个web项目,ServletContext,是一个全局的储存信息的空间,服务器开始,其就存在,服务器关闭,其才释放. servlet ...

  6. 编程思考:对象生命周期的问题

    前情提要 只要写过 c/c++ 的项目的童鞋应该对对象生命周期的问题记忆犹新.怕有人还不理解这个问题,笔者先介绍下什么是生命周期的问题? 一个 struct 结构体生命周期分为三个步骤: 出生:mal ...

  7. IIS 7.0 的 ASP.NET 应用程序生命周期概述

    本主题介绍在 IIS 7.0 集成模式下运行以及与 .NET Framework 3.0 或更高版本一起运行的 ASP.NET 应用程序的应用程序生命周期.IIS 7.0 还支持经典模式,其行为类似于 ...

  8. 小汤学编程之JavaEE学习day02——Servlet使用步骤、生命周期、接收与返回数据、GET与POST、转发与重定向

    一.Servlet使用步骤 二.Servlet生命周期 三.Servlet接收与返回数据 四.GET请求与POST请求的区别 五.转发与重定向 一.Servlet使用步骤 servlet是运行在服务器 ...

  9. Fabric官方教程(release 2.2)翻译及总结——链码的生命周期管理

    1. 将智能合约部署到通道 将智能合约部署到信道最终用户通过调用智能合约来与区块链账进行交互.在Hyperledger Fabric中,智能合约以称为chaincode的软件包部署.想要验证交易或查询 ...

最新文章

  1. iOS中Block的基础用法
  2. 阿里云云计算ACP考试知识点(标红为重点)
  3. MMKV集成与原理,赶紧学起来
  4. 给我一对公钥和私钥,我就能破解此RSA
  5. 07-求解Ax=0:主变量、特解
  6. Keras验证集切分
  7. 将linux系统分区变成逻辑卷,linux运维基础知识-系统分区及LVM逻辑卷的创建
  8. 31个实用find命令的案例
  9. AIDA64 Extreme Edition(硬件检测)多国语言绿色特别版
  10. leetcode 打印从1到最大的n位数
  11. 采购者具体负责的问题
  12. 数显之家快讯:【SHIO世硕心语】2021,写给自己的几段宽心话!
  13. JDBC+MySQL入门增删改查案例
  14. App inventor打地鼠
  15. 国际禁毒日 | 和TcaplusDB一起向毒品say NO!
  16. 微信小程序之实现到商品列表跳转商品详情页
  17. 伯禹-公益AI学习打卡 Task02
  18. python在地图上标注点_怎样用python画地图上的标注线
  19. 零基础如何学习java,要学多久?
  20. 寒假训练十(map,pair,string)2020.02.17(4题)

热门文章

  1. Android System分区大小异常
  2. 前端开发常用正则表达式
  3. 线性表15|魔术师发牌问题和拉丁方阵 - 数据结构和算法20
  4. [Project Euler] 来做欧拉项目练习题吧: 题目017
  5. linux 挂载有数据硬盘分区,linux下磁盘分区、挂载知多少
  6. float与double类型参数区别_8大基本数据类型及包装类,不知道这些点别说自己是大佬...
  7. django1.5 连接mysql_django1.5.5使用mysql
  8. linux运维选择题,初学Linux练习题
  9. C++多线程快速入门(一):基本常用操作
  10. 简单的群体测试方案C++代码(Group testing against Covid-19)