首页 > 代码库 > 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-INFtags都是固定的目录名称,而tags下的子目录的名称可由用户给定。

?注意:Tag文件必须使用ANSI编码保存

3 Tag标记

1Tag文件的调用

?某个Web服务目录下的Tag文件只能由该Web服务目录(包括该Web服务目录的子目录)中的JSP页面调用

?JSP页面必须通过Tag标记调用Tag文件

2Tag标记

?伴随着Tag文件产生,编写完Tag文件并保存到特定目录后,就自定义出了一个Tag标记,其格式为:

<Tag文件名字/>

<Tag文件名字>

标记体

</Tag文件名字>

2Tag标记

?自定义标记库:简称标记库,存放在同一目录中的若干个Tag文件所对应的Tag标记的全体

3Tag标记的使用

?第一步:使用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文件对应的字节码被执行完毕后,这些变量即可释放所占有的内存空间

4Tag标记的标记体

?一个Tag文件对应一个Tag标记,并让JSP页面使用这个Tag标记动态执行该Tag文件。Tag标记的格式: <Tag文件名字/>

<Tag文件名字>

标记体

</Tag文件名字>

?动态地向Tag文件传递信息

?相应地,Tag文件通过调用<jsp:doBody/>处理JSP页面传递过来的“标记体”

?标记体的形式:文本数据

4 Tag文件中的常用指令

?JSP文件类似,Tag文件中也有一些常用指令,这些指令将影响Tag文件的行为。

?Tag文件中经常使用的指令有:tagtaglibincludeattributevariable

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-contentlanguageimportpageEncoding

body-content 属性

?指定JSP页面使用Tag标记时可以使用的标记体格式

empty——没有标记体

tagdependent——有或无标记体,纯文本处理

scriptless——有或无标记体,标记体中不能有Java程序片

Tag文件通过<jsp: dobody>获取JSP页面传递的“标记体”

language 属性

指定Tag文件使用的脚本语言,目前只能使用Java,其默认值就是java

import 属性

?Tag文件引入Java核心包中的类

pageEncoding属性

?指定Tag文件的字符编码,其默认值是ISO-8859-1Tag文件必须使用ANSI编码保存

2include指令

?使用方法和作用与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=“对象的类型”%>

?nameJSP页面在调用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页面:

<computerMyTag length=“1000”/>

举例二

?YourTag.tag

<%@ attribute name=“result ” required=“true ” type=“java.lang.Double” %>

?JSP页面:

<computerYourTag result=“<%= new Double(66.99)%>”/>

Tag文件中,不可以在定义和attribute指令中的name属性指定的对象具有相同名字的变量,否则将隐藏attribute指令中的对象,使其失效。

4 variable指令

Tag文件通过使用variable指令可以将Tag文件中的对象返回给调用该Tag文件的JSP页面。

1variable指令的格式

” 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());将名字是timeDate对象存储到jspContext中。

以下的variable指令:<%@ variable name-given=time variable-class=java.util.Date scope=AT_END %>JSP页面返回名字是timeDate对象。

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标记