国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > JSP > 正文

解析JSP中標(biāo)簽庫(kù)

2024-09-05 00:17:11
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

標(biāo)簽庫(kù)Taglib

標(biāo)簽被定義和分布在一個(gè)稱(chēng)為標(biāo)簽庫(kù)的結(jié)構(gòu)中,一個(gè)標(biāo)簽庫(kù)是由元信息和類(lèi)組成的集合:
1.標(biāo)簽處理器:實(shí)現(xiàn)定制標(biāo)簽功能的Java類(lèi)。
2.標(biāo)簽附加信息(TEI):向JSP容器提供邊輯以確認(rèn)標(biāo)簽屬性和創(chuàng)建變量的類(lèi)。
3.標(biāo)簽庫(kù)描述器(TLD):描述單個(gè)標(biāo)簽和整個(gè)標(biāo)簽庫(kù)屬性的XML文檔。

標(biāo)簽處理器和標(biāo)簽附加信息需要定位在JSP容器類(lèi)載入器可以找到的地方。標(biāo)簽庫(kù)描述器可在URL指定的符意位置。JSP1.1規(guī)范要求JSP容器接受一個(gè)打包成因定結(jié)構(gòu)的JAR文件的標(biāo)簽庫(kù)。TLD必須是/META-INF目錄中名為taglib.tld的文件,JAR文件則復(fù)制到/WEB-INF/lib目錄下。

一、標(biāo)簽實(shí)現(xiàn)

1.開(kāi)發(fā)步驟
a.定義標(biāo)簽的名字、屬性、聲明的變量和標(biāo)簽體的內(nèi)容。
b.編寫(xiě)標(biāo)簽庫(kù)描述器TLD。
c.編寫(xiě)標(biāo)簽處理器。
d.在JSP頁(yè)面中使用標(biāo)簽。

2.JSP頁(yè)面在JSP容器中的轉(zhuǎn)換步驟:
JSP頁(yè)面存在三種形式:jsp文件、java文件和class文件。
a.指令元素

3.標(biāo)簽處理器的生命期
a.生成servlet需要?jiǎng)?chuàng)建標(biāo)簽處理器類(lèi)的一個(gè)實(shí)例。實(shí)現(xiàn)方式通常是調(diào)用JSP容器的工廠類(lèi)的一個(gè)方法,工廠類(lèi)包含一個(gè)標(biāo)簽處理器實(shí)例池以使其可重用不再處于激活狀態(tài)的對(duì)象。
b.初始化標(biāo)簽處理器,使servlet獲知其存在性。servlet通過(guò)調(diào)用標(biāo)簽處理器的兩個(gè)方法實(shí)現(xiàn)此過(guò)程:setPageContext(PageContext ctx)和setParent(Tag parent)。
c.如果標(biāo)簽具有屬性,屬性的取值通過(guò)處理器提供setter方法傳入到對(duì)象。屬性setter方法是一個(gè)標(biāo)簽支持屬性所需的唯一方法。
d.頁(yè)面的上下文和父標(biāo)簽已被調(diào)置,并已具備屬性。此時(shí)調(diào)用標(biāo)簽處理器的doStartTag()方法,該方法可以讀取這些變量并執(zhí)行實(shí)現(xiàn)標(biāo)答功能所需的計(jì)算和操作。doStartTag()方法必須返回一個(gè)整型數(shù)。返回EVAL_BODY_INCLUDE則正常處理標(biāo)簽體,返回SKIP_BODY則從初始JSP頁(yè)面中直到此標(biāo)簽結(jié)束標(biāo)記處的內(nèi)容均被忽略。
e.標(biāo)簽體被評(píng)估或忽視后調(diào)用標(biāo)簽處理器的doEndTag()方法,返回EVAL_PAGE則頁(yè)面的其余部分被評(píng)估,返回SKIP_PAGE則servlet代碼立即從_jspService()中返回。

4.體標(biāo)簽處理器的接口與實(shí)現(xiàn)
javax.servlet.jsp.tagext.BodyTag是Tag的子接口。
javax.servlet.jsp.tagext.BodyTagSupport是實(shí)現(xiàn)BodyTag類(lèi)。
BodyContent是javax.servlet.jsp.JspWriter的子類(lèi),但與其父類(lèi)有所區(qū)別。
BodyContent對(duì)象的內(nèi)容不自動(dòng)寫(xiě)了入servlet的輸出流,而是積累在一字符串緩存中。當(dāng)標(biāo)簽體完成后其對(duì)象仍可在doEndTag()方法中可以應(yīng)用,由getString()或getReader()方法操作。并在必要時(shí)修改及寫(xiě)入恢復(fù)的JspWriter輸出流。
BodyContent類(lèi)的方法
public void flush()throws IOException 復(fù)寫(xiě)JspWrite.flush()方法以便它總是產(chǎn)生溢出。刷新寫(xiě)入已失效,因?yàn)樗鼪](méi)有連接到將被寫(xiě)入的實(shí)際輸出流中。
public void clearBody() 重置BodyContent緩存為空。
public Reader getReader() 返回Reader讀取體內(nèi)容。
public String getString() 返回包含體內(nèi)容的一個(gè)字符串。
public void writeOut(Write w) 將體內(nèi)容寫(xiě)入指定輸出。
public JspWrite getEnclosing Write() 返回棧中下一個(gè)更高的寫(xiě)入者對(duì)象(可能是另一個(gè)BodyContent對(duì)象)。
BodyTag接口定義了一個(gè)新的整型常量
EVAL_BODY_TAG 當(dāng)doStartTag()返回時(shí),使得新的BodyContent對(duì)象被創(chuàng)建并與此標(biāo)簽處理器相關(guān)聯(lián)。當(dāng)doAfterBody()返回時(shí),使得JSP servlet在修改完此標(biāo)簽控制的任意變量后再次評(píng)估體。
BodyTag接口的方法
public void setBodyContern (BodyContent out) 在當(dāng)前JspWriter已被寫(xiě)入,一個(gè)新的BodyContent在被創(chuàng)建后由Jsp servlet調(diào)用,它發(fā)生在doStartTag()之后。
public void doInitBody() throws JspException setBodyContent()之后,體被評(píng)估前調(diào)用的生命期方法。如果多次評(píng)估體,此方法只調(diào)用一次。
public init doAfterBody() throws JspException 體被評(píng)估后,BodyContent寫(xiě)入者仍處于激活狀態(tài)時(shí)調(diào)用的生命期方法。此方法必須返回EVAL_BODY_TAG或SKIP_BODY,若返回EVAL_BODY_TAG時(shí)體再次被評(píng)估。
BodyTagSupport類(lèi)的方法
public int doStartTag() throws JspException 復(fù)寫(xiě)TagSupport中的doStartTag()方法。
public int doEndTag() throws JspException 調(diào)用TagSupport中的doEndTag()方法,返回結(jié)果。
public void setBodyContent (BodyContent out) 在一保護(hù)成員變量bodyContent中保存新的體內(nèi)容對(duì)象,子類(lèi)可直接訪問(wèn)此對(duì)象。
public void doInitBody() throws JspException 缺省什么都不做。被需要執(zhí)行初始化的子類(lèi)所復(fù)寫(xiě)。
public int doAfterBody() throws JspException 每次體被評(píng)估后由JSP servlet調(diào)用,體同容對(duì)象仍處于激活狀態(tài)。返回SKEP_BODY或EVAL_BODY_TAG則體再次被評(píng)估
public void release() 設(shè)置bodyContent對(duì)象為null,然后調(diào)用super.release()。
public BodyContent getBodyContent() 返回bodyContent變量。子類(lèi)已經(jīng)可以訪問(wèn)保護(hù)變量,但此方法允許無(wú)關(guān)的標(biāo)簽處理類(lèi)對(duì)此體內(nèi)容發(fā)送輸出。
public JspWriter getPreviousOut() 在bodyContent變量上調(diào)用getEnclosingWriter()并返回結(jié)果的簡(jiǎn)便方法。

5.體標(biāo)簽處理器的生命期

a.生成servlet需要?jiǎng)?chuàng)建標(biāo)簽處理器類(lèi)的一個(gè)實(shí)例。實(shí)現(xiàn)方式通常是調(diào)用JSP容器的工廠類(lèi)的一個(gè)方法,工廠類(lèi)包含一個(gè)標(biāo)簽處理器實(shí)例池以使其可重用不再處于激活狀態(tài)的對(duì)象。
b.初始化標(biāo)簽處理器,使servlet獲知其存在性。servlet通過(guò)調(diào)用標(biāo)簽處理器的兩個(gè)方法實(shí)現(xiàn)此過(guò)程:setPageContext(PageContext ctx)和setParent(Tag parent)。
c.如果標(biāo)簽具有屬性,屬性的取值通過(guò)處理器提供setter方法傳入到對(duì)象。屬性setter方法是一個(gè)標(biāo)簽支持屬性所需的唯一方法。
d.頁(yè)面的上下文和父標(biāo)簽已被調(diào)置,并已具備屬性。調(diào)用標(biāo)簽處理器的doStartTag()方法,該方法可以讀取這些變量并執(zhí)行實(shí)現(xiàn)標(biāo)答功能所需的計(jì)算和操作。
doStartTag()方法必須返回一個(gè)整型數(shù)。
返回EVAL_BODY_TAG則正常處理標(biāo)簽體(跳到e);
返回SKIP_BODY則從初始JSP頁(yè)面中直到此標(biāo)簽結(jié)束標(biāo)記處的內(nèi)容均被忽略。(跳到f)
e.如果返回EVAL_BODY_TAG時(shí),則正常處理標(biāo)簽體。
e1.在棧中保存當(dāng)前的JspWriter對(duì)象,創(chuàng)建新的BodyContent對(duì)象,并將其置為JSP頁(yè)面的out對(duì)象保存在上下文范圍內(nèi)名為name的屬性中。并調(diào)用它的setBodyContent()方法。
e2.調(diào)用doInitBody()方法進(jìn)行初始化。
e3.處理標(biāo)簽體。將輸出寫(xiě)入BodyContent對(duì)象中,此過(guò)程依賴(lài)于TLD的標(biāo)簽元素,有三種可能取值。
e4.調(diào)用doAfterBody()方法,將體內(nèi)體內(nèi)容寫(xiě)入JspWriter,可如下實(shí)現(xiàn):
JspWriter out=bodyContent.getEnclosingWriter();
out.println(bodyContent.getString());//bodyContent.writeOut(out);
bodyContent.clear();
e5.doAfterBody()方法返回兩種可能:
返回EVAL_BODY_TAG時(shí),再對(duì)標(biāo)簽體進(jìn)行評(píng)估,這是數(shù)組和枚舉被循環(huán)處理的典型情況。
返回SKIP_PAGE時(shí),繼續(xù)頁(yè)面的其余部份。
e6.體內(nèi)容完成,因此創(chuàng)建它的過(guò)程被反向:
調(diào)用pageContent.popBody()方法檢索前面的JspWriter對(duì)象。
將寫(xiě)入者設(shè)置回out隱含對(duì)象。
f.標(biāo)簽體被評(píng)估或忽視后調(diào)用doEndTag()方法,允許標(biāo)簽處理器像輸出流發(fā)回內(nèi)容。
返回EVAL_PAGE則頁(yè)面的其余部分被評(píng)估;
返回SKIP_PAGE則servlet代碼立即從_jspService()中返回。
g. 此時(shí)體的內(nèi)容在受保護(hù)的bodyContent對(duì)象中仍然可用。
可以將它寫(xiě)入servlet輸出流中:
JspWriter out=pageContext.getOut();
out.println(bodyContent.getString());
或者
bodyContent.WriteOut(pageContext.getOut());

6.標(biāo)簽附加信息類(lèi)


四、標(biāo)簽指令

taglib指令元素的目的是指定TLD的位置,設(shè)置在頁(yè)面上與標(biāo)簽區(qū)分開(kāi)來(lái)的一個(gè)短別名。
語(yǔ)法:



發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 延吉市| 富阳市| 达拉特旗| 安仁县| 东源县| 翁源县| 法库县| 陕西省| 阿城市| 神池县| 方城县| 喀喇沁旗| 保德县| 岑溪市| 鄂托克前旗| 泸州市| 习水县| 云和县| 织金县| 喀什市| 德化县| 黔江区| 青田县| 万年县| 来凤县| 尉氏县| 滁州市| 阿合奇县| 务川| 巴青县| 上杭县| 新龙县| 南安市| 南京市| 吴忠市| 台湾省| 丁青县| 沈丘县| 繁昌县| 堆龙德庆县| 东港市|