Spring源码分析【7】-Spring 模板页和JSP文件的编译

本文详细探讨了Spring中JSP文件的编译流程,从`JspServletWrapper.service`开始,经过`JspCompilationContext.compile`和`Compiler.generateJava`等关键步骤,直至生成`.class`文件并执行。文章深入分析了JSP到Java类的转换,包括判断文件是否过期、删除旧的编译文件,以及使用JDTCompiler进行编译的过程,最后执行生成的`.class`文件,完整展示了JSP请求的处理流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


org.apache.jasper.servlet.JspServletWrapper.service



org.apache.jasper.JspCompilationContext.compile



org.apache.jasper.JspCompilationContext.createCompiler



org.apache.jasper.compiler.Compiler.isOutDated

判断文件是否存在



..\Apache\apache-tomcat-8.0.36\work\Catalina\localhost\ROOT\org\apache\jsp\WEB_002dINF\views目录为空,故意删掉之前编译的jsp类文件



返回上一步


org.apache.jasper.JspCompilationContext.compile



org.apache.jasper.compiler.Compiler.compile


org.apache.jasper.compiler.Compiler.compile



org.apache.jasper.compiler.Compiler.generateJava


这个函数一直往下走到这一步:



org.apache.jasper.compiler.Compiler.setupContextWriter


jsp生成java类的关键代码

OutputStreamWriter osw = null;

        try {
            osw = new OutputStreamWriter(
                    new FileOutputStream(javaFileName), javaEncoding);
        } catch (UnsupportedEncodingException ex) {
            errDispatcher.jspError("jsp.error.needAlternateJavaEncoding",
                    javaEncoding);
        }


预先生成空文件占位


返回



org.apache.jasper.compiler.Generator.generate



org.apache.jasper.compiler.Generator.generatePostamble



到generatePostamble最后一行代码



org.apache.jasper.compiler.Generator.genCommonPostamble



org.apache.jasper.compiler.ServletWriter.printMultiLn


回到genCommonPostamble


popIndent



回到genCommonPostamble



回到generatePostamble


回到generate



回到generateJava


完成整个try过程,文件生成才完成



jsp生成的java文件



回到compile



下一步



org.apache.jasper.compiler.JDTCompiler.generateClass

编译.java文件为.class文件



下一步



下一步



下一步



下一步



下一步



下一步



下一步



终于编译完成



回到compile



回到compile



回到service



getServlet



第四步



(4) Service request



service



service



执行home_jsp.class文件



持续后退到doFilter



至此一个jsp的编译执行就完成了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值