自定義標籤可以極大的簡化jsp頁面,在JSP頁面中呼叫標籤其實就是呼叫某個標籤處理類中的方法,因此,想要了解自定義標籤,核心還是需要掌握標籤處理類。這裡常用的幾個標籤處理類有
2021-06-30 16:58:08
自定義標籤可以極大的簡化jsp頁面,在JSP頁面中呼叫標籤其實就是呼叫某個標籤處理類中的方法,因此,想要了解自定義標籤,核心還是需要掌握標籤處理類。這裡常用的幾個標籤處理類有:
一、自定義標籤的概念
JSP標籤分為標準JSP 環境自帶的標籤(即前面章節中學習過的JSP 動作標籤)和JSP 自定義標籤。JSP 自定義標籤是使用者定義的標記,它遵循XML 語法。當servlet 容器處理自定義標記時,會自動呼叫一個Java 類檔案完成相對應的功能。Java 開發人員編寫標記處理程式類以處理標記並處理所有需要的Java 程式碼和資料操作。對於Web頁面設計者來說,自定義標記與標準HTML 標記使用起來沒什麼區別,但HTML 標記只能完成前臺顯示的功能,而自定義標記可以在後臺完成某些操作。正確編寫自定義標記可以讓 Web 設計者創建、查詢和操作資料而無需編寫一行Java 程式碼。正確使用自定義標記使 Java 開發人員不必再在編碼過程中考慮表示層。這樣應用程式開發小組的每一位成員都可以關注於他或者她最擅長的事物。所以說,JSP 自定義標記為在動態Web 頁中將表示與業務邏輯分離提供了一種標準化的機制,使頁面設計者可以將注意力放到表示上,而應用程式開發人員編寫後端的程式碼。二、自定義標籤常用的需繼承的類、需實現的介面
SimpleTag: SimpleTag介面是JSP2.0中新給出的介面,用來簡化自定義標籤,所以現在我們基本上都是使用SimpleTag。他是一個簡單標籤機制SimpleTagSupport: 要比實現SimpleTag介面方便太多了,現在你只需要重寫doTag()方法,其他方法都已經被SimpleTagSuppport完成了。他不是一個介面,所以只能繼承這個SimpleTagSupport類。TagSupport:自定義標籤default Adapter模式(預設適配模式)BodyTagSupport:自定義標籤標籤體互動模式三、SimpleTag:簡單標籤機制
JSP 2.0 中加入了新的創建自定義標記的API:javax.servlet.jsp.tagext.SimpleTag,該API 定義了用來實現簡單標記的介面。和JSP 1.2 中的已有介面不同的是,SimpleTag 介面不使用doStartTag()和doEndTag()方法,而提供了一個簡單的doTag()方法。這個方法在呼叫該標記時只被使用一次。一個自定義標記中實現的所有邏輯都在這個方法中實現。相對JSP1.2 中自定義標記機制,SimpleTag 的方法和處理週期要簡單得多。
(一)SimpleTag介面內容
void doTag():標籤執行方法;JspTag getParent():獲取父標籤;void setParent(JspTag parent):設定父標籤void setJspContext(JspContext context):設定PageContextvoid setJspBody(JspFragment jspBody):設定標籤體物件;請記住,萬物皆物件!在JSP頁面中的標籤也是物件!你可以通過檢視JSP的源碼,清楚的知道,所有標籤都會變成物件的方法呼叫。標籤對應的類我們稱之為「標籤處理類」!
(二)SimpleTag標籤的生命週期
當容器(Tomcat)第一次執行到某個標籤時,會創建標籤處理類的例項;然後呼叫setJspContext(JspContext)方法,把當前JSP頁面的pageContext物件傳遞給這個方法;如果當前標籤有父標籤,那麼使用父標籤的標籤處理類物件呼叫setParent(JspTag)方法;如果標籤有標籤體,那麼把標籤體轉換成JspFragment物件,然後呼叫setJspBody()方法;每次執行標籤時,都呼叫doTag()方法,它是標籤處理方法。(三)SimpleTag介面具體實現類
(四)TLD(標籤庫描述檔案)
標籤庫描述檔案是用來描述當前標籤庫中的標籤的!標籤庫描述檔案的副檔名為tld,你可以把它放到WEB-INF下,這樣就不會被客戶端直接訪問到了。
(五)在web.xml中部署標籤庫檔案
一個標籤對應一個標籤處理類,在TLD檔案中對標籤進行定義和描述後,想要在jsp頁面中使用標籤,則必須在web.xml中對標籤庫進行載入和描述,具體實現程式碼如下:
(六)在JSP中使用自定義的標籤
在JSP中使用自定義標籤,主要有兩個步驟
使用taglib匯入標籤庫;使用標籤;
四、SimpleTagSupport
繼承SimpleTagSuppport:要比實現SimpleTag介面方便許多了,只需要重寫doTag()方法,其他方法都已經被SimpleTagSuppport完成。
(一)定義繼承於SimpleTagSupport的標籤處理類
(二)JSP中標籤體幾個選項
標籤體有內容,首先得確定標籤體的可選值,可選值的具體位置在tld檔案中,如圖所示:
具體可選內容如下:
empty:無標籤體。JSP:傳統標籤支援它,SimpleTag已經不再支援使用JSP。標籤體內容可以是任何東西:EL、JSTL、<%=%>、<%%>,以及html;scriptless:標籤體內容不能是Java指令碼,但可以是EL、JSTL等。在SimpleTag中,如果需要有標籤體,那麼就使用該選項;tagdependent:標籤體內容不做運算,由標籤處理類自行處理,無論標籤體內容是EL、JSP、JSTL,都不會做運算。這個選項幾乎沒有人會使用!(三)如何獲得JSP頁面中標籤體的內容
獲得標籤體的內容,在SimpleTagSupport中,主要是通過getJspBody()方法,具體步驟如下:
獲取標籤體物件:JspFragment jspBody = getJspBody();把標籤體內容輸出到頁面:jspBody.invoke(null);tld中指定標籤內容類型:scriptless。如果想把標籤體中的內容輸出到字元串,可以使用StringWriter物件例項,即:jsjspBody.invoke(stringWriter)
(四)在TLD檔案中設定標籤體選項
在前面已經講到,標籤體的穩定項有四種類型,如果標籤體需要有內容,一般都會使用scriptless選項
(五)不執行標籤後面JSP頁面內容
在一定的情況下,當我們執行完成標籤中的標籤內容後,不再想執行標籤體後面的Jsp頁面內容,那麼就就需要在doTag()方法中拋出一個SkipPageException。
(六)標籤處理類屬性值的傳遞
標籤處理類帶有屬性時,想要在JSP頁面中通過標籤將值傳遞到標籤處理類,需有以下幾個條件:
標籤處理類的屬性必須設定set方法,只有設定set方法,標籤處理類才能接收到JSP頁面中,通過標籤傳遞進來的值;在TLD標籤庫描述檔案中,須設定相關的選項,主要有兩個選項:required選項: 明確是否是必須傳遞值的屬性;
rtexprvalue選項:是否可以接受EL表示式;
在web.xml中對TLD檔案進行載入描述
在JSP頁面中匯入自定義的標籤庫(TLD),並使用.
五、TagSupport與BodyTagSupport
(一)TagSupport簡介
這是一種不帶標記體的標籤,所以該類標籤的處理類直接繼承javax.servlet.jsp.tagext.TagSupport即可。TagSupport 的主要方法如下:
public int doStartTag() throws JspException.在WEB 容器遇到標籤開始時,該方法會運行。public int doEndTag() throws JspException在WEB 容器遇到標籤結束時,該方法會運行。
這個地方需要理解的是:TagSupport是預設不帶標籤體的回傳設定,如果需要與標籤體進行互動,則需要分別設定doStartTag(),doEndTag()和doAfterBody()的回傳參數設定.
TagSupport 類中有一個重要的成員:pageContext,該成員的功能與JSP 的內建物件pageContex完全相同。通過該物件可以得到其他幾個JSP 物件的引用。這樣,我們就可以在JAVA 類中與JSP 進行互動了。如: JspWriter out=pageContext.getOut();這一語句可以得到JSP 內建物件out 的引用,通過out 我們就可以向客戶端瀏覽器中輸出內容了。要使用其他幾個JSP 物件原理與此相同。
(二)TagSupport中回傳參數的設定
如果在自訂標籤庫時,並不需要對標籤本體作處理,則您可以繼承TagSupport類別.因為TagSupport預設的回傳上參數是設定為不對標籤本體進行處理的.
TagSupport預設方法是:doStartTag()和doEndTag(),這是不執行標籤體中的內容所需要用到的兩個方法.其中doStartTag()方法是遇到標籤開始時會呼叫的方法,其合法的回傳值是EVAL_BODY_INCLUDE與SKIP_BODY,前者表示將顯示標籤間的本體文字,後者表示不顯示標籤間的本體文字;doEndTag()方法是在遇到標籤結束時呼叫的方法,其合法的回傳值是EVAL_PAGE與SKIP_PAGE,傳回前者表示處理完標籤後繼承執行以下JSP網頁,傳回後者則表示不處理接下來的JSP網頁。
如果TagSupport需要處理標籤體,則會用到doAfterBody()文方法,則需要修改標籤處理類中doStartTag(),doEndTag() 和doAfterBody()各個的回傳參數.doAfterBody(),這個方法是在顯示完標籤間文字本體之後呼叫的,其合法的回傳值有EVAL_BODY_AGAIN與SKIP_BODY,如果傳回前者,則會再顯示一次標籤間的文字本體,傳回後者則繼承執行標籤處理的下一步。
(三)TagSupport中預設的回傳值
預設的回傳值是:doStartTag()回傳 SKIP_BODY、doAfterBodyTag()回傳SKIP_BODY、doEndTag()回傳EVAL_PAGE。所以在繼承 TagSupport之後,如果沒有改寫任何的方法,則在標籤處理上執行的順序是:
doStartTag() -> 不顯示本體文字 -> doEndTag() -> 執行接下來的JSP網頁
如果您改寫了doStartTag(),則您必須指定回傳值,如果指定了EVAL_BODY_INCLUDE,則預設會照以下的順序執行:
doStartTag() -> 顯示本體文字 -> doAfterBodyTag()->doEndTag()->執行接下來的JSP網頁
其總體流程圖如下:
(四)TagSupport開發示例
1. 定義標籤處理類
此開發示例不設計為不含標籤體的,所以各方法的主要回傳參數設定如下:
在自定義的類中,重寫了父類TagSupport 的兩個方法:doStartTag()、doEndTag(),在容器遇到標記開始時會運行doStartTag(),遇到標記結束時運行doEndTag()方法;
doStartTag()方法的返回值:通常可以取兩個值:
EVAL_BODY_INCLUDE——包含標記體,本例中要編寫自結束標記所以不使用該值;
SKIP_BODY——跳過標記體,即不處理標記體,開發自結束標記應該使用該值。
3.doEndTag()方法的返回值:通常可以取兩個值:
SKIP_PAGE——返回這個值,則終止頁面執行;
EVAL_PAGE——返回該值則處理完當前標記後,JSP 頁面中止運行。
2. 創建標籤庫描述符檔案(TLD)
3. 在web.xml檔案中部署TLD檔案
4. 在JSP中載入TLD檔案並使用
(五)TagSupport和BodyTagSupport的區別
TagSupport和BodyTagSupport的區別,主要還是因為doStartTag(),doEndTag()和doAfterBodyTag()的回傳參數不同而不同.
TagSupport不執行標籤體內容,在doStartTag()中,回傳參數為:SKIP_BODY,在doEndTag()中,回傳參數為:EVAL_PAGE;BodyTagSupport,需要執行標籤體中的內容,並且進行互動,因此,在doStartTag()中,回傳參數為EVAL_BODY_INCLUDE;在doAfterBodyTag()中的回傳參數根據互動判斷結果,如果沒有執行完此,則回傳參數為:EVAL_BODY_AGAIN,如果執行完畢,則回傳參數為:SKIP_BODY; 在doEndTag()中,如果要執行jsp頁面,則回傳參數為:EVAL_PAGE,如果不執行其餘的jsp頁面,則回傳參數為:SKIP_PAGE其具體的區別還是前面所學,從流程圖可以看出:
TagSupport流程圖:
doStartTag() -> 不顯示本體文字 -> doEndTag() -> 執行接下來的JSP網頁
BodyTagSupport流程圖:
doStartTag() -> 顯示本體文字 -> doAfterBodyTag()->doEndTag()->執行接下來的JSP網頁
相關文章
自定義標籤可以極大的簡化jsp頁面,在JSP頁面中呼叫標籤其實就是呼叫某個標籤處理類中的方法,因此,想要了解自定義標籤,核心還是需要掌握標籤處理類。這裡常用的幾個標籤處理類有
2021-06-30 16:58:08
作者 | 琰琰、青暮比GPT-3更強大!昨日,微軟與OpenAI共同推出了一款AI程式設計工具GitHub Copilot,這款工具基於GitHub及其他網站的原始碼,可根據上文提示為程式設計師自動編寫下
2021-06-30 16:57:40
雖然對於其實際推出的產品並沒有那麼瞭解,但提到傳音想必不少使用者也並不會感到陌生。同時,傳音旗下的手機品牌Infinix,不少使用者應該也在新聞報道中聽到過。 此前,曾有訊息曝
2021-06-30 16:57:33
01 iQOO Z3官方價格:1499元起步(6+128GB)推薦理由:55W閃充,輕薄款iQOO Z3 採用的是一塊 6.58 英寸的 LCD 螢幕,整體屏佔比90.61%。重量185.5g 、厚度8.5mm。而且這塊螢幕支援DCI-P
2021-06-30 16:56:58
近期,屏下鏡頭設計真的引起了非常高的熱度,一瞬間感覺各大手機廠商都在進行配備使用,甚至感覺今年上半年的新機沒有什麼吸引力了。要知道,今年上半年的手機產品在實力上非常給力
2021-06-30 16:56:14
三星在Galaxy Note7時代搞了第一款FE版(Fan Edition粉絲定製版),而上一年的Galaxy S20也有FE版。按照習慣,今年也會有Galaxy S21 FE,而且最近其訊息越來越多。而6月30日,Galaxy S2
2021-06-30 16:37:34