首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > JavaScript >

jsp运作原理

2012-11-25 
jsp运行原理47.48. out.println(HelloWorld!)49.50. out.write(\r\n)51.out.write(/body\r\n)5

jsp运行原理

47.

48. out.println("HelloWorld!");

49.

50. out.write("\r\n");

51.out.write("</body>\r\n");

52.out.write("</html>");

53. } catch (Throwable t) {

54. if (!(t instanceofSkipPageException)){

55. out = _jspx_out;

56. if (out != null&& out.getBufferSize() !=0)

57. out.clearBuffer();

58. if (_jspx_page_context != null)_jspx_page_context.handlePageException(t);

59. }

60. } finally {

61. if (_jspxFactory != null)_jspxFactory.releasePageContext(_jspx_page_context);

62. }

63. }

64.}

???代码的第5行,导入javax.servlet.jsp包中所有的类,与JSP相关的类定义在这个包中。在Tomcat的文档中,包含了JSPAPI的文档,该文档的位置是:?TALINA_HOME%\webapps\tomcat-docs\jspapi\index.html。

在JSP2.0规范中定义,JSP页面转换后的Servlet类必须实现javax.servlet.jsp.JspPage接口(与Servlet类似,Servlet类必须实现javax.servlet.Servlet接口),该接口继承自javax.servlet.Servlet接口。除了继承的方法外,JspPage接口还定义了下面两个方法:

? public void jspInit()

这个方法在JSP页面初始化时被调用,它类似于Servlet中的init()方法。页面编写者可以在JSP的声明元素中覆盖这个方法,以提供任何的初始化工作。

? public void jspDestroy()

在JSP页面将要被销毁时调用这个方法。它类似于Servlet中的destroy()方法。页面编写者可以在JSP的声明元素中覆盖这个方法,以提供任何的JSP清除工作。

因为绝大多数情况下,JSP页面都是使用HTTP协议,所以JSP页面转换后的Servlet类实际上必须实现javax.servlet.jsp.HttpJspPage接口,该接口继承自JspPage接口。除了继承的方法外,HttpJspPage接口只定义了一个方法:

? public void _jspService(javax.servlet.http.HttpServletRequestrequest, javax.servlet.http.HttpServlet Response response) throwsjavax.servlet.ServletException, java.io.IOException

这个方法对应于JSP页面的主体(body)部分,它类似于Servlet中的service()方法。这个方法由JSP容器自动定义,页面编写者不应当提供该方法的实现。代码的第16~63行,就是JSP容器自动生成的_jspService()方法。

代码的第7行,hello_jsp类从org.apache.jasper.runtime.HttpJspBase类派生,HttpJspBase类是Tomcat提供的实现了HttpJspPage接口的类。HttpJspBase类的部分代码如下。

package org.apache.jasper.runtime;

import …;

public abstract class HttpJspBase extends HttpServletimplements HttpJspPage

{

static

{

if( JspFactory.getDefaultFactory() == null )

{

JspFactoryImpl factory = new JspFactoryImpl();

JspFactory.setDefaultFactory(factory);

}

}

public final void init(ServletConfig config) throwsServletException

{

super.init(config);

jspInit();

}

public String getServletInfo()

{

return Localizer.getMessage("jsp.engine.info");

}

public final void destroy()

{

jspDestroy();

}

public final void service(HttpServletRequest request,HttpServletResponse response)

throws ServletException, IOException

{

_jspService(request, response);

}

public void jspInit(){}

public void jspDestroy(){}

public abstract void _jspService(HttpServletRequestrequest,

HttpServletResponse response)

throws ServletException, IOException;

}

读者看HttpJspBase类是否感觉非常熟悉,实际上,这就是一个实现了HttpJspPage接口的Servlet类,在Servlet类的init()方法中调用jspInit()方法,在Servlet类的destory()方法中调用jspDestroy()方法,在Servlet类的service()方法中调用_jspService()方法。从Tomcat提供的HttpJspBase类可以看出,JSP页面运行的底层仍然是Servlet技术。

在例12-2的第20~25行,定义了一些对象变量,第33~39行,分别对这些对象进行了初始化,这些代码都是由JSP容器自动产生的,也就是说,在JSP页面中,可以直接使用这些服务器端对象(详见12.4节)。

代码的第42~52行,打印输出HTML页面,这段代码对应的是例12-1 hello.jsp文件中的代码。

?

?

jsppageBaseà httpJspPageàjsppageàjavax.servlet.servlet

热点排行
Bad Request.