1. 簡單標籤簡介
由於傳統標籤使用三個標籤介面來完成不同的功能,顯得過於繁瑣,不利於標籤技術的推廣, SUN公司為降低標籤技術的學習難度,在JSP 2.0中定義了一個更為簡單、便於編寫和調用的SimpleTag介面來實現標籤的功能。實現SimpleTag介面的標籤通常稱為簡單標籤。簡單標籤共定義了5個方法:
• setJspContext方法
用於把JSP頁面的pageContext對象傳遞給標籤處理器對象
• setParent方法
用於把父標籤處理器對象傳遞給當前標籤處理器對象
• getParent方法
用於獲得當前標籤的父標籤處理器對象
• setJspBody方法
用於把代表標籤體的JspFragment對象傳遞給標籤處理器對象
• doTag方法
用於完成所有的標籤邏輯,包括輸出、迭代、修改標籤體內容等。在doTag方法中可以拋出javax.servlet.jsp.SkipPageException異常,用於通知WEB容器不再執行JSP頁面中位於結束標記後面的內容,這等效於在傳統標籤的doEndTag方法中返回Tag.SKIP_PAGE常量的情況。
2. 執行相關
SimpleTag介面方法的執行順序
當web容器開始執列標籤時,會調用如下方法完成標籤的初始化
– WEB容器調用標籤處理器對象的setJspContext方法,將代表JSP頁面的pageContext對象傳遞給標籤處理器對象。
– WEB容器調用標籤處理器對象的setParent方法,將父標籤處理器對象傳遞給這個標籤處理器對象。注意,只有在標籤存在父標籤的情況下,WEB容器才會調用這個方法。
– 如果調用標籤時設定了屬性,容器將調用每個屬性對應的setter方法把屬性值傳遞給標籤處理器對象。如果標籤的屬性值是EL運算式或指令碼運算式,則WEB容器首先計算運算式的值,然後把值傳遞給標籤處理器對象。
– 如果簡單標籤有標籤體,容器將調用setJspBody方法把代表標籤體的JspFragment對象傳遞進來。
• 執列標籤時:
– 容器調用標籤處理器的doTag()方法,開發人員在方法體內通過操作JspFragment對象,就可以實現是否執行、迭代、修改標籤體的目的。
• javax.servlet.jsp.tagext.JspFragment類是在JSP2.0中定義的,它的執行個體對象代表JSP頁面中的一段符合JSP文法規範的JSP片段,這段JSP片段中不能包含JSP指令碼元素。
• WEB容器在處理簡單標籤的標籤體時,會把標籤體內容用一個JspFragment對象表示,並調用標籤處理器對象的setJspBody方法把JspFragment對象傳遞給標籤處理器對象。JspFragment類中只定義了兩個方法,如下所示:
JspFragment類
• getJspContext方法
– 用於返回代表調用頁面的JspContext對象.
• public abstract void invoke(java.io.Writer out)
用於執行JspFragment對象所代表的JSP程式碼片段參數out用於指定將JspFragment對象的執行結果寫入到哪個輸出資料流對象中,如果傳遞給參數out的值為null,則將執行結果寫入到JspContext.getOut()方法返回的輸出資料流對象中。(簡而言之,可以理解為寫給瀏覽器)
JspFragment.invoke方法是JspFragment最重要的方法,利用這個方法可以控制是否執行和輸出標籤體的內容、是否迭代執列標籤體的內容或對標籤體的執行結果進行修改後再輸出。例如:
– 在標籤處理器中如果沒有調用JspFragment.invoke方法,其結果就相當於忽略標籤體內容;
– 在標籤處理器中重複調用JspFragment.invoke方法,則標籤體內容將會被重複執行;
– 若想在標籤處理器中修改標籤體內容,只需在調用invoke方法時指定一個可取出結果資料的輸出資料流對象(例如StringWriter),讓標籤體的執行結果輸出到該輸出資料流對象中,然後從該輸出資料流對象中取出資料進行修改後再輸出到目標裝置,即可達到修改標籤體的目的。
注意:
1.標籤後內容不輸出(隱藏標籤後內容)時,簡單標籤與傳統標籤有點不同,自訂的隱藏標籤不能放在jsp的任何位置,只能在body標籤內;而傳統標籤卻可以。
2.
3.開發帶屬性的標籤
自訂標籤可以定義一個或多個屬性,這樣,在JSP頁面中應用自訂標籤時就可以設定這些屬性的值,通過這些屬性為標籤處理器傳遞參數資訊,從而提高標籤的靈活性和複用性。
• 要想讓一個自訂標籤具有屬性,通常需要完成兩個任務:
– 在標籤處理器中編寫每個屬性對應的setter方法
– 在TLD檔案中描術標籤的屬性
• 為自訂標籤定義屬性時,每個屬性都必須按照JavaBean的屬性命名方式,在標籤處理器中定義屬性名稱對應的setter方法,用來接收JSP頁面調用自訂標籤時傳遞進來的屬性值。 例如屬性url,在標籤處理器類中就要定義相應的setUrl(String url)方法。
• 在標籤處理器中定義相應的set方法後,JSP引擎在解析執行開始標籤前,也就是調用doStartTag方法前,會調用set屬性方法,為標籤設定屬性。
在TLD中描述標籤屬性 attribute
元素名 |
是否必須指定 |
描 述 |
description |
否 |
用於指定屬性的描述資訊。 |
name |
是 |
用於指定屬性的名稱。屬性名稱是大小寫敏感的,並且不能以jsp、_jsp、java和sun開頭。 |
required |
否 |
用於指定在JSP頁面中調用自訂標籤時是否必須設定這個屬性。其取值包括true和false,預設值為false,true表示必須設定,否則可以設定也可以不設定該屬性。 |
rtexprvalue |
否 |
rtexprvalue是runtime expression value(運行時運算式)的英文簡寫,用於指定屬性值是一個靜態值或動態值。其取值包括true和false,預設值為false,false表示只能為該屬性指定靜態文本值,例如"123";true表示可以為該屬性指定一個JSP動態元素,動態元素的結果作為屬性值,例如JSP運算式<%=value %>。 |
type |
否 |
用於指定屬性值的Java類型。 |
例子:
<tag>元素的<attribute>子項目用於描述自訂,標籤的一個屬性,自訂標籤所具有的每個屬性,都要對應一個<attribute>元素 。
<attribute>
<description>description</description>
<name>aaaa</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<type>ObjectType</type>
</attribute>