在学习Servlet时,我们知道Tomcat能够从客户端的请求URL中提取出Web应用程序目录(/ServletStudy)和Servlet匹配的URL(/firstServlet)。
如果我们使用如下URL访问jsp文件,Tomcat会如何处理呢?
http://localhost:8080/JspStudy/JspFile/first.jsp
Tomcat同样可以从以上URL中提取出Web应用程序目录(/JspStudy)和jsp文件所在的目录(/JspFile/first.jsp),这样Tomcat就能准确定位jsp文件的位置,即
<Tomcat安装目录>\webapps\JspStudy\JspFile\first.jsp
既然Tomcat找到了即将被访问的jsp文件,那么它会如何处理这个jsp文件呢?
先让我们来看下面一段配置片段:
<!--这段代码来自<Tomcat安装目录>\conf\web.xml--> <servlet> <servlet-name>jsp</servlet-name> <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class> <init-param> <param-name>fork</param-name> <param-value>false</param-value> </init-param> <init-param> <param-name>xpoweredBy</param-name> <param-value>false</param-value> </init-param> <load-on-startup>3</load-on-startup> </servlet> <servlet-mapping> <servlet-name>jsp</servlet-name> <url-pattern>*.jsp</url-pattern> <url-pattern>*.jspx</url-pattern> </servlet-mapping>
很明显,这是配置了一个Servlet,该Servlet的名字是jsp,对应的Servlet类是JspServlet,匹配的url是“*.jsp、*.jspx”,即所有以“.jsp、*.jspx”结尾的请求全部交给JspServlet。
(我们假定这是首次访问first.jsp)
1、把jsp文件编译成Servlet源文件 JspServlet把first.jsp编译成一个名为first_jsp.java的Java源文件。 2、把Servlet源文件编译成class文件 Servlet引擎调用Java编译器把first_jsp.java编译成first_jsp.class文件 3、装载first_jsp.class文件并作出响应//first_jsp.java和first_jsp.class文件所在的目录 <Tomcat安装目录>/work/Catalina/localhost/JspStudy/org/apache/jsp(我们假定这是第n次访问first.jsp,n >= 2) 因为不是首次访问,所以 first_jsp.java和first_jsp.class已存在。 1、检查first.jsp是否被修改 如果被修改过,则重新编译、生成 first_jsp.java和first_jsp.class,再执行下一步。 否则,直接执行下一步。 2、装载first_jsp.class,并作出响应。 补充: 1、总是检测jsp文件是否被修改而造成性能下降 解决方式:
<!--这段代码来自<Tomcat安装目录>\conf\web.xml--> <servlet> <servlet-name>jsp</servlet-name> <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class> <!--添加如下参数--> <init-param> <param-name>development</param-name> <param-value>false</param-value> </init-param> <load-on-startup>3</load-on-startup> </servlet>2、Tomcat如何判断jsp文件是否被修改过? 待更新。。。。。。