首页 > 代码库 > Tag文件和Tag标记
Tag文件和Tag标记
1 Tag文件的结构
?Tag文件
?扩展名为.tag的文本文件
?结构几乎和JSP文件相同
?一个Tag文件中可以有
?普通的HTML标记符
?某些特殊的指令标记(与JSP指令、动作标记对应)
?成员变量和方法
?Java程序片
?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 />标记被替换成对“标记体”进行处理后所得到的结果。
Tag文件和Tag标记