javascript
Head First JSP---随笔八(简单标记)
定制標(biāo)記開發(fā)
有時JSTL和標(biāo)準(zhǔn)動作還不夠。構(gòu)建自己的標(biāo)記處理器有3種不同的方法。在這3種方法中,有兩種(簡單標(biāo)記和標(biāo)記文件)是在JSP 2.0新引入的。
建立定制標(biāo)記庫
10.1 描述執(zhí)行各個事件方法(doStartTag()、doAfterBody()和doEndTag())時“傳統(tǒng)”定制標(biāo)記事件模型的語義;解釋各事件方法返回值的含義,并編寫標(biāo)記處理器類。
10.2 使用PageContext API,編寫標(biāo)記處理器來訪問JSP隱式變量以及Web應(yīng)用屬性。
10.3 給定一個場景,編寫標(biāo)記處理器代碼來訪問父標(biāo)記和任意的祖先標(biāo)記。
10.4 描述執(zhí)行事件方法(doTag())時“簡單”定制標(biāo)記事件模型的語義;編寫一個標(biāo)記處理器;并解釋標(biāo)記中對JSP內(nèi)容的限制。
10.5 描述標(biāo)記文件模型的語義:描述標(biāo)記文件的Web應(yīng)用結(jié)構(gòu);編寫一個標(biāo)記文件;解釋標(biāo)記體中對JSP內(nèi)容的限制。
標(biāo)記文件
利用標(biāo)記文件,可以使用一個定制標(biāo)記調(diào)用可重用的內(nèi)容,而不是使用通用的<jsp:include>或<c:import>??梢园褬?biāo)記文件看做是一種“輕型標(biāo)記處理器”,這是因為頁面開發(fā)人員利用標(biāo)記文件創(chuàng)建定制標(biāo)記,而不用表寫復(fù)雜的Java標(biāo)記處理類,但是標(biāo)記文件只是“美化了”的include。
對于標(biāo)記文件,發(fā)送的不是請求參數(shù),而是標(biāo)記屬性!
標(biāo)記文件使用attribute指令
與TLD類似,需要指明標(biāo)記的屬性的屬性名是什么,是否可選的,是否可以是一個EL**表達(dá)式**。
如果屬性值很大
假設(shè)有一個標(biāo)記屬性很長,甚至是一段文字。我們就可以使用<jsp:doBody>。
聲明標(biāo)記文件的body-content
使用tag指令,有一個屬性“body-content”,默認(rèn)值為“scriptless”。還有另外2個屬性值:empty和tagdependent。如果值為scriptless,這說明不能有腳本元素(<%...%>)。
在標(biāo)記文本的體中不能使用腳本代碼!
容器在哪里查找標(biāo)記文件
Jar中標(biāo)記文件的TLD
問:你說過,標(biāo)記文件沒有TLD,還記得嗎?不就是因為這個原因才要使用attribute指令嗎?因為你沒辦法在TLD中聲明屬性,是這樣嗎?
答:這個問題有點意思,如果把標(biāo)記文件部署在Jar中,就必須有一個TLD來描述它的位置。但是它并不描述屬性、body-content等內(nèi)容。標(biāo)記文件的相應(yīng)TLD項只描述具體標(biāo)記文件的位置。如下:
建立一個簡單標(biāo)記處理器
有體的簡單標(biāo)記
簡單標(biāo)記的API
簡單標(biāo)記處理器的生命期
標(biāo)記體使用表達(dá)式
上面的${message}將輸出“Wear sunscreen.”。
有動態(tài)行數(shù)據(jù)的標(biāo)記:迭代執(zhí)行體
最后*輸出結(jié)果是:
有屬性的簡單標(biāo)記
什么是JspFragment?
JspFragment是表示JSP代碼的一個對象。它存在的意義就是讓別人調(diào)用。換句話說,它要運行并生成輸出。如果標(biāo)記調(diào)用了一個簡單標(biāo)記處理器,這個標(biāo)記的體就會封裝在JspFragment對象中,然后再setJspBody()方法發(fā)送給標(biāo)記處理器。
關(guān)鍵是必須記住,JspFragment中不能包含任何腳本元素!也就是說,可以包含模板文本、標(biāo)準(zhǔn)和制定動作,以及EL表達(dá)式,但是不能出現(xiàn)scriptlet、聲明或腳本表達(dá)式。
有一點很棒,因為JspFragment是一個對象,所以可以把這個片段傳遞給其他輔助對象。這些輔助對象再調(diào)用JspFragment的另一個方法getJspContext(),從中得到信息。當(dāng)然,一旦得到上下文,就可以請求屬性。所以getJspContext()實際上是標(biāo)記體向其他對象提供信息的一個途徑。
JspFragment的API:
對于invoke()方法:
SkipPageException:停止處理頁面
假設(shè)有一個頁面調(diào)用了標(biāo)記,而且標(biāo)記依賴于特定請求屬性。下面假設(shè)這個標(biāo)記找不到它需要的屬性,它知道如果自己不成功,頁面的余下部分就不能正常工作,這個時候你想顯示前面部分的內(nèi)容,后一部分的內(nèi)容不顯示,你該怎么辦呢?
這個時候SkipPageException就出來了!如下:
會顯示異常出現(xiàn)之前的所有內(nèi)容,如下:
如果從一個被包含頁面調(diào)用標(biāo)記,會發(fā)生什么情況?
如圖:pageB調(diào)用了拋出異常的標(biāo)記
結(jié)果如下:
會發(fā)現(xiàn)停止頁面B的輸出,而不影響A的繼續(xù)處理。
一個有趣的問題
簡單標(biāo)記要點
簡單標(biāo)記完。。
總結(jié)
以上是生活随笔為你收集整理的Head First JSP---随笔八(简单标记)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Head First JSP---随笔七
- 下一篇: Head First JSP---随笔八