Context.getSession(); 39. out = pageContext.getOut();
40. _jspx_out = out; 41. 42. out.write("\r\n"); 43. out.write(" \r\n"); 44. out.write("\r\n"); 45. out.write("\r\n"); 46. out.write(" "); 47. 48. out.println("Hello World!"); 49. 50. out.write("\r\n"); 51. out.write("\r\n"); 52. out.write(""); 53. } catch (Throwable t) { 54. if (!(t instanceof SkipPageException)){ 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 相关的类定义在这个包中。在 To mcat 的文档中,包含了 JSP API 的
文档,该
文档的位置是:%CATALINA_HOME%\
webapps\t omcat-docs\ jspapi\index.html。
在 JSP2.0 规范中定义, 页面转换后的 Servlet 类必须实现 javax.servlet.jsp.JspPage 接口 JSP (与 Servlet 类似,Servlet 类必须实现 javax.servlet.Servlet 接口),该接口继承自 javax.servlet.Se rvlet 接口。除了继承的方法外,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.HttpServletRequest request, javax.s ervlet.http.HttpServlet Response response) throws javax.servlet.ServletExceptio n, 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 HttpServlet implements HttpJspPage { … static { if( JspFactory.getDefaultFactory() == null )
{ JspFactoryImpl factory = new JspFactoryImpl(); … JspFactory.setDefaultFactory(factory); } } public final void init(ServletConfig config) throws ServletException { 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 resp onse) throws ServletException, IOException { _jspService(request, response); } public void jspInit(){}
public void jspDestroy(){} public abstract void _jspService(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException; } 读者看 HttpJspBase 类是否感觉非常熟悉,实际上,这就