在自定義標(biāo)簽得開發(fā)過程中,有時(shí)需要對(duì)標(biāo)簽體得內(nèi)容進(jìn)行重復(fù)處理,這時(shí),可以使用IterationTag接口,它繼承自Tag 接口,在Tag接口基礎(chǔ)上新增了一個(gè) eval_BODY_AGAIN常量和一個(gè) doAfterBody()方法,具體如下。
1. eval_BODY_AGAIN常量
eval_BODY_AGAIN常量是doAfterBody()方法得返回值,如果doAfterBody()方法返回該常量,JSP容器會(huì)把標(biāo)簽體得內(nèi)容重復(fù)執(zhí)行一次。
2. int doAfterBody()方法
JSP容器在每次執(zhí)行完標(biāo)簽體后會(huì)調(diào)用doAfterBody()方法,該方法可以返回常量SKIP_BODY和eval_BODY_AGAIN。如果方法返回SKIP_BODY常量,JSP容器回執(zhí)行代表結(jié)束得標(biāo)簽得doEndTag()方法,如果返回eval_BODY_AGAIN,則重復(fù)執(zhí)行標(biāo)簽體。
為了讓讀者更好地學(xué)習(xí)IterationTag接口,接下來通過一個(gè)案例演示如何使用IterationTag接口實(shí)現(xiàn)重復(fù)執(zhí)行標(biāo)然休得功能,具體步驟如下。
(1)編寫標(biāo)簽處理器類。
建Web工程chapter1,并在工程下編寫標(biāo)簽處理器類Iterate.java。由于TagSupport類實(shí)現(xiàn)了IterationTag接口,為了簡化程序得編寫,我們定義得標(biāo)簽處理器類只需繼承TagSupport類即可,Iterate.java類得實(shí)現(xiàn)代碼如下代碼所示。
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; } //執(zhí)行一次標(biāo)簽體 public int doStartTag() throws JspException { return Tag.eval_BODY_INCLUDE; } //根據(jù)屬性值對(duì)標(biāo)簽體進(jìn)行執(zhí)行 public int doAfterBody() throws JspException { num--; if (num > 0) { return eval_BODY_AGAIN; } else { return SKIP_BODY; //跳過標(biāo)簽體 } }}
在上面代碼中,成員變量num用于接收標(biāo)簽num屬性得值,用來決定標(biāo)簽體得執(zhí)行次數(shù)。由于doStartTag()方法得返回值為eval_BODY_INCLUDE,在執(zhí)行doAfterBody()方法之前,標(biāo)簽體已經(jīng)執(zhí)行了一次,因此在doAfterBody()方法中判斷if條件之前先將num得值自減一次。
(2)注冊(cè)標(biāo)簽處理器類。
在mytag.tld文件中增加一個(gè)Tag元素,對(duì)標(biāo)簽處理器類進(jìn)行注冊(cè),注冊(cè)信息如下所示。
<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頁面中使用標(biāo)簽,將num屬性得值設(shè)置為5,同時(shí)將標(biāo)簽體得內(nèi)容設(shè)置為“hello.itcast!” 。iterate.jsp頁面如上面所示。
<%等page language="java" pageEncoding="GBK"%><%等taglib uri="感謝分享特別itcast感謝原創(chuàng)分享者" prefix= "itcast"%><html> <head> <title>iterate Tag</title> </head> <body> <itcast:iterate num="5"> hello,itcast!<br/> </itcast:iterate> </body></html>
(4)啟動(dòng)Tomcat服務(wù)器,在瀏覽器地址欄中輸入“感謝分享localhost:8080/chapter01/iterate.jsp”訪問iterate.jsp頁面,可以發(fā)現(xiàn),在瀏覽器中標(biāo)簽體內(nèi)容“hello,itcast!”顯示了5遍。說明編寫得自定義標(biāo)簽實(shí)現(xiàn)了重復(fù)執(zhí)行標(biāo)簽體得功能。