方立勋_30天掌握JavaWeb_自定义标签
自定義標簽主要用于移除Jsp頁面中的java代碼。
使用自定義標簽移除jsp頁面中的java代碼,只需要完成以下兩個步驟:
- 編寫一個實現Tag接口的Java類(標簽處理器類)。
- 編寫標簽庫描述符(tld)文件,在tld文件中對標簽處理器類進行描述。
快速入門:使用標簽輸出客戶機IP。
1、編寫一個實現tag接口的標簽處理器類
2、在web-inf/目錄下新建tld文件,在tld文件中對標簽處理器進行描述
<?xml version="1.0" encoding="UTF-8" ?><taglib xmlns="http://java.sun.com/xml/ns/j2ee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"version="2.0"><description>A tag library exercising SimpleTag handlers.</description><tlib-version>1.0</tlib-version><short-name>SimpleTagLibrary</short-name><uri>/itcast</uri><tag><name>viewIP</name> <!-- 為標簽處理器類配一個標簽名 --><tag-class>cn.itcast.web.tag.ViewIPTag</tag-class><body-content>empty</body-content></tag></taglib>3、在jsp頁面中導入并使用自定義標簽
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@taglib uri="/itcast" prefix="itcast" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head><title>輸出客戶機的IP</title></head><body>您的IP是:<itcast:viewIP/></body> </html>傳統標簽
傳統標簽執行流程
JSP引擎將遇到自定義標簽時,首先創建標簽處理器類的實例對象,然后按照JSP規范定義的通信規則依次調用它的方法。
Tag接口的執行流程:
自定義標簽功能擴展:
- 開發人員在編寫Jsp頁面時,經常還需要在頁面中引入一些邏輯,例如:
- 控制jsp頁面某一部分內容是否執行。
- 控制整個jsp頁面是否執行。
- 控制jsp頁面內容重復執行。
- 修改j頁面內容輸出。
自定義標簽除了可以移除jsp頁面java代碼外,它也可以實現以上功能。
tld文件中的四種標簽體類型
EMPTY JSP scriptless tagdepentend
左邊圈起來的部分是JSP2.0之前所用的,稱為傳統標簽,現在一般使用的是右邊圈起來的部分SimpleTag接口和實現類創建自定義標簽。
簡單標簽
- 由于傳統標簽使用三個標簽接口來完成不同的功能,顯得過于繁瑣,不利于標簽技術的推廣, SUN公司為降低標簽技術的學習難度,在JSP 2.0中定義了一個更為簡單、便于編寫和調用的SimpleTag接口來實現標簽的功能。實現SimpleTag接口的標簽通常稱為簡單標簽。簡單標簽共定義了5個方法:
setParent方法:用于把父標簽處理器對象傳遞給當前標簽處理器對象
getParent方法:用于獲得當前標簽的父標簽處理器對象
setJspBody方法:用于把代表標簽體的JspFragment對象傳遞給標簽處理器對象
doTag方法:用于完成所有的標簽邏輯,包括輸出、迭代、修改標簽體內容等。在doTag方法中可以拋出javax.servlet.jsp.SkipPageException異常,用于通知WEB容器不再執行JSP頁面中位于結束標記后面的內容,這等效于在傳統標簽的doEndTag方法中返回Tag.SKIP_PAGE常量的情況。
SimpleTag接口方法的執行順序
- WEB容器調用標簽處理器對象的setJspContext方法,將代表JSP頁面的pageContext對象傳遞給標簽處理器對象。
- WEB容器調用標簽處理器對象的setParent方法,將父標簽處理器對象傳遞給這個標簽處理器對象。注意,只有在標簽存在父標簽的情況下,WEB容器才會調用這個方法。
- 如果調用標簽時設置了屬性,容器將調用每個屬性對應的setter方法把屬性值傳遞給標簽處理器對象。如果標簽的屬性值是EL表達式或腳本表達式,則WEB容器首先計算表達式的值,然后把值傳遞給標簽處理器對象。
- 如果簡單標簽有標簽體,容器將調用setJspBody方法把代表標簽體的JspFragment對象傳遞進來。
- 容器調用標簽處理器的doTag()方法,開發人員在方法體內通過操作JspFragment對象,就可以實現是否執行、迭代、修改標簽體的目的。
JspFragment類
javax.servlet.jsp.tagext.JspFragment類是在JSP2.0中定義的,它的實例對象代表JSP頁面中的一段符合JSP語法規范的JSP片段,這段JSP片段中不能包含JSP腳本元素。
WEB容器在處理簡單標簽的標簽體時,會把標簽體內容用一個JspFragment對象表示,并調用標簽處理器對象的setJspBody方法把JspFragment對象傳遞給標簽處理器對象。JspFragment類中只定義了兩個方法,如下所示:
getJspContext方法
用于返回代表調用頁面的JspContext對象.
public abstract void invoke(java.io.Writer out)
- 用于執行JspFragment對象所代表的JSP代碼片段
- 參數out用于指定將JspFragment對象的執行結果寫入到哪個輸出流對象中,如果傳遞給參數out的值為null,則將執行結果寫入到JspContext.getOut()方法返回的輸出流對象中。(簡而言之,可以理解為寫給瀏覽器)
invoke方法詳解
JspFragment.invoke方法是JspFragment最重要的方法,利用這個方法可以控制是否執行和輸出標簽體的內容、是否迭代執行標簽體的內容或對標簽體的執行結果進行修改后再輸出。例如:
- 在標簽處理器中如果沒有調用JspFragment.invoke方法,其結果就相當于忽略標簽體內容;
- 在標簽處理器中重復調用JspFragment.invoke方法,則標簽體內容將會被重復執行;
- 若想在標簽處理器中修改標簽體內容,只需在調用invoke方法時指定一個可取出結果數據的輸出流對象(例如StringWriter),讓標簽體的執行結果輸出到該輸出流對象中,然后從該輸出流對象中取出數據進行修改后再輸出到目標設備,即可達到修改標簽體的目的。
開發帶屬性的標簽
要想讓一個自定義標簽具有屬性,通常需要完成兩個任務:
- 在標簽處理器中編寫每個屬性對應的setter方法
- 在TLD文件中描術標簽的屬性
為自定義標簽定義屬性時,每個屬性都必須按照JavaBean的屬性命名方式,在標簽處理器中定義屬性名對應的setter方法,用來接收JSP頁面調用自定義標簽時傳遞進來的屬性值。 例如屬性url,在標簽處理器類中就要定義相應的setUrl(String url)方法。
在標簽處理器中定義相應的set方法后,JSP引擎在解析執行開始標簽前,也就是調用doStartTag方法前,會調用set屬性方法,為標簽設置屬性。
在TLD中描述標簽屬性:
簡單標簽調用流程圖
總結
以上是生活随笔為你收集整理的方立勋_30天掌握JavaWeb_自定义标签的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 方立勋_30天掌握JavaWeb_(Se
- 下一篇: 方立勋_30天掌握JavaWeb_EL表