您的位置:首页 > 编程语言 > Java开发

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实现类的名称).

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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: