浏览器调用自定义标签过程以及源代码分析

IE---->Web服务器-->jsp(servlet)--->遇见标签:                                                                                          注释:标签体:指jsp内容
                                 -->1 遇到自定义标签,首先实例化标签对应的标签处理器类
                                 -->2 调用setPageXContext()方法,把页面的pageContext对戏那个传递给标签处理器类
                                 -->3 看标签是否有父标签,如果有父标签,则把父标签作为一个对象,调用setParent方法传递给标签处理器类
                                 -->4 完成以上的标签初始化工作后,服务器就开始执行标签,这时遇到标签的开始标签,就调用doStarttag()方法
                                 -->5 如果标签有标签体,这时服务器一般会执行标签体
                                 -->6 服务器遇到jsp页面结束标签,则调用标签处理器类的doEndTag()方法。
                                 -->7 整个标签执行完后,服务器一般情况下会调用release()方法释放标签工作所占用的资源
                                 -->8 服务器接着在执行标签余下的jsp页面





//------------------------------------下面是jsp的源代码,查看源代码,就更加直观的明白了标签体的调用过程了---------------------------------------






package org.apache.jsp;


import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import java.util.*;


public final class _2_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent {


  private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();


  private static java.util.List<String> _jspx_dependants;


  static {
    _jspx_dependants = new java.util.ArrayList<String>(1);
    _jspx_dependants.add("/WEB-INF/itcast.tld");
  }


  private org.apache.jasper.runtime.TagHandlerPool _005fjspx_005ftagPool_005fitcast_005fipshow_005fnobody;


  private javax.el.ExpressionFactory _el_expressionfactory;
  private org.apache.tomcat.InstanceManager _jsp_instancemanager;


  public java.util.List<String> getDependants() {
    return _jspx_dependants;
  }


  public void _jspInit() {
    _005fjspx_005ftagPool_005fitcast_005fipshow_005fnobody = org.apache.jasper.runtime.TagHandlerPool.getTagHandlerPool(getServletConfig());
    _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
    _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
  }


  public void _jspDestroy() {
    _005fjspx_005ftagPool_005fitcast_005fipshow_005fnobody.release();
  }


  public void _jspService(final HttpServletRequest request, final HttpServletResponse response)
        throws java.io.IOException, ServletException {


    final PageContext pageContext;
    HttpSession session = null;
    final ServletContext application;
    final ServletConfig config;
    JspWriter out = null;
    final Object page = this;
    JspWriter _jspx_out = null;
    PageContext _jspx_page_context = null;




    try {
      response.setContentType("text/html;charset=UTF-8");
      pageContext = _jspxFactory.getPageContext(this, request, response,
      null, true, 8192, true);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      session = pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;


      out.write("\r\n");
      out.write("\r\n");
      out.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\r\n");
      out.write("<html>\r\n");
      out.write("  <head>\r\n");
      out.write("    <title></title>\r\n");
      out.write("  </head>\r\n");
      out.write("  \r\n");
      out.write("  <body>\r\n");
      out.write("  您的主机地址:");
//------------------------------------------------------------------------------------------标签体开始执行----------------------------------------------------
      if (_jspx_meth_itcast_005fipshow_005f0(_jspx_page_context))
        return;
      out.write("\r\n");
      out.write("  </body>\r\n");
      out.write("</html>");
    } catch (Throwable t) {
      if (!(t instanceof SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          try { out.clearBuffer(); } catch (java.io.IOException e) {}
        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
      }
    } finally {
      _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }


//------------------------------------------------------------------------------------------调用标签体的方法----------------------------------------------------
  private boolean _jspx_meth_itcast_005fipshow_005f0(PageContext _jspx_page_context)
          throws Throwable {
    PageContext pageContext = _jspx_page_context;
    JspWriter out = _jspx_page_context.getOut();
    //  itcast:ipshow
    cn.itcast.web.tag.ipTag _jspx_th_itcast_005fipshow_005f0 = (cn.itcast.web.tag.ipTag) _005fjspx_005ftagPool_005fitcast_005fipshow_005fnobody.get(cn.itcast.web.tag.ipTag.class);
    _jspx_th_itcast_005fipshow_005f0.setPageContext(_jspx_page_context);
    _jspx_th_itcast_005fipshow_005f0.setParent(null);
    int _jspx_eval_itcast_005fipshow_005f0 = _jspx_th_itcast_005fipshow_005f0.doStartTag();
    if (_jspx_th_itcast_005fipshow_005f0.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {
      _005fjspx_005ftagPool_005fitcast_005fipshow_005fnobody.reuse(_jspx_th_itcast_005fipshow_005f0);
      return true;
    }
    _005fjspx_005ftagPool_005fitcast_005fipshow_005fnobody.reuse(_jspx_th_itcast_005fipshow_005f0);
    return false;
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值