JSP、servlet运行原理

2023-11-03

一、jsp和servlet的区别

         servlet是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。servlet本质是一个java类。

         JSP是Servlet的扩展,JSP没出现之前,就已经出现了Servlet技术.Servlet是利用了"输出流",动态的生成了HTML页面。
         由于Servlet中包含了大量的HTML标签、大量的静态文本及格式等,导致了Servlet的开发效率非常低下.
这时JSP诞生了,JSP弥补了这种情况,JSP通过在标准的THML页面中嵌入JAVA代码,使其静态的部分无需JAVA程序控制。

          当部署完项目并启动了Tomcat之后,你可以在Tomcat的work\Catalina\localhost\你项目名\org\apache\jsp
目录下找到index_jsp.class 和index_jsp.java这两个文件.其实index_jsp.java是一个特殊的Java类,实际上就是一个Servlet类。
        index_jsp.java 这个类继承HttpJspBase类,该类其实是Servlet的子类,所以其间接的继承了Servlet。

        总结: jsp的主要职责是页面显示; servlet的主要职责是控制器; jsp的本质就是servlet;

二、jsp和servlet的工作原理及生命周期      

        1、工作原理     

        JSP文件的执行过程: 1、 翻译,把*.jsp翻译成 *.java

                                             2、 把*.java编译成*.class

                                             3、 虚拟机,解释执行*.class文件

         servlet后缀本身就是.java  所以它执行过程只有jsp执行过程的后两步。

         每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理。JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet) ,然后按照servlet的调用方式进行调用。
    由于JSP第一次访问时会翻译成servlet,所以第一次访问通常会比较慢,但第二次访问,JSP引擎如果发现JSP没有变化,就不再翻译,而是直接调用,所以程序的执行效率不会受到影响。

          当一个JSP文件第一次被请求的时候,JSP引擎(本身也是一个Servlet)首先会把这个JSP文件转换成一个Java源文件。在转换过程中如果发现JSP文件有语法错误,转换过程将中断,并向服务端和客户端输出出错信息;如果转换成功,JSP引擎用javac把该Java源文件编译成相应的.class文件并将该.class文件加载到内存中。
          其次创建一个该Servlet的实例,并执行该实例的jspInit()方法(jspInit()方法在Servlet的生命周期中只被执行一次)。
          然后创建并启动一个新的线程,新线程调用实例的jspService()方法。(对于每一个请求,JSP引擎会创建一个新的线程来处理该请求。如果有多个客户端同时请求该JSP文件,则JSP引擎会创建多个线程,每个客户端请求对应一个线程)。

      2、生命周期       

      servlet的生成对象的时间点:
         1. <load-on-startup>1</load-on-startup>    ,则在tomcat启动的时候创建servlet对象
         2. 没有配置<load-on-startup>               , 在第一次访问servlet的时候创建对象

      Servlet默认是单例模式,一定对象创建成功,后面就重复使用同一个对象
 
      Servlet对象创建时,方法的执行顺序:
             1. 调用构造函数
             2. 调用init()
             3. 调用service()
                如果是http协议,service会根据请求的http的method,转到不同的方法中(如doGet ,doPost )

             4. 调用destroy()释放servlet资源(从Tomcat服务器移出servlet)
                servlet是web container管理的重要资源,web container从系统的性能考虑,当它认为servlet对象资源不重要时,会调用destroy()释放servlet对象

Servlet的构造函数与init()的作用区别?
      在构造函数中,无法获取ServletConfig对象;因为servletconfig对象还没初始化。
      如果想读取servlet的初始化参数信息,只能在init方法中进行;
 注意:
    web.xml的修改,会引发servlet的destroy(). 修改了web.xml后,最好是重启Tomcat
            




本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JSP、servlet运行原理 的相关文章

  • c++学习之虚析构和纯虚析构

    1 多态使用时 如果子类中有属性开辟到堆区 那么父类指针在释放时无法调用子类的析构代码 解决方法 将父类中的析构函数改为虚析构或者是纯虚析构 2 虚析构和纯虚析构共性 1 都可以解决父类指针无法释放子类对象的问题 2 都需要有具体的函数实现
  • vue.js水平时间轴_用Vue.js制作的简单水平时间轴组件

    vue js水平时间轴 Vue水平时间线 Vue Horizontal Timeline a simple horizontal timeline component made with Vue js 一个由Vue js制作的简单水平时间轴
  • happens-before原则与内存屏障

    1 happens before原则定义 编译器和处理器会对我们程序优化而进行指令重排 但需要保证前一个操作结果对后一个依赖操作可见 其实只是在单线程下能保证 否则就禁止指令重排 1 1 指令重排带来的问题 虽然指令重排满足happens
  • Angular 1.0 入门指南

    Angular 1 0 入门指南 1 angular 1 0 特点 数据双向绑定MVVM 隔离作用域 2 Angular 的作用域 scope scope rootScope 先来看一下 angular 的一般使用格式 作用域定义 模块注入
  • 解析最全的 Aspose.Words功能介绍,看这篇就够了

    Aspose Words 为用户提供了广泛的功能 用户可以执行大量与文档相关的任务 从简单地将文档从一种受支持的格式转换为另一种格式并在转换过程中修改这些文档到业务任务 例如创建结构化和视觉上吸引人的文档或自动报告 现代文档格式和标准很复杂
  • nslookup DNS 域名解析 故障排除

    nslookup是一个可以监测DNS服务器是否正常运行 且是否能正确解析域名的工具 参考文章 http www t086 com article 5138 常用方法 nslookup 某一域名A 服务器 正在工作的DNS服务器主机名 Add
  • 如何使用Jar命令将指定文件夹打包成Jar包

    一 场景描述 通常我们在进行项目开发的时候都会使用很多第三方封装的依赖 那么有时候团队内部也会编写一些工具类需要打包成Jar包供其他团队或项目使用 本文主要介绍如果使用jar命令打包指定文件夹下的文件 生成非可执行Jar包 二 Jar命令
  • JavaWeb笔记——JDBC

    1 JDBC综述 在开发中我们使用的是java语言 那么势必要通过java语言操作数 据库中的数据 这就是接下来要学习的JDBC 一套标准接口 1 SQL语句是操作数据库的唯一手段 容易犯错误的几个认知 Navicat与MySQL的关系 前
  • 中移链(基于EOS)DDC-SDK实战-如何集成中移链DDC-SDK

    本文档是关于中移链 DDC SDK 实战 即如何集成基于 EOS 的中移链 DDC SDK 的操作指南 适用于 BSN 开放联盟链 中移链 DDC SDK 开发者 帮助读者了解如何以平台方的角色集成中移链 DDC SDK 前言 2021年1
  • 7--归并排序

    思想 将待排序序列分为两个子序列 再将两个子序列递归的继续分下去 直到序列有序 即序列中只有一个元素 再把所有有序子序列逐层合并为一个整体有序序列 每次合并是将两个有序表合并成一个有序表 图示 具体实现 把待排序序列分为两个子序列 然后让子
  • CUDA中的常量内存__constant__

    GPU包含数百个数学计算单元 具有强大的处理运算能力 可以强大到计算速率高于输入数据的速率 即充分利用带宽 满负荷向GPU传输数据还不够它计算的 CUDA C除全局内存和共享内存外 还支持常量内存 常量内存用于保存在核函数执行期间不会发生变
  • 华为OD机试真题 Python 实现【股票最大收益】

    题目 假设知道某段连续时间内股票价格 计算通过买入卖出可获得的最大收益 输入一个大小为 n的数组price p1 p2 p3 pn pi是第i天的股票价格 pi的格式的格式为股票价格 非负整型 加上货币单位Y或者S 其中Y代表人民币 S代表
  • 模块化( export、import)

    模块化 模块化是指将一个大的程序文件 拆分成许多小的文件 然后将小文件组合起来 模块化的好处 模块化的优势有以下几点 1 防止命名冲突 2 代码复用 3 高维护性 模块化规范产品 ES6 之前的模块化规范有 1 CommonJS gt No
  • Windodws 常用dos命令

    r目录 1 打开黑窗口 1 1 正常打开黑窗口 2 2 管理员方式打开黑窗口 2 黑窗口常用命令总结 2 1 打开工具 2 2 操作计算机 2 3 查看计算机信息 补充 1 打开黑窗口 1 1 正常打开黑窗口 Win R 输入 cmd 可以
  • alter table add column多个字段_SQL对表中字段的操作 alter

    ALTER TABLE 语句用于在现有表中添加 删除或修改列 注意不同的数据库的语句有所不一样 增加和删除都基本一致 进行修改表中字段的时候注意 本文主要介绍 sqlserver mysql oracle sqlserver 修改字段数据类
  • 握手信号输入一倍,输出两倍[verilog]

    module one to two parameter WORD LEN 33 input clk input arst input WORD LEN 1 0 i din input i din valid output o din rea
  • Java--多线程(2)---yield

    yield yield 在Java的多线程中指的是礼让的意思 具体作用就是 停止当前正在执行的线程对象 去执行其他的线程 yield作用与相同优先级之间的线程 目的是让相同优先级的线程可以交替进行 yield有时也可能不会执行 举例 pub
  • Android NDK:在Android Studio下的基本开发步骤和基础知识点总结

    javah d jni新建文件名 classpath sdk路径 class 路径 class文件名 包括包名 d 输出目录 jni是gradle默认的路径 classpath jar的路径 有时碰到的找不到Activity的类的错误可能是
  • [算法整理]可能是最全的无监督/自监督单目深度估计方法汇总 - Part2:双目图像篇

    算法整理 可能是最全的自监督 无监督单目深度估计方法汇总 Part2 双目图像篇 背景 借着最近开题写开题报告的机会 比较细致地整理了一下之前看过的自监督单目深度估计相关的论文 合计了一下 感觉写篇综述有点太耗时耗力 干脆就在这里分享出来好
  • python 找出list列表中相同元素(指定元素)的所有索引

    有时需要获取列表中某一元素的所有索引 而获取列表元素索引的函数index只能返回第一个满足条件的元素的索引 此时我们可以通过两种方式获取其所有索引 1 将list转为array 对于array对象 可以使用如下方式获取某个元素的所有索引 n

随机推荐

  • background-position的使用方法

    这是在学习了阮一峰先生的博客后写的一篇解释笔记 附上原链接 CSS中背景图片的定位方法 CSS中的背景图片定位方法有三种 1 关键字定位 background position top left 2 像素定位 background posi
  • Unity Debug的简单封装

    对Unity Debug的简单封装 使用前提 Project Settings Player Other Settings Script Define Symbols添加 EnableLog 点击Apply 测试代码 using MTool
  • visual studio:C#工程项目生成项目时,默认将资源文件复制到输出目录

    参考 vs生成项目时 默认将资源文件复制到输出目录 总结 使用情况 通常是需要外部dll 不直接拷贝到运行目录 而是放到工程项目下 两种方式 1 生成事件里编写命令行 2 添加dll到项目目录 设置文件属性 复制到输出目录
  • 分布式搜索引擎Elasticsearch基础入门学习

    Elasticsearch介绍 Elasticsearh 是 elastic co 公司开发的分布式搜索引擎 Elasticsearch 简称ES 是一个开源的分布式 高度可扩展的全文搜索和分析引擎 它能够快速 近乎实时的存储 搜索和分析大
  • uni-app使用uView

    uni app使用uView 三配置前提 先安装uview 1 使用HBuilder创建uni app项目 这步过后就可以使用npm安装第三方组件了 cmd进入当前根目录执行 npm init y 执行后项目中会生成package json
  • 游戏开发unity插件Magica Cloth:学习贴汇总(持续更新)

    插件说明 高效的布料系统 支持jobs 开源 官方下载地址 https assetstore unity com packages tools physics magica cloth 160144 unity插件初步配置 BoneSpri
  • linux下载出现:Failed to connect to raw.githubusercontent.com port 443: Connection refused

    linux下载出现 Failed to connect to raw githubusercontent com port 443 Connection refused 原因 github域名被污染 解决方式 打开网站 https www
  • 【patchwork++】——PCA主成分分析法

    降维算法 gt 保留最大有用值信息 gt 换坐标轴 找坐标系 首先 去中心化 把坐标原点放在数据中心 然后 找坐标系 找到方差最大方向 数据线性变换 拉伸 旋转 注意 离群点对PCA影响较大 参考视频 用最直观的方式告诉你 什么是主成分分析
  • 一串首尾相连的珠子(m个),有n种颜色(n<=10) 设计一种算法去除其中一段,要求包含所有的N种颜色

    继续上代码 include
  • Hadoop3.2.1版本的环境搭建

    最近有人提出能不能发一些大数据相关的知识 No problem 今天先从安装环境说起 搭建起自己的学习环境 Hadoop的三种搭建方式以及使用环境 单机版适合开发调试 伪分布式适合模拟集群学习 完全分布式适用生产环境 这篇文件介绍如何搭建完
  • java xrunjdwp_Java远程断点调式 -Xdebug

    前言 我们在开发的过程中 难免会遇到调用别人机器上的代码 或者测试服务器上的代码 再调用过程中 难免会用到断点调式的功能 但是运行的不是本地的代码怎么办呢 现在我们就来了解下Java远程断点调用 需要 本地必须有源码 才能进行远程断点 一
  • Instant-ngp Windows11安装、使用记录

    Instant NeRF Study Debug 本机配置 Y9000P RTX3060 Win11 Instant NeRF Study Debug 1 Git 2 Cmake 3 instant ngp 示例数据 自定义数据 注意事项
  • 一次composer错误使用引发的思考

    一次composer错误使用引发的思考 2019 03 05 12 19 by 轩脉刃 阅读 评论 收藏 编辑 一次composer错误使用引发的思考 这个思考源自于一个事故 让我对版本依赖重新思考了一下 事故现象 一个线上的管理后台 一个
  • LeetCode题解——42.连续子数组的最大和(动态规划思想)

    题目地址 剑指 Offer 42 连续子数组的最大和 力扣 LeetCode 一 解题思路 在这道题中 数组连续是一个很重要的信息 我们可以创建一个数组用于记录每一位对应的最大值 所谓每一位的最大值 意思就是以这一位为结尾的数组的最大值 那
  • 面试过程中会遇到的机器学习教科书中 7 大经典问题

    如果希望了解机器学习 或者已经决定投身机器学习 你会第一时间找到各种教材进行充电 同时在心中默认 书里讲的是牛人大神的毕生智慧 是正确无误的行动指南 认真学习就能获得快速提升 但实际情况是 你很可能已经在走弯路 科技发展很快 数据在指数级增
  • SQL Server 基础语法2(超详细!)

    文章目录 选择数据库school 查询所有学生的学号 姓名和年龄 查询结果列项是中文名 查询 计算机 系的所有学生的基本信息 查询所有女同学的姓名及所在的系 显示结果不允许重复出现 查询课程号不为 1 4 或 7 的课程的信息 查询课程号不
  • 处理Matlab Coder之后, Compiler can't find "tmwtypes.h"问题

    作为一个强大的科学计算软件 matlab广泛应用于较多领域 以其简单的编程风格 便利的调试环境等众多优点 在编写算法与测试的时候通常用到 然而很多的实际运用上matlab毕竟还不是很普及 相反还是c与c 更多 同时正版matlab这样一个昂
  • Hive表的分区与分桶

    1 Hive分区表 Hive使用select语句进行查询的时候一般会扫描整个表内容 会消耗很多时间做没必要的工作 Hive可以在创建表的时候指定分区空间 这样在做查询的时候就可以很好的提高查询的效率 创建分区表的语法 create tabl
  • 论文阅读记录: Automatic Image Colorization sig16

    sig论文阅读记录 Let there be Color Joint End to end Learning of Global and Local Image Priorsfor Automatic Image Colorization
  • JSP、servlet运行原理

    一 jsp和servlet的区别 servlet是用Java编写的服务器端程序 其主要功能在于交互式地浏览和修改数据 生成动态Web内容 狭义的Servlet是指Java语言实现的一个接口 广义的Servlet是指任何实现了这个Servle