JSP被生成java類編譯及Tag解析過程

 

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.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章