在自定義標籤的開發過程中,有時需要對標籤體的內容進行重複處理,這時,可以使用IterationTag介面,它繼承自Tag 介面,在Tag介面基礎上新增了一個 EVAL_BODY_AGAIN常量和一個 doAfterBody()方法,具體如下。
1. EVAL_BODY_AGAIN常量
EVAL_BODY_AGAIN常量是doAfterBody()方法的返回值,如果doAfterBody()方法返回該常量,JSP容器會把標籤體的內容重複執行一次。
2. int doAfterBody()方法
JSP容器在每次執行完標籤體後會調用doAfterBody()方法,該方法可以返回常量SKIP_BODY和EVAL_BODY_AGAIN。如果方法返回SKIP_BODY常量,JSP容器回執行代表結束的標籤的doEndTag()方法,如果返回EVAL_BODY_AGAIN,則重複執行標籤體。
為了讓讀者更好地學習IterationTag介面,接下來通過一個案例演示如何使用IterationTag介面實現重複執行標然休的功能,具體步驟如下。
(1)編寫標籤處理器類。
建Web工程chapter1,並在工程下編寫標籤處理器類Iterate.java。由於TagSupport類實現了IterationTag介面,為了簡化程序的編寫,我們定義的標籤處理器類只需繼承TagSupport類即可,Iterate.java類的實現代碼如下代碼所示。
package cn.itcast.chapter01.classisctag;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.*;
public class Iterate extends TagSupport {
//定義變數
private int num;
//提供num屬性的setter方法
public void setNum(int num) {
this.num = num;
}
//執行一次標籤體
public int doStartTag() throws JspException {
return Tag.EVAL_BODY_INCLUDE;
}
//根據屬性值對標籤體進行執行
public int doAfterBody() throws JspException {
num--;
if (num > 0) {
return EVAL_BODY_AGAIN;
} else {
return SKIP_BODY; //跳過標籤體
}
}
}在上面代碼中,成員變數num用於接收標籤num屬性的值,用來決定標籤體的執行次數。由於doStartTag()方法的返回值為EVAL_BODY_INCLUDE,在執行doAfterBody()方法之前,標籤體已經執行了一次,因此在doAfterBody()方法中判斷if條件之前先將num的值自減一次。
(2)註冊標籤處理器類。
在mytag.tld文件中增加一個Tag元素,對標籤處理器類進行註冊,註冊信息如下所示。
<tag>
<name>iterate</name>
<tag-class>cn.itcast.chante-01.c1assisctaa.Iterate</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>num</name>
<required>true</required>
</attribute>
</tag>(3)編寫JSP頁面iterate.jsp。
在JSP頁面中使用標籤,將num屬性的值設置為5,同時將標籤體的內容設置為「hello.itcast!」 。iterate.jsp頁面如上面所示。
<%@page language="java" pageEncoding="GBK"%>
<%@taglib uri="http://www.itcast.cn" prefix= "itcast"%>
<html>
<head>
<title>iterate Tag</title>
</head>
<body>
<itcast:iterate num="5">
hello,itcast!<br/>
</itcast:iterate>
</body>
</html>(4)啟動Tomcat伺服器,在瀏覽器地址欄中輸入「
http://localhost:8080/chapter01/iterate.jsp」訪問iterate.jsp頁面,可以發現,在瀏覽器中標籤體內容「hello,itcast!」顯示了5遍。說明編寫的自定義標籤實現了重複執行標籤體的功能。
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/224067.html
微信掃一掃
支付寶掃一掃