隨筆-9  評(píng)論-2  文章-0  trackbacks-0

          TagSupport與BodyTagSupport的區(qū)別 
          標(biāo)簽: TagSupport與BodyTagSupport的區(qū)別 
          1、 TagSupport與BodyTagSupport的區(qū)別

           TagSupport與BodyTagSupport的區(qū)別主要是標(biāo)簽處理類是否需要與標(biāo)簽體交互,如果不需要交互的就用TagSupport,否則如果需要交互就用BodyTagSupport。
              交互就是標(biāo)簽處理類是否要讀取標(biāo)簽體的內(nèi)容和改變標(biāo)簽體返回的內(nèi)容。
              用TagSupport實(shí)現(xiàn)的標(biāo)簽,都可以用BodyTagSupport來實(shí)現(xiàn),因?yàn)锽odyTagSupport繼承了TagSupport。
           2 、doStartTag(),doEndTag(),doAfterBody(),
              doStartTag()方法是遇到標(biāo)簽開始時(shí)會(huì)呼叫的方法,其合法的返回值是EVAL_BODY_INCLUDE與SKIP_BODY,前者表示將顯示標(biāo)簽間的文字,后者表示不顯示標(biāo)簽間的文字;
              doEndTag()方法是在遇到標(biāo)簽結(jié)束時(shí)呼叫的方法,其合法的返回值是EVAL_PAGE與 SKIP_PAGE,前者表示處理完標(biāo)簽后繼續(xù)執(zhí)行以下的JSP網(wǎng)頁,后者是表示不處理接下來的JSP網(wǎng)頁
              doAfterBody()這個(gè)方法是在顯示完標(biāo)簽間文字之后呼叫的,其返回值有EVAL_BODY_AGAIN與SKIP_BODY,前者會(huì)再顯示一次標(biāo)簽間的文字,后者則繼續(xù)執(zhí)行標(biāo)簽處理的下一步。
          EVAL_BODY_INCLUDE:把Body讀入存在的輸出流中,doStartTag()函數(shù)可用
          EVAL_PAGE:繼續(xù)處理頁面,doEndTag()函數(shù)可用
          SKIP_BODY:忽略對(duì)Body的處理,doStartTag()和doAfterBody()函數(shù)可用
          SKIP_PAGE:忽略對(duì)余下頁面的處理,doEndTag()函數(shù)可用
          EVAL_BODY_TAG:已經(jīng)廢止,由EVAL_BODY_BUFFERED取代
          EVAL_BODY_BUFFERED:申請緩沖區(qū),由setBodyContent()函數(shù)得到的BodyContent對(duì)象來處理tag的body,如果類實(shí)現(xiàn)了BodyTag,那么doStartTag()可用,否則非法
          EVAL_BODY_BUFFERED 要將BodyContent的內(nèi)容輸出 如:
          JspWriter w = pageContext.getOut();
            if (bodyContent != null) {
             if (w instanceof BodyContent) {
              w = ((BodyContent) w).getEnclosingWriter();
             }
            }
            String cnt = this.bodyContent.getString();
            try {
             w.write(cnt);
            } catch (IOException e) {
             e.printStackTrace();
            }

             預(yù)定的處理順序是:doStartTag()返回SKIP_BODY,doAfterBodyTag()返回SKIP_BODY,doEndTag()返回EVAL_PAGE.
             如果繼承了TagSupport之后,如果沒有改寫任何的方法,標(biāo)簽處理的執(zhí)行順序是:

             doStartTag() ->不顯示文字 ->doEndTag()->執(zhí)行接下來的網(wǎng)頁

            如果您改寫了doStartTag(),則必須指定返回值,如果指定了EVAL_BODY_INCLUDE,則執(zhí)行順序是

             doStartTag()->顯示文字->doAfterBodyTag()->doEndTag()->執(zhí)行下面的網(wǎng)頁
          display.tld 源碼
          xml 代碼:

          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
          <taglib>
              
          <tlibversion>1.0</tlibversion>
              
          <jspversion>1.1</jspversion>
              
          <shortname>bean</shortname>
              
          <uri>/WEB-INF/tld/display.tld</uri>
              
          <tag>
                  
          <name>display</name>
                  
          <tagclass>com.liuzhe.common.DisplayTag</tagclass>
                  
          <bodycontent>JSP</bodycontent>
                  
          <info>display content</info>
                  
          <attribute>
                      
          <name></name>
                      
          <required></required>
                      
          <rtexprvalue></rtexprvalue>
                  
          </attribute>
              
          </tag>
          </taglib>

          DisplayTag.java 源碼
          java 代碼:

          package com.liuzhe.common;

          import java.io.IOException;
          import javax.servlet.jsp.JspException;
          import javax.servlet.jsp.JspWriter;
          import javax.servlet.jsp.tagext.TagSupport;

          public class DisplayTag extends TagSupport {

              
          private static final long serialVersionUID = 4540106083884185193L;

              @Override
              
          public int doStartTag() throws JspException {
                  System.out.println(
          "doStartTag()");
                  
          return EVAL_BODY_INCLUDE;
              }

              @Override
              
          public int doAfterBody() throws JspException {
                  System.out.println(
          "doAfterBody()");
                  
          return SKIP_BODY;
              }
              
              @Override
              
          public int doEndTag() throws JspException {
                  System.out.println(
          "doEndTag()");
                  JspWriter out 
          = this.pageContext.getOut();
                  
          try {
                      out.print(
          "hello!");
                  } 
          catch (IOException e) {
                      e.printStackTrace();
                  }
                  
          return super.doEndTag();
              }

          }
          index.jsp 源碼


          <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
          <%@ taglib uri="/WEB-INF/tld/display.tld" prefix="test" %>
          <html>
          <head>
          <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
          <title>Insert title here</title>
          </head>
          <body>
          <test:display>test<br></test:display>
          </body>
          </html>

          注意:這里的“test” 顯示在 hello 前面證明啦 它是先執(zhí)行index.jsp 中標(biāo)簽中的內(nèi)容后才執(zhí)行doEndTag()

          posted on 2011-06-14 09:54 secret_x15 閱讀(564) 評(píng)論(0)  編輯  收藏 所屬分類: java
          <2011年6月>
          2930311234
          567891011
          12131415161718
          19202122232425
          262728293012
          3456789

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 灵山县| 营山县| 巴东县| 五寨县| 东辽县| 革吉县| 大余县| 林甸县| 洪雅县| 顺平县| 内乡县| 台东市| 清远市| 梁平县| 石河子市| 内黄县| 浦北县| 电白县| 镇康县| 湘西| 双江| 永平县| 周至县| 会泽县| 株洲市| 新蔡县| 阿荣旗| 天峻县| 通江县| 天门市| 兴和县| 麟游县| 永城市| 北川| 宜都市| 墨江| 平潭县| 雅江县| 和平区| 盱眙县| 东莞市|