1 Tag文件的結構 java
Tag文件 less
擴展名爲.tag的文本文件 jsp
結構幾乎和JSP文件相同 ui
一個Tag文件中能夠有 編碼
普通的HTML標記符 spa
某些特殊的指令標記(與JSP指令、動做標記對應) .net
成員變量和方法 對象
Java程序片 ip
Java表達式。 內存
AddSum.tag
<p>這是一個Tag文件,負責計算1~100內的奇數之和:
<% int sum=0,i=1;
for(i=1;i<=100;i++)
{ if(i%2==1) sum=sum+I; }
out.println(sum);
%>
EvenSum.tag
<p>這是一個Tag文件,負責計算1~100內的偶數之和:
<% int sum=0,i=1;
for(i=1;i<=100;i++)
{ if(i%2==0) sum=sum+I; }
out.println(sum);
%>
2 Tag文件的存儲目錄
肯定的Tag文件存放目錄
引用Tag文件的JSP頁面:Web服務目錄
Tag文件存放目錄:Web服務目錄\WEB-INF\tags
其中WEB-INF和tags都是固定的目錄名稱,而tags下的子目錄的名稱可由用戶給定。
注意:Tag文件必須使用ANSI編碼保存
3 Tag標記
1)Tag文件的調用
某個Web服務目錄下的Tag文件只能由該Web服務目錄(包括該Web服務目錄的子目錄)中的JSP頁面調用
JSP頁面必須經過Tag標記調用Tag文件
2)Tag標記
伴隨着Tag文件產生,編寫完Tag文件並保存到特定目錄後,就自定義出了一個Tag標記,其格式爲:
<Tag文件名字/>
或
<Tag文件名字>
標記體
</Tag文件名字>
2)Tag標記
自定義標記庫:簡稱標記庫,存放在同一目錄中的若干個Tag文件所對應的Tag標記的全體
3)Tag標記的使用
第一步:使用taglib指令標記引入該Web服務目錄下的標記庫
<%@taglib tagdir=「自定義標記庫的位置」 prefix=「前綴」%>
一個JSP頁面可使用幾個taglib指令標記引入若干個標記庫
<%@taglib tagdir=「/WEB-INF/tags」 prefix="beijing"%>
%@taglib tagdir=「/WEB-INF/tags/geng」 prefix=「dalian"%
第二步:使用帶有前綴的Tag標記調用相應的Tag文件,其中的前綴由taglib指令中的prefix屬性指定。如:
<beijing:AddSum/>
<dalian:EvenSum/>
前綴:經過前綴能夠有效地區分不一樣標記庫中具備相同名字的標記文件。
JSP引擎處理JSP頁面中的Tag標記的原理以下:
①首次調用Tag文件:JSP引擎會將Tag文件轉譯成一個Java文件,並編譯這個Java文件生成字節碼文件,而後執行這個字節碼文件實現Tag文件的動態處理,最後將有關結果發給用戶端
②再次調用,若已被編譯爲字節碼文件,JSP引擎直接執行字節碼文件實現Tag文件的動態處理
③再次調用,發生改變,則同①
•補充:Tag文件在 「<%!」 和「 /%>」標記符號之間聲明的變量,和JSP在 「<%!」 和「 /%>」之間聲明的變量相似,其有效範圍是整個Tag文件
•但有一點不一樣:每當Tag文件對應的字節碼被執行完畢後,這些變量便可釋放所佔有的內存空間
4)Tag標記的標記體
一個Tag文件對應一個Tag標記,並讓JSP頁面使用這個Tag標記動態執行該Tag文件。Tag標記的格式: <Tag文件名字/>
或
<Tag文件名字>
標記體
</Tag文件名字>
動態地向Tag文件傳遞信息
相應地,Tag文件經過調用<jsp:doBody/>處理JSP頁面傳遞過來的「標記體」
標記體的形式:文本數據
4 Tag文件中的經常使用指令
與JSP文件相似,Tag文件中也有一些經常使用指令,這些指令將影響Tag文件的行爲。
Tag文件中常常使用的指令有:tag、taglib、include、attribute、variable。
(1) tag指令
Tag文件中的tag指令相似於JSP文件中的page指令。
Tag指令從整體上影響標記文件的處理和表示
<%@ tag 屬性1= 「value1」 屬性2= 「value2」 …屬性n= 「valueN」 >
一個Tag文件中可使用多個tag指令
<%@tag 屬性 1= 「value 1」>
<%@ tag 屬性 2= 「value 2」 >
…
<%@ tag 屬性 n= 「value n」 >
Tag指令能夠操做的屬性有:body-content、language、import、pageEncoding。
body-content 屬性
指定JSP頁面使用Tag標記時可使用的標記體格式
empty——沒有標記體
tagdependent——有或無標記體,純文本處理
scriptless——有或無標記體,標記體中不能有Java程序片
Tag文件經過<jsp: dobody>獲取JSP頁面傳遞的「標記體」
language 屬性
指定Tag文件使用的腳本語言,目前只能使用Java,其默認值就是java
import 屬性
爲Tag文件引入Java核心包中的類
pageEncoding屬性
指定Tag文件的字符編碼,其默認值是ISO-8859-1。Tag文件必須使用ANSI編碼保存
(2)include指令
使用方法和做用與JSP文件中相似。
(3) attribute指令
向Tag文件傳值。
Tag文件充當着可複用代碼的角色,若是一個Tag文件能容許使用它的JSP頁面向該Tag文件傳遞字符串數據,就使得Tag文件的功能更爲強大。
在Tag文件中經過使用attribute指令,能夠動態地向該Tag文件傳遞須要的字符串數據。attribute指令的格式以下:
<%@ attribute name=「對象名字」
required=「true」|「false「 type=「對象的類型」%>
<%@ attribute name=「對象名字」
required=「true」|「false「 type=「對象的類型」%>
•name:JSP頁面在調用Tag文件時,可向name屬性指定的對象傳遞一個引用
•type:對象的類型,必須帶有包名。若是未指定,則對象的類型爲java.lang.String類型
•requried:可選,默認爲false。指定爲true時,必須傳遞引用,false時可傳可不傳
•JSP頁面使用Tag標記向所調用的Tag文件中name屬性指定的對象傳遞一個引用。方式以下
<前綴:Tag文件名字對象名字=「對象的引用」/>
或
<前綴:Tag文件名字 對象名字=「對象的引用」>
標記體
</前綴:Tag文件名字>
(3) attribute指令
舉例一
•MyTag.tag:
<%@ attribute name=「length」 required=「true 」 %>
•JSP頁面:
<computer:MyTag length=「1000」/>
舉例二
•YourTag.tag:
<%@ attribute name=「result 」 required=「true 」 type=「java.lang.Double」 %>
•JSP頁面:
<computer:YourTag result=「<%= new Double(66.99)%>」/>
在Tag文件中,不能夠在定義和attribute指令中的name屬性指定的對象具備相同名字的變量,不然將隱藏attribute指令中的對象,使其失效。
(4) variable指令
Tag文件經過使用variable指令能夠將Tag文件中的對象返回給調用該Tag文件的JSP頁面。
(1)variable指令的格式
」 variab<%@ variable name-given=「對象名字le-class=「對象的類型」 scope=「有效範圍」%>
例: <%@ variable name-given="time" variable-class="java.util.Date" scope="AT_END" %>
該variable指令給出的對象的名字是time、類型爲java.util.Date、有效範圍是AT_END。
(2)對象的返回
•jspContext調用setAttribute(「對象的名字」,對象的引用)方法存儲對象的名字以及該對象的引用。好比:jspContext.setAttribute("time",new Date());將名字是time的Date對象存儲到jspContext中。
如下的variable指令:<%@ variable name-given=「time」 variable-class=「java.util.Date」 scope=「AT_END」 %>爲JSP頁面返回名字是time的Date對象。
(5) taglib指令
一個Tag文件可使用Tag標記來調用其它的Tag文件。
Tag文件必須使用<taglib>指令引入該Web服務目錄下的標記庫,纔可使用Tag標記來調用相應的Tag文件。<taglib>指令的格式以下:
<%@ taglib tagdir="自定義標記庫的位置" prefix="前綴">
一個Tag文件也可使用幾個<taglib>指令標記引入若干個標記庫,例如:
<%@ taglib tagdir="/WEB-INF/tags" prefix="beijing"%>
<%@ taglib tagdir="/WEB-INF/tags/tagsTwo" prefix="dalian"%> 。
5 Tag標記的嵌套
•當咱們使用Tag標記時,能夠帶有標記體,標記體還能夠是一個Tag標記,這就實現了Tag標記的嵌套。
• Tag標記中的標記體由Tag文件的<jsp:doBody/>標記負責處理,而在Tag文件中,<jsp:doBody />標記被替換成對「標記體」進行處理後所獲得的結果。