目录
3.1Tag文件
a.Tag文件的结构
Tag文件是扩展名为.tag的文本文件,其结构与jsp文件非常相似
tag文件由这几部分组成
1.HTML标记符+特殊的jsp标记
2.java程序片
3.变量,方法,类声明
4.java表达式
5.Tag标记
以下是一个简单的tag文件,负责计算100以内奇数的和
<%@ tag pageEncoding="utf-8" %> //tag标记
<p style="font-family:宋体;font-size:36">
1~100内的奇数之和:
<% int sum=0,i=1; //java程序片
for(i=1;i<=100;i++){
if(i%2==1)
sum=sum+i;
}
out.println(sum);
%>
</p>
b.Tag文件的保存
1.Tag文件所在的目录
其中WEB-INF(字母大写)和tags都是固定的目录名称,而tags目录下的子目录的名称可以由用户给定。
原因:Tag文件可以实现代码的复用,即Tag文件可以被许多jsp页面使用。为了能让一个web应用中jsp页面使用某一个tag文件,所以必须把tag文件存放到tomcat服务器指定的目录中。
所在目录:Web服务目录\WEB-INF\tags
2.Tag文件的编码
Tag文件指定的编码是utf-8,所以在保存tag文件时,将保存类型(T)选择为所有文件(*.*),将编码(E)选择“UTF-8”。
<%@ tag pageEncoding="utf-8"%>
3.2Tag标记
a.Tag标记与Tag文件
jsp页面必须通过Tag标记来调用一个Tag文件,tag标记的名字和Tag文件的名字一致,也就是说当我们写了一个tag文件放到特定的目录中,也就给出了一个tag标记
tag格式为
<Tag文件的名字/>
或者
<Tag文件的名字>其他内容(称为标体内容)</Tag文件的名字>
一个Tag文件对应一个Tag标记,把全体Tag标记称为一个自定义标记库或简称为标记库
b.Tag标记的使用
一个jsp页面通过使用tag标记来调用一个Tag文件。Web服务目录下的一个jsp页面使用tag标记调用文件之前,必须首先使用taglib指令标记引入该web服务目录下的标记库,只有这样jsp才能调用相应的tag文件
taglib指令的格式如下:
<%@taglib tagdir='标记库的位置' prefix='前缀'>
例如
<%@taglib tagdir='/WEB-INF/tags' prefix='computer'%>
taglib指令中的prefix给出的前缀由用户自定义,其好处是,通过前缀可以有效区分不同标记库中具有相同名字的标记文件
注意: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>
c.Tag标记的运行原理
1.如果该Tag标记对应的tag文件是首件被jsp调用,那么tomcat服务器会将tag文件转译成一个java文件,并编译这个java文件生成字节码文件,然后执行这个字节码文件
2.如果该tag文件已经被编译成字节码文件,tomcat服务器将直接执行这个字节码文件
3.如果对tag文件进行了修改,那么tomcat服务器将会重新将tag文件转译成一个java文件,并编译这个java文件生成字节码文件,然后执行这个字节码文件
3.3 Tag文件的常用指令
3.3.1.tag指令
tag指令的语法如下:
<%@ tag 属性1='属性值' 属性2='属性值'---属性n='属性值'% >
或者
<%@ tag 属性1='属性值' % >
<%@ tag 属性2='属性值' % >
<%@ tag 属性3='属性值' % >
------
<%@ tag 属性n='属性值' % >
a.language属性
language属性的值指定tag文件使用的脚本语言,目前只能取值java,其默认值就是java
在写tag文件时,没必要使用tag指令指定language属性的值
b.import属性
import属性的作用是为tag文件引入包中的类,它可以取多个值
import java.lang.*;
import javax.servelt.*;
import javax.serverlt.jsp.*;
------
c.pageEncording
该属性指定tag文件的字符编码,其默认值为ISO-8859-1。目前,为了避免显示信息出现乱码的现象,tag文件需要将该属性值设为utf-8
<%@ tag pageEncoding="utf-8"%>
3.3.2 include指令
在tag文件中也有和jsp文件类似的include指令标记,和jsp文件中的include指令标记类似。
大家可以去看一下我的jsp第二章有说到
3.3.3 attribute指令
在tag文件中通过attribute指令让使用它的jsp页面向该页面tag文件传递需要的数据
<%@ attribute name="对象名字" required="ture"|"false" type ="对象的类型"%>
例如:<%@ attribute name="reuslt" required="ture" type="java.lang.Double"%>
相当于tag文件中有了一个名字是result的对象,但Tag文件不需要创建该对象result,
而是等待JSP页面将一个Double型的对象的引用传递给result。
JSP页面使用Tag文件所调用的Tag文件中name指定的对象传递一个引用,方式如下
<前缀:Tag文件名字 对象名字="对象的引用"/>
比如,JSP页面使用tag标记(前缀为computer)调用myTag.tag
<computer:myTag result="newdouble(3.1415926)"/>
attribute 指令中的required属性也是可选的,如果省略required属性,那么它的默认值为false
当指定required的值是ture,调用该tag文件的jsp页面必须向该tag文件中的attribute指令中的name属性给出的对象传递一个引用
注意: 在tag文件中不可以再定义和attribute指令中的name属性给出的对象具有相同名字的变量,否则将隐藏attribute指令中给出的对象,使其失效
3.3.4 variable指令
Tag文件通过使用variable指令可以将Tag文件中的对象返回给调用该Tag文件的JSP页面
<%@ variable name-given="对象名" variable-class="对象类型" scope="有效范围">
属性name-given的值就是Tag文件返回JSP页面的对象
1.name-given返回给jsp页面的对象,它的名字必须由字母,数字,下画线和美元符号组成
2.variable-class的值是返回的对象的类型,对象的类型必须带有包名,如果没有使用variable-class给出的对象类型,那么对象类型默认值为 java.lang.String类型
下面的 variable 指令给出的对象名子是time,类型为java.time.LocalDate,
有效范围是AT_END
<%@ variable name-given="time"
variable-class="java.time.LocalDate"scope="AT_END" %>
3.3.5 taglib指令
JSP页面或Tag文件都可以使用taglib指令引入标记库,格式如下
<%@ taglib tagdir="自定义标记库的位置" prefix="前缀" %>