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