三份以===================================================隔开
在本页浏览全文>>(共计4页)
从上面可以看出,HelloWorld.jsp在运行时首先解析成一个
Java类HelloWorld_jsp.java,该类继承于org.apache.jasper.runtime.HttpJspBase基类,HttpJspBase实现了HttpServlet接口。可见,JSP在运行前首先将编译为一个Servlet,这就是理解JSP技术的关键。
我们还知道JSP页面中内置了几个对象,如pageContext、application、config、page、session、out等,你可能会奇怪,为什么在JSP中的代码片断中可以直接使用这些内置对象。观察_jspService()方法,实际上这几个内置对象就是在这里定义的。在对JSP文件中的代码片断进行解析之前,先对这几个内置对象进行初始化。
首先,调用JspFactory的getDefaultFactory()方法获取容器实现(本文中指Tomcat 4.1.17)的一个JspFactory对象的引用。JspFactory是javax.servlet.jsp包中定义的一个抽象类,其中定义了两个静态方法set/getDefaultFactory()。set方法由
JSP容器(Tomcat)实例化该页面Servlet(即HelloWorld_jsp类)的时候置入,所以可以直接调用JspFactory.getDefaultFactory()方法得到这个JSP工厂的实现类。Tomcat是调用org.apache.jasper.runtime.JspFactoryImpl类。
然后,调用这个JspFactoryImpl的getPageContext()方法,填充一个PageContext返回,并赋给内置变量pageConext。其它内置对象都经由该pageContext得到。具体过程见上面的代码,这里不再赘述。该页面Servlet的环境设置完毕,开始对页面进行解析。HelloWorld.jsp页面仅仅定义了一个String变量,然后直接输出。解析后的代码如下:
代码清单3:JSP页面解析后的代码片断
String message = "Hello World!";
out.print(message);
======================================================================================================
把站点放在tomcat中运行,tomcat会把jsp文件生成java文件,并把它编译成class文件来使用,具体的位置在ApacheSoftware Foundation\Tomcat 6.0\work\Catalina\localhost中对应的站点目录中。
在jsp的<%@page%>指令中有一个可以使用的extends属性来指定jsp继承的基类。如果不指定这个extends属性,则在tomcat上,jsp默认是继承org.apache.jasper.runtime.HttpJspBase,它的声明如下:
public abstract class HttpJspBase
extends javax.servlet.http.HttpServlet
implements javax.servlet.jsp.HttpJspPage如果指定了extends,则可以让jsp继承自己的自定义的servlet类,但是这个servlet类如何写才能正确的输出jsp网页的内容呢?
先看一下tomcat为jsp网页自动生成的类
声明如下:
public final class Date_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent它的主要的方法:
public void _jspInit()
public void _jspDes
troy()
下面的这个方法是最主要的方法,所有的jsp网页的内容输出全部都是在这里写入输出流的。
public void _jspService(HttpServletRequest request, HttpServletResponse response)
throws java.io.IOException, ServletException_jspService方法是HttpJspBase实现的javax.servlet.jsp.HttpJspPage接口中的方法,另外的_jspInit()和_jspDestroy()是tomcat的org.apache.jasper.runtime.HttpJspBase类自定义的,但是org.apache.jasper.runtime.HttpJspBase实现的接口javax.servlet.jsp.HttpJspPage是继承自javax.servlet.jsp.JspPage接口,在这个接口中有两个方法jspDestroy()和jspInit()这两个方法应该是和tomcat的org.apache.jasper.runtime.HttpJspBase的_j