1. 程式人生 > >wujingjing_crystal的專欄

wujingjing_crystal的專欄

jsp的標籤技術:在jsp頁面中最好不要出現java程式碼,這時我們可以使用標籤技術將java程式碼替換成標籤來表示。JSP的標籤技術主要有下面四種:

  1. jsp標籤。
  2. EL表示式。
  3. JSTL標籤庫。
  4. 自定義標籤技術。

一、jsp標籤

sun原生提供的標籤,可以直接在jsp頁面中使用。這種標籤技術在實際使用中用的不是很多。它有很多標籤,下面介紹其中的幾種標籤:

1、標籤

標籤用於把另外一個資源的輸出內容插入進當前JSP頁面的輸出內容之中,這種在JSP頁面執行時的引入方式稱之為動態引入

語法:

    <jsp:include page="relativeURL | <%=expression%>"
flush="true|false" />

page屬性用於指定被引入資源的相對路徑,它也可以通過執行一個表示式來獲得。
flush屬性指定在插入其他資源的輸出內容時,是否先將當前JSP頁面的已輸出的內容重新整理到客戶端。

與include指令的比較:

標籤是動態引入, 標籤涉及到的2個JSP頁面會被翻譯成2個servlet,這2個servlet的內容在執行時進行合併。 而include指令是靜態引入,涉及到的2個JSP頁面會被翻譯成一個servlet,其內容是在原始檔級別進行合併。不管是標籤,還是include指令,它們都會把兩個JSP頁面內容合併輸出,所以這兩個頁面不要出現重複的HTML全域性架構標籤,否則輸出給客戶端的內容將會是一個格式混亂的HTML文件。

2、標籤

標籤用於把請求轉發給另外一個資源。

語法:

<jsp:forward page="relativeURL | <%=expression%>" /> 

page屬性用於指定請求轉發到的資源的相對路徑,它也可以通過執行一個表示式來獲得。

3、標籤

當使用和標籤引入或將請求轉發給其它資源時,可以使用標籤向這個資源傳遞引數。

語法1:

    <jsp:include page="relativeURL | <%=expression%>">
        <jsp:param name="parameterName"
value="parameterValue|<%= expression %>" /> </jsp:include>

語法2:

    <jsp:forward page="relativeURL | <%=expression%>">
        <jsp:param name="parameterName" value="parameterValue|<%= expression %>" />
    </jsp:include>

標籤的name屬性用於指定引數名,value屬性用於指定引數值。在和標籤中可以使用多個標籤來傳遞多個引數。

二、EL表示式

EL 全名為Expression Language。EL表示式最初出現的目的是為了取代jsp頁面中的jsp指令碼表示式,但是隨著el的發展el的功能已經不限於此了。

EL表示式是JSP 2.0(JavaEE1.4)規範中的一門技術 。因此,若想正確解析EL表示式,需使用支援Servlet2.4/JSP2.0技術的WEB伺服器。

注意:如果有些Tomcat伺服器不能使用EL表示式,可以採取的方法是:

(1)升級成tomcat6

(2)在JSP中加入<%@ page isELIgnored=”false” %>

EL表示式主要有下面四種功能:獲取資料、執行運算、獲取常用開發物件和呼叫java方法。

1、獲取資料

使用中括號的地方通常都可以使用點號替代,有兩種情況除外:中括號中是數字或者中括號中包含特殊字元(-.)的情況。

注意:在中括號中如果不用雙引號引起來則是變數,先找變數的值再拿變數的值使用。如果用雙引號則是常量,直接使用常量的值。它只能獲取資料,不要試圖通過EL表示式來設定資料。

(1) 獲取常量

字串/數字/布林型別,直接寫在el表示式中,el直接進行輸出。

(2) 獲取域中的變數

如果el中寫的是一個變數的名,則el會呼叫pageContext的findAttribute方法。在四大作用域中以給定的名字找對應的屬性值,找到後進行輸出,如果四個域中都找不到,什麼都不輸出。

(3) 獲取陣列中的資料

(4) 獲取集合中的資料

(5) 獲取Map中的資料

(6) 獲取javabean的屬性

示例如下:

        <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
        <%@page import="com.itheima.domain.Person"%>
        <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
        <html>
          <head>
          </head>
          <body>
            <h1>獲取javabean的屬性</h1><hr>
            <%
                Person p = new Person();
                p.setName("Lilei");
                p.setAge(17);
                pageContext.setAttribute("p",p);
             %>
             ${p.name }${p.age } ${p.name }
             <img src="${pageContext.request.contextPath }/1.jpg"/>

            <h1>獲取Map中的資料</h1><hr>
            <%
                Map<String,String> map = new HashMap();
                map.put("name","張三");
                map.put("age","17");
                map.put("gender","男");
                map.put("addr","中國");
                pageContext.setAttribute("map",map);
                pageContext.setAttribute("name","age");
             %>
             ${map["name"] }${map["addr"] }
             ${map.gender }${map.age }

            <h1>獲取集合中的資料</h1><hr>
            <%
                List<String> list = new ArrayList<String>();
                list.add("甄嬛");
                list.add("安陵容");
                list.add("華妃");
                pageContext.setAttribute("list",list);
             %>
            ${list[2] }

            <h1>獲取陣列資料</h1><hr>
            <%
                String [] names = {"容嬤嬤","紫薇","金鎖","小燕子"};
                pageContext.setAttribute("names",names);
             %>
            ${names[2]}
            <h1>獲取域中的變數資料</h1><hr>
            <%
                String name = "李四";
                pageContext.setAttribute("name",name);
            %>
            ${name }
            <h1>獲取常量資料</h1><hr>
            ${"阿薩德發射點發" } ${199 } ${true }
          </body>
        </html>

2、執行運算

EL中支援的運算型別:算術運算、邏輯運算、比較運算、三元運算子、empty運算子。

算術運算:如果有非數字參與算數運算,el表示式會試圖將非數字轉換為數字後參與運算。

empty運算子:判斷一個物件是否為null或字串是否為空字串或集合內容是否為空或域中是否沒有任何屬性。

示例:

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
      </head>
      <body>
        <h1>empty 運算子 : </h1><hr>
        <%
            String str = "aaaa";
            pageContext.setAttribute("str",str);
            List list = new ArrayList();
            list.add("");
            pageContext.setAttribute("list",list);
         %>
         ${empty str }
         ${empty list}
         ${empty pageScope }


        <h1>三元運算</h1><hr>
        ${10>9? "yes" : "no" }     

        <h1>邏輯運算</h1><hr>
        && and 
        ||  or
        !   not

        ${not (3>2 and 1<2 or 10>3) }


        <h1>比較運算</h1><hr>
            > gt
            < lt
            >= ge
            <= le
            != ne
            ==eq
        ${1 eq 1 } ${3 ge 2 } ${5+3 lt 3 }
        <h1>算術運算</h1><hr>
        ${1+1 }
        ${1-2 }
        ${1+"2" }
      </body>
    </html>

3、獲取常用開發物件

EL中內建了11個內建物件,這些物件EL內建的,不需要提前定義就可以直接在EL中使用。

pageContext -- 有了它可以很方便的獲取jsp頁面中的9大隱式物件

pageScope -- page域中屬性組成的Map
requestScope -- request域中屬性組成的Map
sessionScope -- session域中屬性組成的Map
applicationScope --application域中屬性組成的Map

param -- 所有請求引數組成的Map<String,String>
paramValues -- 所有請求引數組成的Map<String,String[]>

header -- 所有請求頭組成的Map<String,String>
headerValues -- 所有請求頭組成的Map<String,String[]>

cookie -- 所有cookie資訊組成的Map<String,Cookie>

initParam -- 所有web應用的初始化引數組成Map

示例:

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
      </head>
      <body>
      <%
        pageContext.setAttribute("name","wang");
        request.setAttribute("name","li");
       %>
        ${requestScope.name}

        ${param.name } ${paramValues.like[2] }${header["Accept-Language"] }
        ${cookie.JSESSIONID.name }${cookie.JSESSIONID.value }
        ${initParam.name2 }

      </body>
    </html>

4、呼叫java方法

EL表示式允許使用者開發自定義EL函式,以在JSP頁面中通過EL表示式呼叫Java類的方法。一般來說,EL自定義函式開發與應用包括以下三個步驟:

  1. 編寫一個Java類的靜態方法。
  2. 編寫標籤庫描述符(tld)檔案,在tld檔案中描述自定義函式。
  3. 在JSP頁面中匯入和使用自定義函式。

編寫完標籤庫描述檔案後,需要將它放置到

三、JSTL標籤庫

JavaServer Pages Standard Tag Library是由JCP(Java Community Process)指定的標準,是提供給 Java Web 開發人員的一個標準通用的標籤函式庫,和 EL 配合來取代傳統直接在頁面上嵌入 Java 程式(Scripting)的做法,以提高程式可讀性、維護性和方便性。

JSTL標籤庫主要包括五類:

  1. 核心標籤庫 (core) — c
  2. 國際化標籤 fmt
  3. 資料庫標籤 sql
  4. XML標籤 xml
  5. JSTL函式(EL函式) el

1、核心標籤庫

(1) <c:out>標籤

標籤用於輸出一段文字內容到pageContext物件當前儲存的“out”物件中。

示例:

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
      </head>
      <body>
        <h1>HTML轉義輸出</h1><hr>
        <a href="#">xxx</a>
        <c:out value="<a href='#'>xxx</a>" ></c:out>
        ${fn:escapeXml('<a href="#">xxx</a>') }

        <h1>輸出預設值</h1><hr>
        <%
            String addr = "西二旗";
            //pageContext.setAttribute("addr",addr);
         %>
        <c:out value="${addr}" default="北京"></c:out>
        ${addr == null?"北京" : addr }

        <h1>輸出變數</h1><hr>
        <%
            String name = "無雙";
            pageContext.setAttribute("name",name);
         %>
         <c:out value="${name}"></c:out>
         ${name }
        <h1>輸出常量</h1><hr>
        <c:out value="阿斯蒂芬"></c:out>
        ${"啦啦啦啦" }
      </body>
    </html>

(2) <c:set>標籤

標籤用於把某一個物件存在指定的域範圍內,或者設定Web域中的java.util.Map型別的屬性物件或JavaBean型別的屬性物件的屬性。

示例:

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <%@page import="com.itheima.domain.Person"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
      </head>
      <body>
        <h1>修改域中的JavaBean的屬性的值</h1><hr>
        <%
            Person p = new Person();
            pageContext.setAttribute("p",p);
         %>
         <c:set target="${p}" property="name" value="克林頓"></c:set>
         ${p.name }


        <h1>設定或修改域中的Map的值</h1><hr>
        <%
            Map map = new HashMap();
            pageContext.setAttribute("map",map);
         %>
        <c:set target="${map}" property="cellphone" value="10010"></c:set>     
        <c:set target="${map}" property="cellphone" value="10086"></c:set>     
        ${map.cellphone }

        <h1>設定或修改域中的屬性值</h1><hr>
        <c:set var="name" value="韋小寶"></c:set>
        <c:set var="name" value="阿珂"></c:set>
        ${name }
      </body>
    </html>

(3) <c:remove>標籤

標籤用於刪除各種Web域中的屬性。

其語法格式如下:

    <c:remove var="varName"     
            [scope="{page|request|session|application}"] /> 

示例:

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
      </head>
      <body>
        <%
            pageContext.setAttribute("name","藍精靈");
            request.setAttribute("name","小丸子");
            session.setAttribute("name","機器貓");
            application.setAttribute("name","蠟筆小新");
         %>
         <c:remove var="name"/>
        ${name }
      </body>
    </html>

(4) <c:catch>標籤

標籤用於捕獲巢狀在標籤體中的內容丟擲的異常。

其語法格式如下:

    <c:catch [var="varName"]>nested actions</c:catch>
var屬性用於標識<c:catch>標籤捕獲的異常物件,它將儲存在page這個Web域中。 

**示例:**

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%@ page contentType="text/html;charset=gb2312" %>
    <c:catch var="myex“ >
        <%
            10/0;
        %>
    </c:catch>
    異常:<c:out value="${myex}" />  ${myex}<br />
    異常 myex.getMessage:<c:out value="${myex.message}" /><br />
    異常 myex.getCause:<c:out value="${myex.cause}" /><br />
    異常 myex.getStackTrace:<c:out value="${myex.stackTrace}" />

(5) <c:if>標籤

標籤可以構造簡單的“if-then”結構的條件表示式,它沒有實現else的功能,如果想要實現else只能重新寫一遍判斷。

示例:

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
      </head>
      <body>
        <c:if test="${2>1}">
            確實是這樣的....
        </c:if>
        <c:if test="${2<=1}">
            你確定嗎?
        </c:if>
      </body>
    </html>

(6) <c:choose>標籤

標籤用於指定多個條件選擇的組合邊界,它必須與和標籤一起使用。使用,和三個標籤,可以構造類似 “if-else if-else” 的複雜條件判斷結構。

示例:

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%@ page contentType="text/html;charset=gb2312" %>
    <c:set value="${param.count}" var="count“  /> pageContext(count,2)
    <c:choose>
        <c:when test="${count == 0}">
            對不起,沒有符合您要求的記錄。
        </c:when>
        <c:otherwise>
            符合您要求的記錄共有${count}條.
        </c:otherwise>
    </c:choose>

(7) <c:forEach>標籤

標籤用於對一個集合物件中的元素進行迴圈迭代操作,或者按指定的次數重複迭代執行標籤體中的內容。

示例:

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
      </head>
      <body>
        <h1>實驗:遍歷10到100的偶數,如果數字所在的位置是3的倍數,顯示成紅色</h1><hr>
        <c:forEach begin="10" end="100" step="2" var="i" varStatus="stat">
            <c:if test="${stat.count % 3 == 0}">
                <font color="red">
                    ${i }
                </font>
            </c:if>
            <c:if test="${stat.count % 3 != 0}">
                <font color="blue">
                    ${i }
                </font>
            </c:if>
        </c:forEach>

        <h1>迴圈執行指定的內容若干次</h1><hr>
        <c:forEach begin="0" end="10" step="2" var="i" >
            ${i },
        </c:forEach>
        <h1>遍歷Map中的資料</h1><hr>
        <%
            Map map = new LinkedHashMap();
            map.put("name","曹操");
            map.put("age","59");
            map.put("wife","小喬");
            map.put("gender","男");
            pageContext.setAttribute("map",map);
         %>
        <c:forEach items="${map}" var="entry" >
            ${entry.key }:${entry.value }<br>
        </c:forEach>

        <h1>遍歷集合中的資料</h1><hr>
        <%
            List list = new ArrayList();
            list.add("美國");
            list.add("中國");
            list.add("俄羅斯");
            list.add("印度");
            list.add("巴西");
            pageContext.setAttribute("list",list);
         %>
         <c:forEach items="${list}" var="c">
         ${c }<br>
         </c:forEach>

        <h1>遍歷陣列中的資料</h1><hr>
        <%
            String []  city = {"北京","上海","廣州","鐵嶺","葫蘆島"};
            pageContext.setAttribute("city",city);
         %>
         <c:forEach items="${city}" var="c">
            ${c }<br>
         </c:forEach>
      </body>
    </html>

(8) <c:forTokens>標籤

用來瀏覽一字串中所有的成員,其成員是由定義符號所分隔的。

示例:

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
      </head>
      <body>
        <c:forTokens items="www.baidu.com" delims="." var="str">
            ${str }<br>
        </c:forTokens>
      </body>
    </html>

(9) <c:redirect>標籤

標籤用於實現請求重定向。

示例:

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
      </head>
      <body>
        <c:redirect url="/index.jsp" context="${pageContext.request.contextPath}">
            <c:param name="name" value="zhang"></c:param>
        </c:redirect>
      </body>
    </html>

(10) <c:import>標籤

示例:

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
      </head>
      <body>
        from xxxxx....
        <c:import url="/index.jsp" var="p" scope="page"></c:import>
        xxxx
        yyyy
        ${p }
        zzzz
      </body>
    </html>

(11) <c:url>標籤

標籤用於在JSP頁面中構造一個URL地址,其主要目的是實現URL重寫。URL重寫就是將會話標識號以引數形式附加在URL地址後面 。

示例:

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
      </head>
      <body>
      <%
        String url = response.encodeURL(request.getContextPath()+"/index.jsp");
       %>
        <a href="<%= url %>">hhhh</a>

        <c:url value="/index.jsp" context="${pageContext.request.contextPath}" var="url" scope="page"></c:url>
        <a href="${url }">xxx</a>

      </body>
    </html>

(12) <c:param>標籤

在JSP頁面進行URL的相關操作時,經常要在URL地址後面附加一些引數。標籤可以巢狀在、或標籤內,為這些標籤所使用的URL地址附加引數。
標籤在為一個URL地址附加引數時,將自動對引數值進行URL編碼,例如,如果傳遞的引數值為“中國”,則將其轉換為“%d6%d0%b9%fa”後再附加到URL地址後面,這也就是使用標籤的最大好處。

示例:

<c:param name="name" value="value" />

四、自定義標籤技術

自定義標籤技術分為傳統標籤和簡單標籤兩種。

1、傳統標籤

(1)建立自定義標籤的步驟

使用自定義標籤移除jsp頁面中的java程式碼,只需要完成以下兩個步驟:

  1. 編寫一個實現Tag介面的Java類(標籤處理器類)。
  2. 編寫標籤庫描述符(tld)檔案,在tld檔案中對標籤處理器類描述成一個標籤。
  3. 在JSP頁面中引入tld檔案,就可以在jsp頁面中使用自定義標籤了。

(2)Tag介面的執行流程

JSP引擎將遇到自定義標籤時,首先建立標籤處理器類的例項物件,然後按照JSP規範定義的通訊規則依次呼叫它的方法。

1、public void setPageContext(PageContext pc), JSP引擎例項化標籤處理器後,將呼叫setPageContext方法將JSP頁面的pageContext物件傳遞給標籤處理器,標籤處理器以後可以通過這個pageContext物件與JSP頁面進行通訊。

2、public void setParent(Tag t),setPageContext方法執行完後,WEB容器接著呼叫的setParent方法將當前標籤的父標籤傳遞給當前標籤處理器,如果當前標籤沒有父標籤,則傳遞給setParent方法的引數值為null。

3、public int doStartTag(),呼叫了setPageContext方法和setParent方法之後,WEB容器執行到自定義標籤的開始標記時,就會呼叫標籤處理器的doStartTag方法。

4、public int doEndTag(),WEB容器執行完自定義標籤的標籤體後,就會接著去執行自定義標籤的結束標記,此時,WEB容器會去呼叫標籤處理器的doEndTag方法。

5、public void release(),通常WEB容器執行完自定義標籤後,標籤處理器會駐留在記憶體中,為其它請求伺服器,直至停止web應用時,web容器才會呼叫release方法。

doStartTag 和 doEndTag方法來分別處理髮現開始標籤和發現結束標籤時的程式碼。在doStartTag可以通過返回值來控制標籤體是否允許執行,在doEndTag方法裡可以通過返回值控制標籤之後的剩餘頁面是否允許執行。

傳統標籤的這種開發方式,需要我們分析發現開始標籤和發現結束標籤時都需要執行什麼程式碼,還需要分析到底要返回什麼樣的標籤體控制程式執行,相對來說相當的繁瑣,因此有了下面的簡單標籤。

示例(利用傳統標籤顯示IP地址):

    import java.io.IOException;

    import javax.servlet.jsp.JspException;
    import javax.servlet.jsp.PageContext;
    import javax.servlet.jsp.tagext.Tag;

    public class ShowIpTag implements Tag {
        private PageContext pc = null;

        public int doEndTag() throws JspException {
            //EVAL_PAGE -- 結束標籤之後的剩餘頁面需要去執行
            //SKIP_PAGE -- 結束標籤之後的剩餘頁面不要去執行
            return 0;
        }

        public int doStartTag() throws JspException {
            try {
                String ip = pc.getRequest().getRemoteAddr();
                pc.getOut().write(ip);
            } catch (IOException e) {
                e.printStackTrace();
            }
            //Eval_Body_Include -- 開始標籤之後的標籤體需要執行
            //Skip_Body -- 開始標籤之後的標籤體不需要執行
            return 0;
        }

        public Tag getParent() {
            return null;
        }

        public void release() {

        }

        public void setPageContext(PageContext pc) {
            this.pc = pc;
        }

        public void setParent(Tag t) {

        }

    }

(3)自定義標籤應該具有的功能

  1. 控制jsp頁面某一部分內容是否執行。
  2. 控制整個jsp頁面是否執行。
  3. 控制jsp頁面內容重複執行。
  4. 修改jsp頁面內容輸出。 HTML轉義
        例一:控制標籤體內容是否執行
        doStartTag
        EVAL_BODY_INCLUDE  執行標籤內容
        SKIP_BODY  跳過標籤內容

        Tld配置
         <tag>
          <name>demo1</name>
          <tag-class>mytag.MyTag1</tag-class>
          <body-content>JSP</body-content>
         </tag>
        例二:控制標籤後的jsp頁面是否執行
        doEndTag
        EVAL_PAGE  執行標籤後的頁面內容
        SKIP_PAGE  跳過標籤後的頁面內容

        Tld配置
         <tag>
          <name>demo2</name>
          <tag-class>mytag.MyTag2</tag-class>
          <body-content>empty</body-content>
         </tag>

        例三:控制jsp頁面內容重複執行
        doStartTag
        EVAL_BODY_INCLUDE  執行標籤內容
        doAfterBody
        EVAL_BODY_AGAIN  重複執行標籤內容
        SKIP_BODY  跳過標籤內容

        doAfterBody程式碼
        times--;
        if (times > 0) {
            return EVAL_BODY_AGAIN;
        } else {
            return SKIP_BODY;
        }

        例四:修改標籤體內容輸出
        將標籤體內容大寫輸出
        MyTag4 extends BodyTagSupport
        doStartTag
        EVAL_BODY_BUFFERED
        doEndTag
        String content = getBodyContent().getString();
        pageContext.getOut().write(…);

(4)新增標籤屬性

自定義標籤可以定義一個或多個屬性,這樣,在JSP頁面中應用自定義標籤時就可以設定這些屬性的值,通過這些屬性為標籤處理器傳遞引數資訊,從而提高標籤的靈活性和複用性。

要想讓一個自定義標籤具有屬性,通常需要完成兩個任務:

  1. 在標籤處理器中編寫每個屬性對應的setter方法。
  2. 在TLD檔案中描術標籤的屬性。

為自定義標籤定義屬性時,每個屬性都必須按照JavaBean的屬性命名方式,在標籤處理器中定義屬性名對應的setter方法,用來接收JSP頁面呼叫自定義標籤時傳遞進來的屬性值。 例如屬性url,在標籤處理器類中就要定義相應的setUrl(String url)方法。在標籤處理器中定義相應的set方法後,JSP引擎在解析執行開始標籤前,也就是呼叫doStartTag方法前,會呼叫set屬性方法,為標籤設定屬性。

通過成員變數 和 setter方法設定屬性  times
    Tld配置
    <tag>
    … ...
    <attribute>
     <name>times</name>
     <required>true</required>
     <rtexprvalue>true</rtexprvalue>
     </attribute>
    </tag> 

2、簡單標籤

由於傳統標籤使用三個標籤介面來完成不同的功能,顯得過於繁瑣,不利於標籤技術的推廣, SUN公司為降低標籤技術的學習難度,在JSP 2.0中定義了一個更為簡單、便於編寫和呼叫的SimpleTag介面來實現標籤的功能。實現SimpleTag介面的標籤通常稱為簡單標籤。簡單標籤共定義了5個方法:

  1. setJspContext方法
  2. setParent
  3. getParent方法
  4. setJspBody方法
  5. doTag方法

(1)簡單標籤的方法介紹

  1. setJspContext方法

    用於把JSP頁面的pageContext物件傳遞給標籤處理器物件。

  2. setParent方法

    用於把父標籤處理器物件傳遞給當前標籤處理器物件。

  3. getParent方法

    用於獲得當前標籤的父標籤處理器物件。

  4. <