jsp转化servlet流程

我们知道jsp本质上上就是servlet,过去只知道tomcat帮我们完成了jsp向servlet的转化过程,却没有深入的去研究,现在就去研究一下转化过程

1.tomcat 的的拦截

很明显,既然tomcat帮我们完成jsp向servlet的转换,必然要先拦截到该请求,通过观察tomcat的web.xml发现所有.jsp结尾的请求都会被交给jspservlet处理,jspservlet帮我们完成了转换
 
        jsp
            org.apache.jasper.servlet.JspServlet
        
            jsp
            *.jsp
            *.jspx
        
 

2.转换后的jsp分析

(1) 当请求NewFile.jsp 这个jsp后会发现tomcat的work下生成了NewFile_jsp 的Java和class文件,
clipboard.png

(2)打开这个NewFile_jsp.java发现它已经被转化为servlet,并且继承了HttpJspBase这个类
public final class NewFile_jsp extends org.apache.jasper.runtime.HttpJspBase
(3)HttpJspBase这是tomcat中的类,我把romcat源码导入项目看看HttpJspBase的实现,发现它继承了HttpServlet并实现了HttpJspPage接口,代码如下:可以看到其实就是实现了servlet接口中的那几个方法。它的init destory 方法中又分别调用了继承自Httpservlet中的初始化和销毁方法和来自jsppage接口中的初始化和销毁方法(前者是容器帮我们自动初始化完成必要的环境配置,后者是用户自定义初始化),service方法是实现了Httpjsppage中的_jspService(request, response)
public abstract class HttpJspBase extends HttpServlet implements HttpJspPage{
     public final void init(ServletConfig config) throws ServletException {
        super.init(config);
        this.jspInit();
        this._jspInit();
    }

    public String getServletInfo() {
        return Localizer.getMessage("jsp.engine.info");
    }

    public final void destroy() {
        this.jspDestroy();
        this._jspDestroy();
    }

    public final void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this._jspService(request, response);
    }

    ......
    ......
}

3.继承关系图

根据以上信息,大致能了解到jsp转化过程中的接口和类如下

    javax.Servlet.Servlet
            |
            |
    javax.Servlet.jspPage     (jspInit,jspDestory方法)
            |
            |
    javax.Servlet.HttpjspPage  (jspService方法)
            |
            |
       HttpJspBase

你可能感兴趣的:(servlet,jsp)