我们知道jsp本质上上就是servlet,过去只知道tomcat帮我们完成了jsp向servlet的转化过程,却没有深入的去研究,现在就去研究一下转化过程 1.tomcat 的的拦截 很明显,既然tomcat帮我们完成
我们知道jsp本质上上就是servlet,过去只知道tomcat帮我们完成了jsp向servlet的转化过程,却没有深入的去研究,现在就去研究一下转化过程
1.tomcat 的的拦截
很明显,既然tomcat帮我们完成jsp向servlet的转换,必然要先拦截到该请求,通过观察tomcat的web.xml发现所有.jsp结尾的请求都会被交给jspservlet处理,jspservlet帮我们完成了转换
<servlet> <servlet-name>jsp</servlet-name> <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class> <servlet-mapping> <servlet-name>jsp</servlet-name> <url-pattern>*.jsp</url-pattern> <url-pattern>*.jspx</url-pattern> </servlet-mapping> </servlet>
2.转换后的jsp分析
(1) 当请求NewFile.jsp 这个jsp后会发现tomcat的work下生成了NewFile_jsp 的Java和class文件,
(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<Interface> | | javax.Servlet.jspPage<interface> (jspInit,jspDestory方法) | | javax.Servlet.HttpjspPage<interface> (jspService方法) | | HttpJspBase