Tomcat是如何將JSP代碼編譯成Servlet代碼的?
網(wǎng)友解答: 要知道tomcat如何將JSP編譯成Servlet,還得從源代碼入手。tomcat中,和jsp處理相關(guān)的功能都在org.apache.jasper包中,包中有一個JspC類,
要知道tomcat如何將JSP編譯成Servlet,還得從源代碼入手。
tomcat中,和jsp處理相關(guān)的功能都在org.apache.jasper包中,包中有一個JspC類,命名和java的編譯命令JAVAC有異曲同工之妙,我們在這個類里可以找到編譯JSP的相關(guān)代碼。
JspC.execute()方法是編譯的入口,我們來看看這個方法都是怎么做的。
首先是初始化工作,先初始化classloader 和 ServletContext,然后掃描所有的JSP文件。
接下來,就是將所有JSP文件編譯成Servlet了。processFile()方法,封裝了整個編譯過程,我們再來看看這個方法。
在這里,我們終于找到了編譯器(Compiler類),就要找到最終答案了!
org.apache.jasper.compiler.Compiler類是一個抽象類,它的核心方法是compile方法:
這里最重要的兩個步驟就是將JSP文件生成JAVA代碼,再將JAVA代碼編譯成class。
其中g(shù)enerateClass方法是抽象方法,由子類實現(xiàn),tomcat中有兩個Compiler的實現(xiàn):JDTCompiler和AntCompiler,這兩個類分別調(diào)用Eclipse JDT Compiler和Ant Compiler來編譯上一步生成的JAVA代碼。
以上就是tomcat將JSP文件編譯成Servlet的過程,希望能解答題主的疑惑。歡迎大家批評指正,如果喜歡請點贊,關(guān)注。
網(wǎng)友解答:寫servlet,就像做“填空”練習。做這個練習的規(guī)則就是servlet框架的容器規(guī)范。一般當首次調(diào)用某個servlet時,servlet容器的工具幾乎完全將你的“填空內(nèi)容”放到它的框子里,形成一個servlet類文檔,進而編譯為java的字節(jié)碼文檔。當然,這個工作也可以在首次調(diào)用之前預(yù)先完成。每次調(diào)用前都要檢測servlet源文件是否被改動了。這個中間的servlet類文檔是可見的。它的“生成過程”非常簡陋,幾乎沒有撿錯功能,不能認為是“編譯”過程。