众所周知,jsp本质就是servlet。我在一开始就是完全靠死记硬背的,根本不知道其中的缘由。也是最近看一些jsp教学视频才彻底地明白这句话的意思。所以编写这篇文章,希望可以帮助还不知道的小伙伴。
1、jsp编译后的格式及存储的位置
我们都知道当程序进行编译后会将java文件编译成class文件。那么jsp格式的文件会编译成什么样式呢?又会存储到哪里呢?首先,我们服务器使用的是Tomcat,jsp文件就使用最基本的index.jsp。当一个项目部署到Tomcat后,运行时会在Tomcat根目录下面的\webapps\ROOT下面生成我们项目对应的war包(解压后)。在项目war包下可以看到index.jsp文件,很显然这不是我们要找的。真正的index.jsp其实是被编译到Tomcat根目录下的\work\Catalina\localhost\ROOT\org\apache\jsp目录下,在这里我们可以看到index_jsp.java和index_jsp.class2个文件
我们打开.java文件看看里面到底是如何实现。
//index_jsp类继承了HttpJspBase,实现了JspSourceDependent和JspSourceImports 接口
public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent,
org.apache.jasper.runtime.JspSourceImports
同时还有2个方法比较熟悉,分别是初始化_jspInit()和销毁_jspDestroy(),看到这2个方法小伙伴们是否觉得很熟悉呢?
public void _jspInit() {
}
public void _jspDestroy() {
}
没错,它还有_jspService()方法,看到这里就更熟悉了,这。。这。。这不就是跟Servlet接口里的方法一样嘛。
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
}
2、证明jsp就是Servlet
根据上面继承的HttpJspBase就可以找到jsp就是Servlet的铁证,首先我们要先导入org.apache.jasper.runtime.HttpJspBase的jar包,那么我们就可以偷窥人家的代码,一探究竟啦!
<!-- 这个就是HttpJspBase的坐标 -->
<dependency>
<groupId>tomcat</groupId>
<artifactId>jasper-runtime</artifactId>
<version>5.5.23</version>
</dependency>
我们点击HttpJspBase中可以看到该类继承了HttpServlet,有的小伙伴看到这里已经明白了,为啥jsp就是Servlet啦。但是做事有始有终,说是Servlet那么就必须见到Servlet这个接口。
public abstract class HttpJspBase extends HttpServlet implements HttpJspPage {
}
那么它来啦,带着礼物走来啦。根据以下的代码就可以清楚看到Servlet这个接口
// 别问,问就是往里点
public abstract class HttpServlet extends GenericServlet{
}
// 我点,我点,我点点点
public abstract class GenericServlet
implements Servlet, ServletConfig, java.io.Serializable{
}