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