JSP被生成java类编译及Tag解析过程

本文详细介绍了JSP被编译为Servlet的过程,包括JspServletWrapper的service方法、Compiler的节点解析、Generator的Java代码生成、TagHandlerPool的初始化和CustomTag的处理。此外,还讨论了Tag定义文件(tld)的加载、TagLibraryInfoImpl对tld的解析以及如何从URI获取TLD资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

1. org.apache.jasper.servlet.JspServletWrapper

    jsp被编译成servlet,然后运行其service方法。

2. org.apache.jasper.compiler.Compiler

    解析jsp为node模型,对于每个node,生成相应的java代码。关于node模型体系,请在eclipse查看org.apache.jasper.compiler.Node类的子类体系。

 

3. org.apache.jasper.compiler.Generator

    将2中解析的node模型,传递给Generator.generate方法,生成java代码。

4. org.apache.jasper.compiler.Generator.compileTagHandlerPoolList(Nodes)

    此方法中,遍历每个node,如果不是SimpleTag类型,为此tag初始化TagHandlerPool名称(应该为Tag实现类的名称).

 

5. org.apache.jasper.compiler.Generator.GenerateVisitor

    在4中遍历了nodes,为每个非SimpleTag初始化了TagHandlerPool的名称后,然后用此遍历器对每个tag生成相应的java代码。在遇到非SimpleTag时,会生成调用它对应的TagHandlerPool的代码。关于Tag的生成代码,可以查看org.apache.jasper.compiler.Generator.GenerateVisitor.visit(CustomTag)方法的代码。

    关于如何为每个CustomTag找到对应的TagHandlerPool,见代码org.apache.jasper.compiler.Generator.GenerateVisitor.getTagHandlerInfo(CustomTag)及org.apache.jasper.compiler.Generator.TagHandlerInfo

 

apache jasper会对所有的非SimpleTag的实现类使用org.apache.jasper.runtime.TagHandlerPool进行池化。

6. 关于如何将Tag定义文件,比如.tld文件中定义的tag 实现类加载到编译好的jsp运行上下文中,见org.apache.jasper.compiler.TagFileProcessor。loadTagFiles()和loadTagFile()方法。

7. org.apache.jasper.compiler.Parse.parseTaglibDirective()和org.apache.jasper.compiler.TagLibraryInfoImpl类中解析tlds

将tld文件的<%@ taglib prefix="rbac" uri="http://rbac_console/WEB-INF/tags/t.tld" %> 中的uri转化成觉得文件url的代码,在org.apache.jasper.compiler.TagLibraryInfoImpl.generateTLDLocation(String, JspCompilationContext)中,紧接着会从JspCompilationContext。getResource()中获取,进而从JspCompilationContext中的ServletContext.getResource()获取URL.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值