亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JSP > 正文

解析JSP中標簽庫

2024-09-05 00:17:11
字體:
來源:轉載
供稿:網友

標簽庫Taglib

標簽被定義和分布在一個稱為標簽庫的結構中,一個標簽庫是由元信息和類組成的集合:
1.標簽處理器:實現定制標簽功能的Java類。
2.標簽附加信息(TEI):向JSP容器提供邊輯以確認標簽屬性和創建變量的類。
3.標簽庫描述器(TLD):描述單個標簽和整個標簽庫屬性的XML文檔。

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

一、標簽實現

1.開發步驟
a.定義標簽的名字、屬性、聲明的變量和標簽體的內容。
b.編寫標簽庫描述器TLD。
c.編寫標簽處理器。
d.在JSP頁面中使用標簽。

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

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

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

5.體標簽處理器的生命期

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

6.標簽附加信息類


四、標簽指令

taglib指令元素的目的是指定TLD的位置,設置在頁面上與標簽區分開來的一個短別名。
語法:



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国模精品一区| 国产99久久精品一区二区 夜夜躁日日躁| 国产视频欧美视频| 性色av一区二区三区红粉影视| 成人在线国产精品| 欧美怡红院视频一区二区三区| 91欧美激情另类亚洲| 成人有码视频在线播放| 狠狠综合久久av一区二区小说| 精品视频在线观看日韩| 日韩精品在线私人| 亚洲aaa激情| 久久精品国产综合| 久久亚洲精品毛片| 狠狠色噜噜狠狠狠狠97| 日韩福利在线播放| 在线观看精品自拍私拍| 欧美成人合集magnet| 亚洲欧洲激情在线| 成人激情在线播放| 91精品视频播放| 国产啪精品视频网站| 国产精品流白浆视频| 欧美激情一区二区久久久| 国产视频精品xxxx| 国产精品羞羞答答| 久久免费高清视频| 精品国产福利在线| 精品国内亚洲在观看18黄| 亚洲精品国产美女| 97视频在线观看播放| 97超碰国产精品女人人人爽| 久久免费福利视频| 日韩黄在线观看| 国产精品美女www爽爽爽视频| 国产欧美久久久久久| 欧美日韩国产专区| 欧美高清在线视频观看不卡| www.日本久久久久com.| 亚洲国产精品va在线| 精品国产91久久久| 国产亚洲欧美视频| 国产精品成人播放| 亚洲欧洲午夜一线一品| 国产成人精品在线观看| 国产成人激情视频| 亚洲精品中文字幕av| 日产日韩在线亚洲欧美| 亚洲视频日韩精品| 国产欧美在线视频| 国产精品十八以下禁看| 久久精品视频网站| 97精品欧美一区二区三区| 亚洲欧美中文日韩v在线观看| 国产精品亚洲激情| 国产精品香蕉av| 欧美区在线播放| 久久久久久久久中文字幕| 日韩av在线天堂网| 欧美成人三级视频网站| 狠狠久久五月精品中文字幕| 韩剧1988免费观看全集| 亚洲成人精品久久久| 成人精品久久一区二区三区| 日韩精品视频观看| 综合国产在线观看| 亲子乱一区二区三区电影| 国产欧美日韩中文字幕在线| 欧洲精品久久久| 欧美极品少妇xxxxⅹ裸体艺术| 九九视频直播综合网| 国产+成+人+亚洲欧洲| 欧美日韩亚洲天堂| 国产精品69久久久久| 欧美激情视频网站| 亚洲福利在线视频| 亚洲精选在线观看| 久久视频中文字幕| 欧美性色xo影院| 日韩视频免费在线| 97国产精品免费视频| 国内精品一区二区三区四区| 欧美日韩成人在线观看| 精品福利免费观看| 中文字幕综合在线| 国产一区二区丝袜高跟鞋图片| 欧美视频13p| 日韩三级影视基地| 国产精品99一区| 亚洲精品综合精品自拍| 欧美视频不卡中文| 91成人性视频| 国产精品96久久久久久| 久久的精品视频| 一区二区三区视频免费在线观看| 中文字幕av一区二区| 亚洲天堂成人在线视频| 一道本无吗dⅴd在线播放一区| 久久久国产精品亚洲一区| 国产精品成人在线| 久久亚洲精品小早川怜子66| 91久久久亚洲精品| 欧美电影在线观看完整版| 高清欧美性猛交xxxx| 欧美国产极速在线| 美女福利视频一区| 亚洲mm色国产网站| 久久亚洲春色中文字幕| www欧美日韩| 亚洲电影免费在线观看| 91av在线视频观看| 91精品国产色综合久久不卡98口| 97精品国产aⅴ7777| 久久综合网hezyo| 日韩经典中文字幕| 日韩电视剧在线观看免费网站| 精品久久久免费| 日韩天堂在线视频| 久久人人爽人人爽人人片av高清| 国产在线高清精品| 91精品国产综合久久香蕉的用户体验| 久久精品最新地址| 国产精品午夜国产小视频| 亚洲第一区在线观看| 久久福利网址导航| 久久精品电影一区二区| 91网站免费观看| 欧美大片在线看免费观看| 日韩中文字幕第一页| 亚洲图片欧美午夜| 性欧美在线看片a免费观看| 美日韩精品免费观看视频| 日韩**中文字幕毛片| 欧美性猛交xxxx久久久| 亚洲欧洲日产国码av系列天堂| 97激碰免费视频| 欧美中文字幕在线视频| 久久久久久久久久婷婷| 成人性教育视频在线观看| 国产精品久久久久7777婷婷| 日韩中文字幕国产精品| 日韩精品中文在线观看| 日本aⅴ大伊香蕉精品视频| 亚洲一区999| 国产精品视频xxxx| 中文字幕综合在线| 中文字幕不卡在线视频极品| 91精品视频在线免费观看| 国产成人在线一区| 亚洲精品国产综合久久| 成人激情在线播放| 中文字幕av一区| 日本亚洲欧洲色| 亚洲一区二区三| 亚洲一区二区三区乱码aⅴ蜜桃女| 高清一区二区三区四区五区| 这里只有精品丝袜| 国产99久久精品一区二区| 成人黄色av免费在线观看| 狠狠躁夜夜躁人人躁婷婷91| 国产精品嫩草影院一区二区| 欧美日本亚洲视频| 亚洲国产欧美精品| 欧美极品少妇xxxxⅹ裸体艺术|