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.