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

来源:互联网 发布:哪里有免费的建模数据 编辑:程序博客网 时间:2024/05/29 10:32

 

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.

原创粉丝点击