Tomcat是如何将JSP代码编译成Servlet代码的?
网友解答: 要知道tomcat如何将JSP编译成Servlet,还得从源代码入手。tomcat中,和jsp处理相关的功能都在org.apache.jasper包中,包中有一个JspC类,
要知道tomcat如何将JSP编译成Servlet,还得从源代码入手。
tomcat中,和jsp处理相关的功能都在org.apache.jasper包中,包中有一个JspC类,命名和java的编译命令JAVAC有异曲同工之妙,我们在这个类里可以找到编译JSP的相关代码。
JspC.execute()方法是编译的入口,我们来看看这个方法都是怎么做的。
首先是初始化工作,先初始化classloader 和 ServletContext,然后扫描所有的JSP文件。
接下来,就是将所有JSP文件编译成Servlet了。processFile()方法,封装了整个编译过程,我们再来看看这个方法。
在这里,我们终于找到了编译器(Compiler类),就要找到最终答案了!
org.apache.jasper.compiler.Compiler类是一个抽象类,它的核心方法是compile方法:
这里最重要的两个步骤就是将JSP文件生成JAVA代码,再将JAVA代码编译成class。
其中generateClass方法是抽象方法,由子类实现,tomcat中有两个Compiler的实现:JDTCompiler和AntCompiler,这两个类分别调用Eclipse JDT Compiler和Ant Compiler来编译上一步生成的JAVA代码。
以上就是tomcat将JSP文件编译成Servlet的过程,希望能解答题主的疑惑。欢迎大家批评指正,如果喜欢请点赞,关注。
网友解答:写servlet,就像做“填空”练习。做这个练习的规则就是servlet框架的容器规范。一般当首次调用某个servlet时,servlet容器的工具几乎完全将你的“填空内容”放到它的框子里,形成一个servlet类文档,进而编译为java的字节码文档。当然,这个工作也可以在首次调用之前预先完成。每次调用前都要检测servlet源文件是否被改动了。这个中间的servlet类文档是可见的。它的“生成过程”非常简陋,几乎没有捡错功能,不能认为是“编译”过程。