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