JSPServletJSF標(biāo)簽庫(kù)的深入研究_JSP教程
推薦:Spring框架下實(shí)現(xiàn)基于組的用戶權(quán)限管理在幾乎所有的web應(yīng)用中都需要對(duì)訪問(wèn)者(用戶)進(jìn)行權(quán)限管理, 因?yàn)槲覀兿M承╉?yè)面只對(duì)特定的用戶開放, 以及某些操作只有符合身份的用戶才能進(jìn)行。這之中涉及到了身份驗(yàn)證和權(quán)限管理. 只有單用
標(biāo)簽庫(kù)Taglib
標(biāo)簽被定義和分布在一個(gè)稱為標(biāo)簽庫(kù)的結(jié)構(gòu)中,一個(gè)標(biāo)簽庫(kù)是由元信息和類組成的集合:
1.標(biāo)簽處理器:實(shí)現(xiàn)定制標(biāo)簽功能的Java類。
2.標(biāo)簽附加信息(TEI):向JSP容器提供邊輯以確認(rèn)標(biāo)簽屬性和創(chuàng)建變量的類。
3.標(biāo)簽庫(kù)描述器(TLD):描述單個(gè)標(biāo)簽和整個(gè)標(biāo)簽庫(kù)屬性的XML文檔。
標(biāo)簽處理器和標(biāo)簽附加信息需要定位在JSP容器類載入器可以找到的地方。標(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.開發(fā)步驟
a.定義標(biāo)簽的名字、屬性、聲明的變量和標(biāo)簽體的內(nèi)容。
b.編寫標(biāo)簽庫(kù)描述器TLD。
c.編寫標(biāo)簽處理器。
d.在JSP頁(yè)面中使用標(biāo)簽。
2.JSP頁(yè)面在JSP容器中的轉(zhuǎn)換步驟:
JSP頁(yè)面存在三種形式:jsp文件、java文件和class文件。
a.指令元素、和向JSP容器提供轉(zhuǎn)換時(shí)信息。
b.HTML行在_jspService()方法中依順序轉(zhuǎn)換到out.print()語(yǔ)名中。
c.腳本元素的聲明被原封不動(dòng)地復(fù)制到_jspService()方法外的源碼中。
d.腳本元素的表達(dá)式在_jspService()方法中依順序轉(zhuǎn)換到out.print()語(yǔ)名中。
e.腳本元素的scriptlet被原封不動(dòng)地復(fù)制到_jspService()方法中。
f.行為元素被轉(zhuǎn)換為執(zhí)行其功能的運(yùn)行時(shí)邏輯代碼。
g.定制標(biāo)簽被擴(kuò)展到調(diào)用其相應(yīng)標(biāo)簽處理器中方法的Java語(yǔ)句中。
3.標(biāo)簽在JSP容器中的轉(zhuǎn)換步驟:
a.JSP容器使用taglib指令元素定位標(biāo)簽庫(kù)描述器,將頁(yè)面中用到的定制標(biāo)簽和TLD相匹配。
b.讀取標(biāo)簽庫(kù)描述器的標(biāo)簽列表和每一標(biāo)簽相關(guān)的類名字。
c.在頁(yè)面中遇到一個(gè)標(biāo)簽時(shí),查找與具有指定名字的標(biāo)簽前綴相關(guān)的一個(gè)標(biāo)簽庫(kù)。
d.容器使用在TLD中找到的標(biāo)簽結(jié)構(gòu)信息生成一系列完成標(biāo)簽功能的Java語(yǔ)句。
二、標(biāo)簽庫(kù)描述器(TLD)
標(biāo)簽庫(kù)描述器是一個(gè)描述整個(gè)標(biāo)簽庫(kù)標(biāo)記信息和庫(kù)中每個(gè)標(biāo)簽處理器及其屬性的XML文檔。
標(biāo)簽庫(kù)描述器的DTD由一個(gè)簡(jiǎn)單的元素組成,此元素包含下列一些子元素。
整個(gè)標(biāo)簽庫(kù)標(biāo)記信息
tlibversion標(biāo)簽庫(kù)版本號(hào)。是一個(gè)點(diǎn)式十進(jìn)制數(shù),最多為4組小數(shù)點(diǎn)分隔的數(shù)字組成。
jspversion標(biāo)簽庫(kù)所需的JSP規(guī)范最低版本。例如JSP1.1
shortname標(biāo)簽庫(kù)的縮寫名。JSP可以使用該名字作為庫(kù)中標(biāo)簽的缺省前綴。
uri標(biāo)簽庫(kù)唯一URI的元素。典型URL位置來(lái)自可下載taglib的位置。
info標(biāo)簽庫(kù)描述信息。
每個(gè)標(biāo)簽處理器及其屬性
tag在TLD中加入標(biāo)簽,描述組成庫(kù)的每個(gè)標(biāo)簽。
name與標(biāo)簽庫(kù)的名字前綴一起使用的標(biāo)簽的名字,是JSP容器唯一的標(biāo)簽標(biāo)識(shí)。
tagclass實(shí)現(xiàn)標(biāo)簽的標(biāo)簽處理器類的全名。
teiclass標(biāo)簽附加信息(TEI)類的全名。TEI類給出關(guān)于標(biāo)簽處理器創(chuàng)建變量及對(duì)標(biāo)簽司性執(zhí)行的任意有效性驗(yàn)證的信息。
bodycontent描述標(biāo)簽處理器如何使用標(biāo)簽體的內(nèi)容。有三種取值:
empty:表示標(biāo)簽體必須為空;
JSP:表示腳本元素和模板及其它標(biāo)簽一樣被評(píng)估。
tagdependent:體內(nèi)容被原封不動(dòng)寫入BodyContent,其它腳本元素以源碼形式出現(xiàn),而不被JSP容器解釋。
info標(biāo)簽的人工可讀描述性信息。
attribute使用標(biāo)簽時(shí)被編碼的屬性信息。用于定義標(biāo)簽的屬性。
屬性名:屬性的名字。
true|false:屬性在標(biāo)簽用到的位置是否要被編碼。
true|false:屬性值能否用表達(dá)式指定。
三、標(biāo)簽處理器
標(biāo)簽處理器是通過(guò)實(shí)現(xiàn)JSP容器調(diào)用的一系列預(yù)定義方法執(zhí)行定制標(biāo)簽行為的一個(gè)Java類。
標(biāo)簽處理器實(shí)現(xiàn)了標(biāo)簽的行為,標(biāo)簽處理器是Java類。
1.標(biāo)簽處理器的工作方式
a.導(dǎo)入javax.servlet.jsp和javax.servlet.jsp.tagext包。
b.實(shí)現(xiàn)javax.servlet.jsp.tagext包中的Tag接口或BodyTag接口。BodyTag是Tag的子接口。
c.繼承TagSupport類或BodyTagSuppoert類。它們是上述接口的缺省實(shí)現(xiàn)。
d.重載publicintdoStartTag()throwsJspException方法。
2.標(biāo)簽處理器的接口與實(shí)現(xiàn)
javax.servlet.jsp.tagext.Tag是實(shí)現(xiàn)標(biāo)簽的最基本的接口。
javax.servlet.jsp.tagext.TagSupport是實(shí)現(xiàn)Tag接口的具體類。
通常情況下繼承tagSupport類而不直接實(shí)現(xiàn)Tag接口通常是有益的。除了對(duì)所有必需方法提供了缺省實(shí)現(xiàn)外、還保存了pageContext對(duì)象及對(duì)嵌套標(biāo)簽的支持。
Tag接口包含4個(gè)常量,表示doStartTag()和doEndTag()方法可能的返回碼。
EVAL_BODY_INCLUDE當(dāng)doStartTag()返回時(shí),指明servlet應(yīng)對(duì)標(biāo)簽體進(jìn)行評(píng)估。
SKIP_BODY當(dāng)doStartTag()返回時(shí),指明servlet應(yīng)忽視標(biāo)簽體。
EVAL_PAGE當(dāng)doEndTag()返回時(shí),指明頁(yè)面其余部分應(yīng)被評(píng)估。
SKIP_PAGE當(dāng)doEndTag()返回時(shí),指明頁(yè)面其余部分就被跳過(guò)。
Tag接口的方法
publicvoidsetPageContext(PageContextctx)生成的servlet在請(qǐng)求處理器執(zhí)行其它任務(wù)前首先調(diào)用此方法,實(shí)現(xiàn)類應(yīng)保存上下文對(duì)象以便它可以在標(biāo)簽生命期中使用。從頁(yè)面上下文中標(biāo)簽處理器可以訪問(wèn)所有JSP隱含對(duì)象。
publicvoidsetParent(Tagp)使用一個(gè)標(biāo)答可以找到操作棧中它上面的標(biāo)簽。在setPageContext后立即調(diào)用。
publicTaggetParent()返回父標(biāo)簽。
publicintdoStartTag()throwsJsp在設(shè)置了頁(yè)面上下文、父標(biāo)簽和開始標(biāo)記中編碼的屬性后調(diào)用。返回碼表明JSP實(shí)現(xiàn)servlet是否就評(píng)估標(biāo)簽體。
publicintdoEndTag()throwsJspException當(dāng)遇到結(jié)否標(biāo)記時(shí)調(diào)用。返回碼表明JSP是否就繼紐頁(yè)面的其余部份。
publicvoidrelease()確保在頁(yè)面退出前被調(diào)用。釋放資源并重置標(biāo)簽處理器狀態(tài)。
TagSupport類的方法
publicstaticTagfinAncestorWithClass(TagthisTag,Classcls)為所需的父標(biāo)簽處理器查找運(yùn)行時(shí)標(biāo)簽棧。一個(gè)標(biāo)簽處理器可以提供其范圍內(nèi)子標(biāo)簽調(diào)用的方法。
publicvoidsetId(Stringid)保存和檢索在id屬性中指定的名字。
publicvoidsetValue(Stringname,Objecto)在本地哈希表中設(shè)置指定名字的值。
publicObjectgetValue(Stringname)從本地哈希表中獲取指定名稱的值。
publicvoidremoveValue(Stringname)從本地哈希表中刪除指定名稱的值。
publicEnumerationgetValues()返回哈希表中關(guān)鍵字的一個(gè)枚舉。
3.標(biāo)簽處理器的生命期
a.生成servlet需要?jiǎng)?chuàng)建標(biāo)簽處理器類的一個(gè)實(shí)例。實(shí)現(xiàn)方式通常是調(diào)用JSP容器的工廠類的一個(gè)方法,工廠類包含一個(gè)標(biāo)簽處理器實(shí)例池以使其可重用不再處于激活狀態(tài)的對(duì)象。
b.初始化標(biāo)簽處理器,使servlet獲知其存在性。servlet通過(guò)調(diào)用標(biāo)簽處理器的兩個(gè)方法實(shí)現(xiàn)此過(guò)程:setPageContext(PageContextctx)和setParent(Tagparent)。
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類。
BodyContent是javax.servlet.jsp.JspWriter的子類,但與其父類有所區(qū)別。
BodyContent對(duì)象的內(nèi)容不自動(dòng)寫了入servlet的輸出流,而是積累在一字符串緩存中。當(dāng)標(biāo)簽體完成后其對(duì)象仍可在doEndTag()方法中可以應(yīng)用,由getString()或getReader()方法操作。并在必要時(shí)修改及寫入恢復(fù)的JspWriter輸出流。
BodyContent類的方法
publicvoidflush()throwsIOException復(fù)寫JspWrite.flush()方法以便它總是產(chǎn)生溢出。刷新寫入已失效,因?yàn)樗鼪](méi)有連接到將被寫入的實(shí)際輸出流中。
publicvoidclearBody()重置BodyContent緩存為空。
publicReadergetReader()返回Reader讀取體內(nèi)容。
publicStringgetString()返回包含體內(nèi)容的一個(gè)字符串。
publicvoidwriteOut(Writew)將體內(nèi)容寫入指定輸出。
publicJspWritegetEnclosingWrite()返回棧中下一個(gè)更高的寫入者對(duì)象(可能是另一個(gè)BodyContent對(duì)象)。
分享:選擇JSF不選Struts的十大理由我的一個(gè)客戶不知道該選用Struts還是JSF。就像你預(yù)料的那樣,我通常會(huì)問(wèn):這2中框架之間有什么區(qū)別?當(dāng)然,除了我的這個(gè)客戶外很多人都面臨這樣的選擇。 總的來(lái)說(shuō),我建議
- jsp response.sendRedirect不跳轉(zhuǎn)的原因分析及解決
- JSP指令元素(page指令/include指令/taglib指令)復(fù)習(xí)整理
- JSP腳本元素和注釋復(fù)習(xí)總結(jié)示例
- JSP FusionCharts Free顯示圖表 具體實(shí)現(xiàn)
- 網(wǎng)頁(yè)模板:關(guān)于jsp頁(yè)面使用jstl的異常分析
- JSP頁(yè)面中文傳遞參數(shù)使用escape編碼
- 基于jsp:included的使用與jsp:param亂碼的解決方法
- Java Web項(xiàng)目中連接Access數(shù)據(jù)庫(kù)的配置方法
- JDBC連接Access數(shù)據(jù)庫(kù)的幾種方式介紹
- 網(wǎng)站圖片路徑的問(wèn)題:絕對(duì)路徑/虛擬路徑
- (jsp/html)網(wǎng)頁(yè)上嵌入播放器(常用播放器代碼整理)
- jsp下顯示中文文件名及絕對(duì)路徑下的圖片解決方法
JSP教程Rss訂閱編程教程搜索
JSP教程推薦
猜你也喜歡看這些
- JSP是什么?JSP是什么意思?
- JSP初學(xué)者必須掌握的語(yǔ)法點(diǎn)
- Spring學(xué)習(xí)基礎(chǔ)---多框架集成
- Java中計(jì)算任意兩個(gè)日期之間的工作天數(shù)
- 高性能、高彈性JSP和Servlet性能優(yōu)化
- 在JSP中如何實(shí)現(xiàn)MD5加密
- JDBC連接Access數(shù)據(jù)庫(kù)的幾種方式介紹
- 利用Java編寫手機(jī)應(yīng)用程序 Motorola iDEN篇1
- Spring框架下實(shí)現(xiàn)基于組的用戶權(quán)限管理
- MVC模式在j2me項(xiàng)目中的應(yīng)用二
- 相關(guān)鏈接:
- 教程說(shuō)明:
JSP教程-JSPServletJSF標(biāo)簽庫(kù)的深入研究
。