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

简介: 我们知道java虚拟机只认识class文件,要在虚拟机上运行就必须要遵守class文件格式,所以JSP编译成servlet后还需要进一步编译成class文件,但从JSP文件到java文件再到class文件的过程需要考虑的事情比较多,其中一个比较重要的就是调试问题,由于语法不一样,jsp某行执行的逻辑怎样与java文件对应起来,这样在JVM执行过程发生异常或错误才能找到JSP对应的行,提供一个友好的调试信息。

我们知道java虚拟机只认识class文件,要在虚拟机上运行就必须要遵守class文件格式,所以JSP编译成servlet后还需要进一步编译成class文件,但从JSP文件到java文件再到class文件的过程需要考虑的事情比较多,其中一个比较重要的就是调试问题,由于语法不一样,jsp某行执行的逻辑怎样与java文件对应起来,这样在JVM执行过程发生异常或错误才能找到JSP对应的行,提供一个友好的调试信息。类似的,jsp文件名编译后的java文件名同样也要有映射关系。

    总的来说,为了解决从非java语言到java语言调试时文件名及行号映射的问题,java community process组织提出了JSR-45(Debugging Support for Other Languages)规范,它为非java语言提供了一个进行调试的标准机制。这里的JSP其实就是属于非java语言,JSP如果想要方便开发者开发,它就必须要遵循JSR-45规范。其实可以简单的说就是为了解决JSP编译后的java文件与JSP文件的对应关系,而且是提供一个统一的标准,从而避免不同厂商有不同的实现方式。

JSR-45规范的核心对象是资源映射表(Source Map),简称SMAP。在这里它是指JSP文件文件名及行号的映射表,这个映射表存放到class文件中,在基于JPDA的调试工具中就可以通过此映射表获取到对应JSP文件及行号,向开发者提示对应JSP文件的信息。

接下去以前面的HelloWorld.jsp例子看看SMAP映射表是如何映射的,HelloWorld.jsp文件被编译后变成HelloWorld_jsp.java文件,根据JSR-45的规范最终我们会生成一份如下的映射表,这里不打算探究SMAP的整个语法,只专注行号映射相关的部分,即从*L*E中间的内容,其中1,10:62表示HelloWorld.jsp文件与HelloWorld_jsp.java的映射关系为1-622-633-64...10-71。同样的,10,3:72表时的对应关系为10-7211-7312-74。有了这些映射表就可以方便地将java执行的行号与JSP的行号对应起来了。

SMAP

HelloWorld_jsp.java

JSP

*S JSP

*F

+ 0 HelloWorld.jsp

HelloWorld.jsp

*L

1,10:62

10,3:72

*E

说完SMAP,我们已经知道生成的SMAP的格式,那么要如何保存?保存到哪里呢?因为JVM只会通过Class文件去加载相关信息,所以唯一的办法是通过class文件附带SMAP消息,class文件格式中可以附带信息的就只有属性表集合,在class文件格式中其他数据项都有严格的长度、顺序和格式,而属性列表集合则没有严格要求,只要属性名不与已有属性冲突即可,任何人都可以往class文件的属性列表中写入自定义的属性,虚拟机会自动忽略不认识的属性,所以我们需要在支持调试信息的JVM中附带此属性,这里的属性名称就是SourceDebugExtension属性。这个属性的结构如下,首先2个字节表示名称的索引值,接着4个字节表示属性长度,最后一个数组表示属性值。按照格式写入class文件JVM即可识别。

SourceDebugExtension_attribute {

u2 attribute_name_index;

u4 attribute_length;

u1 debug_extension[attribute_length];

}

通过JSR45标准解决了JSPjava之间的映射关系问题,从而让调试更加方便。在Java的世界中为了达到统一而又不失灵活,基本都是由java community process制定规范然后由厂商按照规范进行实现。


点击订购作者《Tomcat内核设计剖析》



目录
相关文章
|
2月前
|
Java Linux
java基础(3)安装好JDK后使用javac.exe编译java文件、java.exe运行编译好的类
本文介绍了如何在安装JDK后使用`javac.exe`编译Java文件,以及使用`java.exe`运行编译好的类文件。涵盖了JDK的安装、环境变量配置、编写Java程序、使用命令行编译和运行程序的步骤,并提供了解决中文乱码的方法。
50 2
|
30天前
|
Java 容器
【学习笔记】Jsp与Servlet技术
【学习笔记】Jsp与Servlet技术
61 0
|
28天前
|
分布式计算 大数据 Java
大数据-86 Spark 集群 WordCount 用 Scala & Java 调用Spark 编译并打包上传运行 梦开始的地方
大数据-86 Spark 集群 WordCount 用 Scala & Java 调用Spark 编译并打包上传运行 梦开始的地方
17 1
大数据-86 Spark 集群 WordCount 用 Scala & Java 调用Spark 编译并打包上传运行 梦开始的地方
|
18天前
|
IDE Java 编译器
Java:如何确定编译和运行时类路径是否一致
类路径(Classpath)是JVM用于查找类文件的路径列表,对编译和运行Java程序至关重要。编译时通过`javac -classpath`指定,运行时通过`java -classpath`指定。IDE如Eclipse和IntelliJ IDEA也提供界面管理类路径。确保编译和运行时类路径一致,特别是外部库和项目内部类的路径设置。
|
19小时前
|
SQL XML 缓存
java中jsp详解!!!
JSP(Java Server Pages)是一种动态网页技术标准,允许在HTML页面中嵌入Java代码,实现网页逻辑与设计分离。JSP本质上是Servlet的简化,支持跨平台运行。JSP通过内置对象(如request、response、session等)和指令(如page、include、taglib)提供强大的功能,同时利用EL表达式和JSTL标签库简化页面开发。JSP的核心优势在于快速开发和维护Web应用。
5 0
|
23天前
|
小程序 Oracle Java
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
这篇文章是关于JVM基础知识的介绍,包括JVM的跨平台和跨语言特性、Class文件格式的详细解析,以及如何使用javap和jclasslib工具来分析Class文件。
33 0
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
|
2月前
|
IDE Java 编译器
lombok编译遇到“找不到符号的问题”
【9月更文挑战第18天】当使用 Lombok 遇到 “找不到符号” 的问题时,可能是由于 Lombok 未正确安装、编译器不支持、IDE 配置不当或项目构建工具配置错误。解决方法包括确认 Lombok 安装、编译器支持,配置 IDE 和检查构建工具配置。通过这些步骤通常可解决问题,若问题仍存在,建议检查项目配置和依赖,或查看日志获取更多信息。
376 2
|
3月前
|
SQL Java 数据库
jsp中使用Servlet查询SQLSERVER数据库中的表的信息,并且打印在屏幕上
该博客文章介绍了在JSP应用中使用Servlet查询SQL Server数据库的表信息,并通过JavaBean封装图书信息,将查询结果展示在Web页面上的方法。
jsp中使用Servlet查询SQLSERVER数据库中的表的信息,并且打印在屏幕上
|
3月前
|
存储 安全 Java
深入探讨Java的分层编译
本文主要探讨Java虚拟机(JVM)中的分层编译(Tiered Compilation)机制及其对程序性能的影响。
|
3月前
|
缓存 安全 Java
Java服务器端技术:Servlet与JSP的集成与扩展
Java服务器端技术:Servlet与JSP的集成与扩展
32 3