目录
前言
本章主要内容为Tag文件的结构、Tag标记、Tag文件中的常用指令。
1.1 Tag文件
1.1.1 Tag文件的结构
Tag文件是扩展名为.tag的文本文件,其结构和JSP文件相似。一个Tag文件中可以有普通的HTML标记符、某些特殊的指令标记、成员变量声明和方法的定义、Java程序片和Java表达式。
<% @ tag pageEncoding="utf-8"%>
1.1.2 Tag文件的保存
Tag文件可以实现代码的复用,即Tag文件可以被许多JSP页面使用。如果某个Web服务目录下的JSP页面准备调用一个Tag文件,那么必须在该Web服务目录下建立如下的目录结构:
web服务目录\WEB-INF\tags
其中WEB-INF(字母大写)和tags目录都是固定的目录名称,而tags下的子目录的名称可由用户给定。
一个Tag文件必须保存在tags目录或其下的子目录中。
保存Tag文件时按照Tag文件指定的编码保存。
2.1 Tag标记
2.1.1 Tag标记与Tag文件
某个web服务目录下的Tag文件只能由该web服务目录中的JSP页面调用,JSP页面必须通过Tag标记来调用一个Tag文件。
<Tag文件的名字/>
或者
<Tag文件的名字>其他内容</Tag文件的名字>
一个Tag文件对应着一个Tag标记,把全体Tag标记称之为一个自定义标记库或者简称为标记库。
2.1.2 Tag标记的使用
一个JSP页面通过使用Tag标记来调用一个Tag文件。Web服务目录下的一个JSP页面在使用Tag标记来调用一个Tag文件之前,必须首先使用taglib,指令标记引人该Web服务目录下的标记库,只有这样,JSP页面才可以使用Tag标记调用相应的Tag文件。
taglib指令的格式如下:
<% @ taglib tagdir= "标记库的位置"prefix="前缀">
引入标记库后,JSP页面就可以使用带前缀的Tag标记调用相应的Tag文件,其中的前缀由<taglib>指令中的prefix属性指定。
taglib指令中的prefix给出的前缀有用户自定义,其好处是通过前缀可以有效地区分不同标记库中具有相同名字的标记文件。
注意:JSP页面使用Tag标记时,冒号:的左右不要有空格。
以下是JSP页面使用Tag标记的例子:
<%@ page contentType = "text/html" %>
<%@ page pageEncoding = "utf-8" %>
<%@ taglib tagdir = "/WEB-INF/tags" prefix = "computer"%>
<HTML><body bgcolor = cyan>
<h1>调用Tag文件计算100内奇数和:</h1>
<computer:oddNumberSum /> <%-- 使用Tag标记 --%>
</body></HTML>
2.1.3 Tag标记的运行原理
Tomcat 服务器处理JSP 页面中的Tag标记的原理如下:
★如果该Tag标记对应的Tag文件是首次被JSP 页面调用,那么 Tomcat服务器会将Tag文件转译成一个Java文件,并编译这个Java文件生成字节码文件,然后执行这个字节码文件(这和执行JSP页面的原理类似)。
★如果该 Tag文件已经被转编译为字节码文件,Tomcat 服务器将直接执行这个字节码文件。
★如果对Tag文件进行了修改,那么Tomcat服务器会重新将Tag文件转译成一个Java 文件,并编译这个Java文件生成字节码文件,然后执行这个字节码文件。
3.1 Tag文件中的常用指令
3.1.1 tag指令
Tag文件通过使用tag指令可以指定某些属性的值,以便从总体上影响Tag文件的处理与表示。tag指令的语法如下:
<% @ tag属性1=“属性值”属性2=“属性值”....属性n=“属性值” %>
在一个Tag文件中可以使用多个tag指令,因此我们经常使用多个tag指令为属性指定需要的值:
<% @ tag属性1=“属性值" %>
<% @ tag属性2=“属性值" %>
.....
<% @ tag属性3=“属性值" %>
tag指令有三个属性,分别是language属性、import属性、pageEncoding属性。
3.1.2 include指令
在Tag文件中也有和JSP文件类似的include指令标记,,其使用方法和作用与JSP文件中的include指令标记相似。
<jsp:include page="文件的URL"/>
3.1.3 attribute指令
Tag文件充当着可复用代码的角色,如果一个Tag文件允许使用它的JSP页面向该Tag 文件传递数据,就使得Tag文件的功能更为强大。在Tag文件中通过使用attribute 指令让使用它的JSP页面向该Tag文件传递需要的数据。
attribute 指令的格式如下:
<% @ attribute name ="对象名字"required="ture"|"false"type="对象的类型"%>
JSP页面使用Tag标记向所调用的Tag文件中name指定的对象传递一个引用,方法如下:
<前缀:Tag文件名字 对象名字="对象的引用"/>
注:在Tag文件中不可以再定义和attribute指令中的name属性给出的对象具有相同名字的变量,否则将隐藏在attribute指令中给出的对象,使其失效。
例子:
example3.jsp
<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %>
<%@ page import="java.util.LinkedList" %>
<%@ page import="java.util.Random" %>
<%@ taglib tagdir="/WEB-INF/tags/example3" prefix="sortNumber"%>
<HTML><body bgcolor = #CCCCCC>
<% LinkedList<Double> listNumber=new LinkedList<Double>();
Random random = new Random();
for(int i =0;i<3;i++) {
double d = random.nextDouble(); //[0,1)之间的随机数
listNumber.add(d);
}
%>
<p style="font-family:宋体;font-size:36;color:blue">
排序数据
<sortNumber:sort list="<%= listNumber %>"/> <%-- 使用Tag标记 --%>
</body></HTML>
sort.tag
<%@ attribute name="list" required="true" type="java.util.LinkedList" %>
<%@ tag import="java.util.Collections" %>
<%@ tag import="java.util.Iterator" %>
<%
Collections.sort(list); //排序链表
Iterator<Double> ite = list.iterator(); //得到迭代器
while(ite.hasNext()) { //遍历链表
out.print("<br>"+ite.next());
}
%>
效果图如下所示:
3.1.4 variable指令
Tag文件通过使用attribute 指令,可以使得调用该Tag文件的JSP页面动态地向其传递数据。在某些Web 应用中,JSP 页面不仅希望向Tag文件传递数据,而且希望Tag文件能运回数据给JSP 页面。比如,许多JSP 页面可能都需要调用某个 Tag文件对某些数据进行基本的处理,但不希望Tag文件做进一步的特殊处理以及显示数据,因为各个JSP页面对数据的进一步处理或显示格式的要求是不同的。因此,JSP 页面希望Tag文件将数据的基本处理结果存放在某些对象中,将这些对象返回给当前JSP页面即可。
Tag 文件通过使用variable指令可以将Tag文件中的对象返回给调用该Tag文件的JSP页面。
variable指令格式如下:
<% @ variable name -give="对象名"variable-class="对象类型"scope="有效范围"%>
3.1.5 taglib指令
JSP页面和Tag文件都可以使用taglib指令引入标记库。一个Tag文件也可以使用几个taglib指令标记引入若干个标记库 。
taglib指令格式如下:
<% @ taglib tagdir ="自定义标记库的位置"prefix="前缀">
4.1 总结
以上就是今天要讲的内容,本文仅仅简单介绍了Tag文件的结构、Tag标记、Tag文件中的常用指令。