1. 什么是自定義標簽
答:1) 用戶(hù)自定義的Java語(yǔ)言元素, 實(shí)質(zhì)是運行一個(gè)或者兩個(gè)接口的JavaBean;
2) 可以非常機密地和JSP的表示邏輯聯(lián)系在一起,又具有和普通JavaBean相同的業(yè)務(wù)邏輯處理能力;
2) 當一個(gè)JSP頁(yè)面轉變?yōu)閟ervlet時(shí),其間的用戶(hù)自定義標簽轉化為操作一個(gè)稱(chēng)為標簽hander的對象;
3) 可操作默認對象,處理表單數據,訪(fǎng)問(wèn)數據庫以及其它企業(yè)服務(wù);
2. 自定義標簽庫的特點(diǎn)
答:1) 通過(guò)調用頁(yè)面傳遞參數實(shí)現定制;
2) 訪(fǎng)問(wèn)所有對JSP頁(yè)面可能的對象;
3) 修改調用頁(yè)面生成的響應;
4) 自定義標簽間可相互通信;
5) 在同一個(gè)JSP頁(yè)面中通過(guò)標簽嵌套,可實(shí)現復雜交互。
3. 如何使用自定義標簽庫
答:1) 聲明標簽庫
2) 使標簽庫執行對Web應用程序可用
4. 聲明標簽庫 5. 使標簽庫執行可用 6. 幾種典型的標簽(疑問(wèn):可以有帶主體而沒(méi)有屬性的標簽么?) 7. 定義標簽 8. 標記庫描述符(TLD)文件 9. 實(shí)現tag的類(lèi)(tag handler) 10. 標簽庫的接口和類(lèi)的繼承關(guān)系 11. 一個(gè)Tag處理程序類(lèi)必須實(shí)現的方法 12. 簡(jiǎn)單的標簽處理程序類(lèi) 13. 帶Body的自定義標簽 14. 定義腳本變量的標簽(迭代的標簽庫) 15. 腳本變量的有效性 16. Tag接口的方法 17. Tag的生命周期 18. BodyTag和Tag接口的關(guān)系 19. BodyTag的處理過(guò)程 20. SimpleTag接口的方法 21. SimpleTage接口的生命周期
答:1) 使用taglib指令聲明標簽庫
2) 語(yǔ)法:<%@taglib uri="URI" prefix="pre" %>
注意:a. uri屬性可以是絕對的,也可以是相對URL,該URL指向標記庫描述符(TLD)文件;
b. uri屬性也可以是一個(gè)并不存在的URL,該URL為web.xml文件中將標記庫描述符(TLD)文件的絕對URL到本地系統的一個(gè)映射;
3) 范例:<%@taglib uri="/WEB-INF/template.tld" prefix="test" %>
<%@taglib uri="
答:方式一:在WEB-INF/classes目錄下部署標記處理程序類(lèi);
方式二:將標記處理程序類(lèi)打包成jar文件并置于WEB-INF/lib目錄。
答:1) 不帶屬性和主體的簡(jiǎn)單標簽:<mytaglibs:SomeTag/>;
2) 不帶主體但有屬性的標簽:<mytaglibs:SomeTag user="TonyDeng"/>;
3) 帶有主體和屬性的標簽:<mytaglibs:SomeTag user="TonyDeng">
...// 標簽體
</mytaglibs:SomeTag>;
注意:a. 屬性列于start tag中,它是在標記庫描述符(TLD)文件中指定,服務(wù)于標記庫的自定義行為;
b. 標簽體位于start tag和end tag間,可以是任何合法的JSP內容或者標簽;
答:1) 開(kāi)發(fā)實(shí)現tag的類(lèi)(tag handler);
2) 編輯標記庫描述符(TLD)文件;
3) 在web.xml中為標記庫描述符(TLD)文件的絕對URL建立一個(gè)映射(該步驟可選);
答:1) 一個(gè)描述標記庫的XML文件;
2) 內容開(kāi)始是整個(gè)庫的描述,然后是tag的描述;
3) 標記庫描述符(TLD)文件用于Web Container確認tag以及JSP頁(yè)面發(fā)展工具;
答:1) 是一些在引用了標簽的JSP頁(yè)面執行期間被Web Container調用以求自定義標簽值的對象;
2) 必須實(shí)現Tag, SimpleTag和BodyTag之一;
3) 可以繼承TagSupport和BodyTagSupport之一。
答:表現形式一:
a. 接口的繼承關(guān)系:
☉ interface javax.servlet.jsp.tagext.JspTag
☉ interface javax.servlet.jsp.tagext.SimpleTag
☉ interface javax.servlet.jsp.tagext.Tag
☉ interface javax.servlet.jsp.tagext.IterationTag
☉ interface javax.servlet.jsp.tagext.BodyTag
b. 類(lèi)的繼承關(guān)系:
☉ class javax.servlet.jsp.tagext.TagSupport (implements javax.servlet.jsp.tagext.IterationTag, java.io.Serializable)
☉ class javax.servlet.jsp.tagext.BodyTagSupport (implements javax.servlet.jsp.tagext.BodyTag)
☉ class javax.servlet.jsp.tagext.SimpleTagSupport (implements javax.servlet.jsp.tagext.SimpleTag)
表現形式二:
(Interface)
JspTag
↑
|ˉˉˉˉˉˉˉˉ|
(Interface) (Interface)
Tag SimpleTag ←--SimpleTagSupport
↑
|
(Interface)
IterationTag←--TagSupport
↑ ↑
| |
(Interface) |
BodyTag ←--BodyTagSupport
答:標簽處理程序類(lèi)型 方法
Simple doStartTag, doEndTag, release
Attributes doStartTag, doEndTag, set/getAttribute...release
Body,No Itrative and doStartTag, doEndTag, release
Evaluation
Body, Itrative Evaluation doStartTag, doAterTag, doEndTag, release
Body, Interaction doStartTag, doEndTag, release, doInitbody, doAfterBody
答:1) 必須實(shí)現Tag接口的doStartTag()和doEndTag()方法;
2) 因為不存在Body,doStartTag()方法必須返回SKIP_BODY;
3) 如其余頁(yè)面要執行,doEndTag()方法返回EVAL_PAGE, 否則返回SKIP_PAGE;
4) 對于每一個(gè)標簽屬性,你必須在標簽處理程序類(lèi)里定義一個(gè)特性以及get和set方法以一致于JavaBeans體系慣例
答:1) 必須實(shí)現Tag接口的doStartTag()和doEndTag()方法;
2) 可以實(shí)現IterationTag接口的doAfterBody()方法;
3) 可以實(shí)現BodyTag接口的doInitBody和setBodyContent方法;
4) doStartTag方法可以返回SKIP_BODY、EVAL_BODY_INCLUDE、或者EVAL_BODY_BUFFERED(當你想使用BodyContent);
5) doEndTag方法可以返回SKIP_PAGE或EVAL_PAGE;
6) doAfterBody方法可以返回EVAL_BODY_AGAIN, SKIP_BODY;
答:1) 定義腳本標簽的二個(gè)步驟:
a. 在標記庫描述符(TLD)文件中列明腳本變量;
b. 定義標簽擴展信息類(lèi)(TEI)并且在TLD文件中包括這個(gè)類(lèi)元素(tei-class);
2) 變量必須在標簽處理程序類(lèi)中使用pageContext.setAttribute()方法設置;
3) 標簽擴展信息類(lèi)(TEI)必須繼承TagExtraInfo以及覆蓋getVariableInfo()方法;
4) 變量的范圍可以是AT_BEGIN, NESTED, AT_END(標簽擴展信息類(lèi)(TEI)的VariableInfo中定義)之一;
答:變量 | 有效性
---------------------------------------
NESTED | 標簽中的參數在starttag到endtag之間是有效的
AT_BEGIN | 標簽中的參數在標簽的開(kāi)始到JSP頁(yè)面結束是有效的
AT_END | 標簽中的參數在標簽的結束到JSP頁(yè)面結束是有效的
答:interface javax.servlet.jsp.tagext.Tag
------------------------------------------------------
+EVAL_BODY_INCLUDE:int
+EVAL_PAGE:int
+SKIP_BODY:int
+SKIP_PAGE:int
------------------------------------------------------
+release():void
+getParent():javax.servlet.jsp.tagext.Tag
+setParent(javax.servlet.jsp.tagext.Tag):void
+doEndTag():int
+doStartTag():int
+setPageContext(javax.servlet.jsp.PageContext):void
答:1) setPageContext(javax.servlet.jsp.PageContext):void
2) setParent(javax.servlet.jsp.tagext.Tag):void
3) //setAttribute:void
4) doStartTag():int
5) doEndTag():int
6) release():void
答:interface javax.servlet.jsp.tagext.BodyTag --> interface javax.servlet.jsp.tagext.Tag
------------------------------------------
+EVAL_BODY_AGAIN:int
------------------------------------------
+doInitBody():void
+setBodyContent(javax.servlet.jsp.tagext.BodyContext):void
+doAfterBody():int
答:1) setPageContext(javax.servlet.jsp.PageContext):void
2) setParent(javax.servlet.jsp.tagext.Tag):void
3) //setParent()
4) doStartTag():int
5) setBodyContent(javax.servlet.jsp.tagext.BodyContent):void
6) doInitBody():void
7) doAfterBody():int
doEndTag():int
9) release():void
答:javax.servlet.jsp.tagext.SimpleTag
------------------------------------------
+doTag():void
+getParent():JspTag
+setJspBody(JspFragment jspBody):void
+setJspContext(JspContext pc):void
+setParent(JspTag parent):void
答:1) new:
每次遇到標簽,容器構造一個(gè)SimpleTag的實(shí)例,這個(gè)構造方法沒(méi)有參數。和紅典的標簽一樣,SimpleTag不能緩沖,故不能重用,每次都需要構造新的實(shí)例。
2) setJspContext()、setParent(): 只有這個(gè)標簽在另一個(gè)標簽之內時(shí),才調用setParent()方法;
3) 設置屬性:調用每個(gè)屬性的setter方法;
4) setJspBody();
5) doTag(): 所有標簽的邏輯、迭代和Body計算,都在這個(gè)方法中;
6) return
聯(lián)系客服