日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Head First JSP---随笔八(简单标记)

發布時間:2025/3/15 javascript 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的繼續處理。


一個有趣的問題


簡單標記要點

  • 標記文件使用一個頁面來實現標記功能,而標記處理器使用一個Java標記處理器類實現標記功能。
  • 標記處理器有兩種類型:傳統簡單(簡單標記和標記文件是JSP 2.0中新增加的)。
  • 建立簡單標記處理器時,要擴展SimpleTagSupport(這個類實現了SimpleTag接口)。
  • 要部署一個標記處理器,必須創建一個TLD,使用<tag>元素來描述標記,JSTL和其他定制標記庫也使用這個元素描述標記。
  • 如果使用一個有體的簡單標記,要保證這個標記的TLD<tag>沒有將<body-content>聲明為empty。然后調用getJspBody().invoke()來處理體。
  • 簡單標記生命周期:簡單標記不會由容器重用,所以每次調用標記時,都會實例化標記處理器,并調用其setJspContext()方法。如果標記本身是從另一個標記中調用,則會調用setParent()方法。如果調用標記時有屬性,對于每個屬性會調用一個bean式的設置方法(setXxx())。如果調用標記時有體(假設其TLD沒有聲明它的體為空),則會調用setJspBody()方法。最后,調用doTag()方法,結束時,撤銷標記處理器實例。
  • 只有調用標記時確實有體,才會調用setJspBody()方法。如果調用標記時沒有體,不論是空標記<my:tag/>,還是開始和結束標記<my:tag></my:tag>之間沒有內容,都不會調用setJspBody()方法。記住,如果標記有體,TLD必須反映出這一點,而且<body-content>的值不能是“empty”。
  • 簡單標記的doTag()方法可以設置標記體使用的一個屬性,為此先調用getJspContext().setAttribute(),在調用getJspBody().invoke()。
  • doTag()方法聲明了一個JspException和一個IOException,所以可以直接寫至JspWriter,而無需包裝在一個try/catch中。
  • 通過在循環中調用體(getJspBody().invoke()),可以迭代處理簡單標記的體。
  • 如果標記有一個屬性,要在TLD中使用<attribute>元素聲明這個屬性,并在標記處理器類中提供一個bean式的設置方法。調用標記時,會在doTag()之前先調用這個設置方法。
  • getJspBody()方法返回一個JspFragment,它有兩個方法:invoke(java.io.Writer)和getJspContext(),getJspContext()返回一個Jspcontext,標記處理器可以用這個JspContext訪問PageContext API(訪問隱式變量和作用域屬性)。
  • 如果向invoke()傳入null,會把計算的體寫至響應輸出,不過,如果你想直接訪問體內容,可以傳入另一個Writer。
  • 如果你希望當前頁面停止處理,可以拋出一個SkipPageException。如果調用標記的頁面包含在另一個頁面中,盡管被包含的頁面在拋出異常之后就會停止處理,但外層頁面仍會繼續。

  • 簡單標記完。。

    總結

    以上是生活随笔為你收集整理的Head First JSP---随笔八(简单标记)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。