新客网WWW.XKER.COM:致力做中国最专业的网络学院!
学院: 操作系统 - 网络应用 - 服务器 - 网络安全 - 工具软件 - 办公软件 - Web开发 - 数据库 - 网页设计 - 图形图像 - 媒体动画 - 硬件学堂 - 存储频道 - QQ专区
您的位置:首页 > 软件开发 > Web开发 > JSP教程 > 正文:JSP的运行内幕

JSP的运行内幕

新客网 XKER.COM 2006-05-24 来源: 收藏本文

  pageContext = _jspxFactory.getPageContext(this,
  request, response,null, true, 8192, true);
  application = pageContext.getServletContext();
  config = pageContext.getServletConfig();
  session = pageContext.getSession();
  out = pageContext.getOut();
  _jspx_out = out;
  ……
  if (_jspx_meth_html_html_0(pageContext))
  return;
  ……
  }
  file: //页面在处理退出时释放所有定制标签的属性
  public void _jspDestroy() {
  _jspx_tagPool_bean_message_key.release();
  ……
  }
  }

  生成的index_jsp.java继承于org.apache. jasper.runtime.HttpJspBase。研究这个文件为我们了解定制标签的运行机理提供了途径。

  从上面可以看出,Tomcat在解析一个JSP页面时,首先为每一个定制标签定义并实例化了一个TagHandlerPool对象。页面的处理方法覆盖父类的_ jspService()方法,_jspService方法首先初始化环境,为内置对象赋值。由于index.jsp页面整体由一个<html:html/>标签包裹,Tomcat对每一个标签都产生一个私有方法加以实现。<html:html/>标签的处理方法是_jspx_meth_html_html_0()。这个方法的命名规范大家也可以从这里看出,就是“_jspx_meth + 标签的前缀 + 标签名 + 该标签在JSP页面同类标签中出现的序号”。其它标签都被包含在该标签中,所以其它标签在_jspx_meth_html_html_0()方法中进行解析。

  在_jspx_meth_html_html_0()方法中,首先从_jspx_tagPool_html_html_locale池中得到一个org.apache.struts.taglib.html.HtmlTag的实例,然后设置这个tag实例的页面上下文及上级标签,由于html:html标签是页面的最顶层标签,所以它的parent是null。然后对该标签的内容进行解析。HTML代码直接输出,下面主要看看%lt;html:html></html:html>标签之间包含的<bean:message key="index.title"/>标签的解析。对bean:message标签的解析类似于html:html,Tomcat也将其放入一个单独的方法_jspx_meth_bean_message_0()中进行。
    bean:message标签的解析

  代码清单7:_jspx_meth_bean_message_0()方法片断
  //对message定制标签的处理方法
  private boolean _jspx_meth_bean_message_0(
  javax.servlet.jsp.tagext.Tag _jspx_th_html_html_0,
  javax.servlet.jsp.PageContext pageContext) throws Throwable {
  JspWriter out = pageContext.getOut();
  /* ---- bean:message ---- */
  org.apache.struts.taglib.bean.MessageTag
  _jspx_th_bean_message_0 =(org.apache.struts.taglib.bean.MessageTag)
  _jspx_tagPool_bean_message_key.get(org.apache.struts.taglib.bean.MessageTag.class);
  _jspx_th_bean_message_0.setPageContext(pageContext);
  _jspx_th_bean_message_0.setParent(_jspx_th_html_html_0);
  _jspx_th_bean_message_0.setKey("index.title");
  int _jspx_eval_bean_message_0 = _jspx_th_bean_message_0.doStartTag();
  if (_jspx_th_bean_message_0.doEndTag()== javax.servlet.jsp.tagext.Tag.SKIP_PAGE)
  return true;
  _jspx_tagPool_bean_message_key.reuse(_jspx_th_bean_message_0);
  return false;
  }

  同样,对html:bean也需要从池中得到一个标签类的实例,然后设置环境。这里不再赘述。我们只专注对MessageTag定制标签类特殊的处理部分。定制标签类的开发不在本文讨论范围之内。在index.jsp中定义了一个bean:message标签,并设置了一个属性:。Tomcat在解析时,调用MessageTag对象的key属性设置方法setKey(),将该属性置入。然后调用MessageTag的doStartTag()和doEndTag()方法,完成解析。如果doEndTag()方法的返回值为javax.servlet.jsp.tagext.Tag. SKIP_PAGE,表明已经完成解析,返回true,Tomcat将立即停止剩余页面代码的执行,并返回。否则把该MessageTag的实例放回池中。

共4页: 上一页 [1] [2] [3] [4] 下一页
收藏】 【评论】 【推荐】 【投稿】 【打印】 【关闭
发表评论
要记得去论坛讨论,点击注册新会员匿名评论
评论内容:不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
阅读排行
随机推荐
实用信息推荐