JSP被生成java类编译及Tag解析过程
2011-03-11 11:58
519 查看
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.
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实现类的名称).
public void visit(Node.CustomTag n) throws JasperException { if (!n.implementsSimpleTag()) { String name = createTagHandlerPoolName( n.getPrefix(), n.getLocalName(), n.getAttributes(), n.hasEmptyBody()); n.setTagHandlerPoolName(name); if (!names.contains(name)) { names.add(name); } } visitBody(n); }
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.
相关文章推荐
- 保留weblogic中jsp编译后生成的java文件
- IntelliJ IDEA 编译JSP后生成的java文件所在路径
- tomcat问题,jsp页面无法编译,web页面一片空白,log显示空指针,在tomacat的work文件夹下没有生成相应的Java文件
- JSP编译成Servlet(一)语法树的生成——语法解析
- Java编译后生成的若干个class文件名称解析
- Java程序编译和运行过程图文解析
- 关于java从编译成class文件到加载再到初始化过程解析
- C++, Java和C#的编译、链接过程解析
- 解析四则表达式的编译过程及生成汇编代码
- Weblogic编译JSP生成Java文件的设置
- Jsp编译后生成的Java文件位置
- C++, Java和C#的编译过程解析
- [译]C++, Java和C#的编译过程解析
- IntelliJ IDEA 编译JSP后生成的java文件所在路径
- JSP编译成Servlet(一)语法树的生成——语法解析
- 保留weblogic 中jsp编译后生成的java文件
- 怎样查看Jsp编译后生成的Java文件
- C++, Java和C#的编译、链接过程解析
- C++, Java和C#的编译过程解析