JSP运行原理分析

ANSYS MAXWELL内置式永磁同步电机(IPMSM)转矩最大时输入电流相位的确定 1.在转子转速为零时看一个周期内的转矩变化 阅读详情

JSP运行原理分析

我们在开发Java Web的过程中,可能有过这样的疑问,Tomcat是一个Servlet运行环境(容器),所有经过Tomcat的请求都是有一个servlet来处理的。servlet是一个Java类,可是jsp不是。那jsp又是怎么在Tomcat里面运行的呢?事实上,JSP是Servlet的一种特殊形式,每个JSP页面就是一个Servlet实例——JSP页面由系统编译成Servlet,Servlet再负责响应用户请求。JSP其实也是Servlet的一种简化,使用JSP时,其实还是使用Servlet,因为Web应用中的每个JSP页面都会由Servlet容器生成对应的Servlet。根据上面的分析,我们又有一个疑问:为什么说jsp就是一个Servlet,是根据什么来判定的呢?

  1. 为什么说jsp是Servlet?

首先我们在IntelljIdea里面编写一个简单的test.jsp页面

当启动Tomcat后,可以在Tomcat的\work\Catalina\localhost\ROOT\org\apache\jsp目录下找到如下文件

这两个文件便是test.jsp经过系统编译生成的对应的 .java文件和 .class文件,我们打开test_jsp.java文件

可以看到,这个test_jsp类继承了HttpJspBase这个类以及实现了org.apache.jasper.runtime.JspSourceDependent与org.apache.jasper.runtime.JspSourceImports这两个接口,我们知道判定一个类是Servlet的方法是看这个类是否间接或直接实现了Servlet接口,所以我们要看test_jsp这个类是否间接或直接实现了该接口,这里它并没有直接实现Servlet接口,所以现在我们还不能从这里看出test_jsp这个类就是一个Servlet,我们便可以猜想,会不会是HttpJspBase这个类实现了此接口呢。于是我们进一步分析HttpJspBase这个类的继承结构。

1.1HttpJspBase继承结构

 我们去查看HttpJspBase类的源码

从上面就可以看出,该类继承了HttpServlet,我们之前便知道HttpServlet间接实现了Servlet接口。如果不知道的我们可以在IntelljIdea里面将鼠标定位在HttpJspBase上面按住ctrl+alt+u查看他的继承关系图:

图 1-1 HttpJspBase继承关系

到这里我们便能清晰的知道为什么说jsp是一个Servlet了。

  1. Tomcat是如何处理jsp文件的?

经过上面的分析,我们已经知道了jsp就是一个Servlet。那jsp又是如何转换成Servlet的呢?我们在学习以前的学习中知道了我们写的每一个Servlet都需要在web.xml 文件里面的去做配置,这样浏览器才能访问得到这个Servlet。可是现在这个test.jsp并没有在我们项目的web.xml里面做任何配置,那浏览器是怎么访问到jsp页面的呢?回答这个问题之前我们先来了解一下Tomcat如何响应静态资源。

2.1 Tomcat如何响应静态资源?

2.1.1、全局web.xml解析

本质上讲,Tomcat对于所有的静态资源会做统一处理。也就是在所有你没有配置URL匹配的地方,Tomcat这个全局统一处理的配置就开始接管工作了。在Tomcat的conf目录下面我们可以看到有一个web.xml文件,打开后你会发现这样的说明:

在向下你会看到关于这个全局处理的Servlet声明,如下图

这个DefaultServlet的servlet-mapping是这样配置的:

到这里不禁有人会问,既然url-pattern 配置的是  / ,那不就应该可以响应所有的请求了吗?其实上面的图中已经给出了解释,事实上这是匹配所有你没有定义的Servlet-mapping的请求。之所以自己定义的Servlet可以优先生效,则是因为Tomcat内的Servlet   的mapping配置是严格按照声明顺序初始化,并按此顺序响应请求,一层层按此比对,有一个可以响应请求,就用其处理。有相关疑问可以参考一下博文:

http://k1121.iteye.com/blog/1564241

我们简单总结一下:所有经过Tomcat的请求都是有一个servlet来处理的。如果一个请求没有匹配到任何应用指定的servlet,那么就会流到Tomcat的默认的servlet来,这个Servlet名字叫做DefaultServlet,DefaultServlet是配置在/conf/web.xml里面。

2.2、Tomcat如何响应jsp请求?

上一节我们了解到Tomcat使用DefaultServlet处理所有的静态资源。这一节我们来看一个jsp请求又是怎么被响应的。同DefaultServlet类似,jsp的处理也不需要我们单独配置,而是在/conf/web.xml中做为全局配置存在。其对应的处理类为JspServlet,用于处理所有的jsp请求。同样我们打开/conf/web.xml,可以看到以下代码与注释

:

通过看注释我们便对该配置的作用一目了然,往下看我们会看到JspServlet的mapping配置,其url-pattern为*.jsp和*.jspx。所以它可以拦截所有的jsp请求并作出相应的反应。

到这里我们便知道了为什么浏览器在我们自己没对jsp文件做任何配置的情况下依旧能访问的原因。

2.3、jsp如何转换成Servlet?

在文章开头我们知道当Tomcat启动过后,一个xxx.jsp文件会在\org\apache\jsp目录下生成相应的xxx_jsp.java文件与xxx_jsp.class文件,打开我们之前已经生成的test_jsp.java 文件,这个文件结构如下图所示:

主要的转换动作是在方法_japService()中实现的,如下的Servlet类的代码截图可以看出,其中插入了session、application等对象的初始化,这几个对象都是通过页面级别的对象pageContext获取到的。

 

页面中的java代码去哪儿了呢,转换过程中,HTML页面元素内容可以理解为通过out.write()直接输出给前端页面,java代码(<%%>包含的内容)直接去掉<%%>写到类中执行。部分代码截图如下。

图中红色方框内的内容就是我们在jsp页面中<% %>中的Java代码。在转化中直接去除<% %>后放到类代码中,而其余的可以理解为直接out.write()输出给前端页面。至此我们便解释了Tomcat如何处理jsp文件的问题。

3.总结

本文对jsp的运行原理进行了详细的分析。我们可以得出下面的流程图:

图3-1 jsp页面工作原理图

根据上面的JSP页面工作原理图,可以得到如下结论:

    — JSP文件必须在JSP服务器内运行。

    — JSP文件必须生成Servlet才能执行。

JSP和Servlet会有如下转换:

    - JSP页面的静态内容、JSP脚本都会转换成Servlet的xxxService()方法,类似于自行创建Servlet时service()方法。

    - JSP声明部分,转换成Servlet的成员部分。所有JSP声明部分可以使用private,protected,public,static等修饰符,其他地方则不行。

    - JSP的输出表达式(<%= ..%>部分),输出表达式会转换成Servlet的xxxService()方法里的输出语句。

    - 九个内置对象要么是xxxService()方法的形参,要么是该方法的局部变量,所以九个内置对象只能在JSP脚本和输出表达式中使用。

深度学习在移动开发中的应用:实时姿态估计实战 我们将使用TensorFlow Lite框架,结合专为移动端优化的MoveNet模型,实现一个能够在主流Android设备上达到30FPS的多人姿态跟踪解决方案,并深入探讨其优化技巧和实际应用场景。特别是3D姿态估计、多人长期跟踪等前沿技术的发展,将进一步推动移动端姿态估计技术的应用深度和广度。在下一篇文章中,我们将探讨深度学习在移动端的另一个创新应用:实时手势识别,包括如何在资源受限的环境中实现复杂手势的实时识别,以及这项技术在AR/VR交互、智能家居控制等场景中的应用。第四部分:典型应用场景实现。 阅读详情

相关推荐

适合小白的超详细yolov8环境配置+实例运行教程,从零开始教你如何使用yolov8训练自己的数据集(Windows+conda+pycharm)

yolov8源码下载地址:GitHub - ultralytics/ultralytics: NEW - YOLOv8 🚀 in PyTorch > ONNX > OpenVINO > CoreML > TFLiteyolov8使用文档: Home - Ultralytics YOLOv8 Docs教学视频参考: 包会!YOLOv8训练自己的数据集_哔哩哔哩_bilibili先用conda prompt创建一个虚拟环境,我的叫yolov8, python版本用3.10 源码地址:GitHub - ul

CV在读 25万+

Jsp概述

首先什么是JSP(java Service Page) java Service Pagejava服务器页面,用来处理一些java前后端交互的数据,主要用来显示数据,不建议大量代码写在JSP里面。 特点: 简单和HTML差别不大 书写页面会很乱,HTML代码和java交错 JSP的执行过程 1.动态请求会被分发到Web服务器中 2.容器会去执行字节码文件,就是.class文件 3.Servle...

xupt_rl的博客 335

国产操作系统应用迁移与适配

了解国产操作系统的背景及意义

2301_77609559的博客 2678

HttpJspBase 源代码

HttpJspBase  属于jasper包   packageorg.apache.jasper.runtime;   import java.io.IOException;//IO异常 import javax.servlet.ServletConfig;//小服务程序配置 import javax.servlet.ServletException;//小服务程序异常 impo

代码艺术 2914

Ubuntu 18.04下Freesurfer 7.2.0安装全攻略:从下载到环境配置一步到位

本文详细介绍了在Ubuntu 18.04系统上安装Freesurfer 7.2.0的完整流程,包括系统准备、依赖安装、下载解压、环境配置、许可证获取及性能优化。Freesurfer作为神经影像分析的重要工具,支持皮层重建和体积分割等复杂任务,适用于阿尔茨海默症等神经系统疾病研究。指南还提供了常见问题解决方案和实际应用案例,帮助用户快速搭建高效的神经影像分析平台。

omega的博客 996

磁感应强度B、磁场强度H、矢量磁位A的study

学完电磁场很久了但是对电磁场中磁感应强度B⃗\vec{B}B、磁场强度HHH、矢量磁位A⃗\vec{A}A,这几个变量所表征的含义一直很模糊,所以就总结了一下

sinat_42386289的博客 1万+

重识JSP

在自己的初步接触到JSP时认为JSP就像是MVC中的View层一样是专门用来进行显示的,经过这段时间的学习,对JSP有了一个新的认识,JSP并不想自己认识的那样简单,下面就深入的学习一下JSP。

淡泊明志,宁静致远 934

海思芯片OpenHarmony系统移植:Sensor传感器模块HDF驱动配置HCS文件详解

海思系列芯片的传感器模块通过HDF(Hardware Driver Foundation)驱动框架进行管理和配置。传感器HCS(HDF Configuration Source)配置文件定义了各类传感器的硬件参数、总线配置、寄存器序列等信息,为传感器驱动提供必要的初始化和运行参数。海思系列芯片适配OpenHarmony的传感器HDF配置HCS文件是传感器驱动开发的关键部分,通过合理配置可以实现各种传感器设备的驱动支持。

m0_67505153的博客 209

WEB-js2

JSP页面翻译成的Servlet继承了org.apache.jasper.runtime.HttpJspBase类,HttpJspBase类是HttpServlet的一个子类,因此JSP页面翻译成的Servlet是HttpServlet的一个孙子类。HttpJspBase类实现了javax.servlet.jsp.HttpJspPage接口中的部分方法,因此,HttpJspBase类是抽象的。

一纸淡然 438

Maestro 薛定谔软件简单分子对接案例

#参考:Maestro 薛定谔软件使用:Maestro 薛定谔对接:sid=287811。

weixin_42357472的博客 1万+

TI Sitara系列AM64x开发板(双核ARM Cortex-A53)软硬件规格书

创龙科技TL64x-EVM是一款基于TI Sitara系列AM64x双核ARM Cortex-A53 + 单/四核Cortex-R5F + 单核Cortex-M4F多核处理器设计的高性能评估板,由核心板和评估底板组成。评估板接口资源丰富,引出5x Ethernet(两路支持TSN)、2x CAN-FD、多路UART、多路DI/DO、GPMC、PCIe、USB等接口,板载WIFI模块,支持4G/5G模块、NVME硬盘,可选配外壳直接应用于工业现场,方便用户快速进行产品方案评估与技术预研。

创龙,嵌入式一体化解决方案商 727

JavaWeb-JSP

JSP全称为Java Server Pages即Java服务器页面,主要作用是代替Servlet程序回传HTML页面的数据,因为Servlet程序回传HTML页面数据非常繁琐,开发成本和维护成本较高。创建jsp文件流程:在webapp文件夹下new->JSP/JSPXjsp页面的访问和html页面一样,都是存放在web目录下a.html页面访问方式:http://ip:port/工程路径/a.htmlb.jsp页面访问方式:http://ip:port/工程路径/b.jsp。

Ego_Ekko的博客 811

SAP Fiori Elements 扩展实战:UI 层扩展、OData 服务扩展、CDS 视图增强及全流程案例

UI 层扩展主要关注在不修改标准生成界面的基础上,自定义用户界面元素和交互逻辑。典型需求包括:在现有 Fiori Elements 界面上添加新的字段(如表格列或表单项)、增加自定义按钮并绑定操作、以及通过控制器扩展加入事件处理等。无论在 RAP 还是传统 BOPF 架构下,前端 UI 扩展通常采用 SAPUI5 提供的**扩展点(Extension Points)和控制器扩展(Controller Extension)**机制来安全地插入自定义代码。下面分别说明两种后端架构下 UI 扩展的实现方式。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 902

jsp底层运行原理分析

新手学习jsp分析流程

a3263298665的博客 1411

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

spring boot 运行jsp原理分析

Spring-boot运行jsp原理分析   结论: 启动server的时候会创建临时目录 在浏览器中访问jsp文件的时候通过内置Tomcat将jsp转换为java,保存在临时目录中 然后编译为class文件,保存在临时目录中。   分析过程如下: 编码阶段:   1、官方不推荐在spring-boot中使用jsp文件。 如果要使用,需要添加jasper依赖:  

leehoward 779

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

javaweb jsp文件的运行原理分析

在javaweb中, servlet的作用是处理逻辑, 控制流程, (相当于厨师) , 而jsp的作用就是前端显示, 它简化了我们对页面中 标签内容的书写, (相当于传菜员) 我们在 servlet中做好了处理, 并拿到结果之后, 通过请求转发机制, 把结果放在 request 作用域对象中传递给jsp页面进行显示 那么, jsp是怎么运行的呢, 实际上, jsp就是一个servlet 当http服务器运行的时候, 它会把其中的 jsp 文件,解析成一个 servlet类 我们来找一下, jsp的解析文件

hjh15827475896的博客 703

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

jsp运行原理分析

一、原理图: 二、jsp访问过程 如果是第一次访问jsp文件,被服务器翻译成一个对应的Java文件(sevlet),然后,再被编译成.class文件并加载到内存中。如果是第二次访问jsp,那就可以直接调用内存中的jsp实例,所以之后的访问jsp速度会比之前快一些。 三、jsp页面中的HTML排版标签是如何被发送到客户端的? 分享链接:http://www.360doc.com/...

weixin_33901843的博客 129

JSP运行原理以及执行过程源码分析

我们在开发Java Web的过程中,可能有过这样的疑问,当我们编写jsp页面时,不用引用不用创建就可以使用request、session、application对象,当使用浏览器访问JSP页面时,查看页面源码发现java代码都消失了,这都是为什么呢。 首先我们看下面的流程图,了解JSP在WEB容器中的变化过程:而上面我们的所有疑问都在下面的第2步可以找到答案。          第2步

爱清清的专栏 4423

深入分析JavaWeb 12 -- jsp运行原理与基本语法

一、什么是JSP?  JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。      JSP这门技术的最大的特点在于,写jsp就像在写html,但它相比html而言,html只能为用户提供静态数据,而Jsp技术允许在页面中嵌套java代码,为用户提供动态数据。二、JSP运行原理2.1、Web服务器是如何调用并执行一个js

z742182637的博客 367

jsp显示服务器文件结构,JSP程序运行原理、文档结构及简单输入输出实例分析

本文实例讲述了JSP程序运行原理、文档结构及简单输入输出。分享给大家供大家参考。具体如下:目标:掌握Web应用的文档结构;掌握JSP的运行原理;掌握JSP的简单输入和输出。主要内容:通过一个简单实例介绍Web应用的文档结构和运行原理;通过一个简单的注册功能介绍基本的输入输出。实现内容:客户端验证。1、 文档结构每个应用都有一个根目录,例如ch2;理论上可以放在任何地方,但是需要配置,简单的做法,直...

weixin_39625747的博客 554

深入分析JavaWeb Item12 -- jsp运行原理与基本语法

一、什么是JSP?  JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。      JSP这门技术的最大的特点在于,写jsp就像在写html,但它相比html而言,html只能为用户提供静态数据,而Jsp技术允许在页面中嵌套java代码,为用户提供动态数据。二、JSP运行原理2.1、Web服务器是如何调用并执行一个js

小平果的欢乐谷 1303

JSP标签在tomcat中的运作原理

转自:http://www.educity.cn/wenda/68175.html JSP标签在tomcat中的运行原理   在网上找了很多关于jsp标签的文章,但大多数都是只是告诉你怎么去使用,怎么去编写一个jsp标签。几乎没有可以从源头上告诉你怎么去理解原理,它在tomcat中又是怎么样的呢?所以我花一点时间整理一编关于jsp标签原理的文章,如有什么不周祥之处还望各位大侠谅解。

DADADIE的专栏 1702

jsp的运行原理及使用

JSP:Java Server Pages (Java服务器端页面),其实就在HTML中嵌入Java代码。 1.1.1.1 为什么学习JSP SUN公司提供了动态网页开发技术:Servlet。Servlet自身有一些缺点,SUN公司发现了这些问题,推出了一个新的动态网页开发技术JSP。 Servlet的缺点: l Servlet需要进行配置,不方便维护 l Servlet很难向网页中输出

反正我不管,就爱陈旭员 509

JSP的工作原理和运行流程

注意关于JSP和Javaweb容器的不错的网站:https://blog.youkuaiyun.com/yw_1207/article/details/78706701   JSP起源 在很多动态网页中,绝大部分内容都是固定不变的,只有局部内容需要动态产生和改变。  如果使用Servlet程序来输出只有局部内容需要动态改变的网页,其中所有的静态内容也需要程序员用Java程序代码产生,整个Servlet...

qq_37807989的博客 1044

简单介绍分析一下JSP所生成的Servlet代码

以HelloWorld3.jsp为例 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> &l

daqi1983的博客 577

WEB19_JSP

从前边的博文中,我们已经使用过JSP代替Html了。 JSP其实是Servlet,我们可以在Tomcat的work下面查看jsp转换后的java文件 打开就可以看到转换后的jsp文件,其实就是一个servlet文件。 在这个方法中_jspService(其实就是service()方法),我们在这个方法中写servlet JSP历史 第一时期 Java设置动态页面的时候都是使用ser...

qq_38827988的博客 191
上一篇: ArrayList源码分析之 add 方法
下一篇: Java代理模式实现与原理详解(一)
zcczero
博客等级 码龄9年 38粉丝 24原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值