目录
3.1 Tag文件的结构
3.1.1 Tag文件的结构
所谓Tag文件就是该文件的扩展名为.tag的文本文件。一个基本的Tag文件中包括:HTML标记符、某些特殊的标记指令、成员变量声明和方法的定义、JAVA程序片和JAVA表达式。
创建一个负责计算100以内所有奇数代数和的Tag文件:
<%@tag pageEncoding="GB2312" %>
<p>这是一个Tag文件,负责计算1~100内的奇数之和</p>
<%
int sum=0,
i=1;
for (i=1;i<=100;i++)
{
if(i%2==1){
sum=sum+i;
}
}
out.println(sum);
%>
3.1.2 Tag文件的保存
(1)Tag文件所在目录
Tag文件可以实现代码的复用,也就是说Tag文件可以被许多JSP页面使用。所以需要将Tag文件放到Tomcat服务器指定的目录中,即如果某个Web服务目录下的JSP页面准备调用一个Tag文件,那么必须在该Web服务目录下,建立如下的目录结构:
Web服务目录\WEB-INF\tags
例如:
ch3\WEB-INF\tags
注:WEB-INF和tags都是固定的目录名称,而tags下的子目录的名称可由用户给定。
一个Tag文件必须保存到tags目录或其下的子目录中。例如上图中的tag文件被保存在:
ch3\WEB-INF\tags
(2)Tag文件的编码
保存Tag文件时按照Tag文件指定的编码保存,例如Tag文件使用tag指令:
<%@page pageEncoding = "utf-8"%>
指定的编码是UTF-8,因此需要按照UTF-8编码保存Tag文件。
3.2 Tag标记
3.2.1 Tag标记与Tag文件
某个Web服务目录下的Tag文件只能由该Web服务目录中的JSP页面调用,JSP页面必须通过Tag标记来调用一个Tag文件。
Tag标记的名字和Tag文件的名字一致,即当我们编写了一个Tag文件并保存到特定目录后,也就给出了一个Tag标记,该标记格式为:
<Tag - - 文件的名字 - - />
或
<Tag - - 文件的名字 - - > 内容 </Tag 文件的名字>
一个Tag文件对应着一个Tag标记,把全体Tag标记称之为一个自定义标记库或简称为标记库。
3.2.2 Tag标记的使用
一个JSP页面通过使用Tag标记来调用一个Tag文件。Web服务目录下的一个JSP页面在使用Tag标记来调用一个Tag文件之前,必须首先使用taglib指令标记引入该Web服务目录下的标记库,只有这样JSP页面才可以使用Tag标记调用相应的Tag文件。
taglib指令的格式如下:
<%@ taglib tagdir = "标记库的位置" prefix = “前缀”%>
例如:
<%@ taglib tagdir = "/WEB-INF/tags" prefix = “computer” %>
引入标记库后,JSP页面就可以使用带前缀的Tag标记调用相应的Tag文件,其中的前缀由<taglib>指令中的prefix属性指定。例如JSP使用如下Tag标记调用相应的Tag文件:
<computer:oddNumberSum/>
注:JSP页面使用Tag标记时,冒号:的左右不要有空格。
例:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib tagdir ="/WEB-INF/tags/lib1" prefix="computer"%>
<html>
<body>
<h1>调用Tag文件计算100內的奇数和:</h1>
<computer:addSum /> <%-- 使用Tag标记 --%>
</body>
</html>
输出结果:
3.2.3 Tag标记的运行原理
- 如果该Tag标记对应的Tag文件是首次被JSP页面调用,那么Tomcat服务器会将Tag文件转译成一个Java文件,并编译这个Java文件生成字节码文件,然后执行这个字节码文件。
- 如果该Tag文件已经被转编译为字节码文件,Tomcat服务器将直接执行这个字节码文件。
- 如果对Tag文件进行了修改,那么Tomcat服务器会重新将Tag文件转译成一个Java文件,并编译这个Java文件生成字节码文件,然后执行这个字节码文件。
3.3 Tag文件中的常用指令
与JSP文件类似,Tag文件中也有一些常用指令,这些指令将影响Tag文件的行为。Tag文件中经常使用的指令有tag、taglib、include、attribute、variable。
3.3.1 Tag标记
编写了一个Tag文件会对应生成一个Tag标记,Tag标记的格式为:
<Tag 文件名字/>
或
<Tag 文件名字>
标记体
</Tag 文件名字>
当JSP页面希望向Tag文件传递相应的信息时,可以使用标记体来传递,在Tag文件中通过<jsp:doBody/>来调用标记体。
一个Tag文件对应一个Tag标记,那么该目录下有若干个Tag文件就行成了一个库,在JSP页面要调用Tag文件,就要通过taglib指令来引入相应目录下的一个标记库,只有这样JSP页面才能调用相应的Tag文件并动态执行该Tag文件。
<%@taglib prefix="前缀" tagdir="自定义标记库的位置"%>
注意:使用前缀可以区别不同标记库下相同名字的标记文件。
如:调用/WEB-INF/tags/math/random.tag文件就可以在JSP页面中这样写:
<%@taglib prefix="math" tagdir="/WEB-INF/tags/math/"%>来引入标记库
之后可以<math:random/>或者<math:random>标记体</math:random>来调用了并执行相应tag文件。
3.3.2 include指令
在Tag文件中也有和JSP文件类似的include指令标记,其使用方法和作用与JSP文件中的include指令标记类似。
3.3.3 attribute指令
Tag文件充当着代码复用的角色,如果能像include动作一样向Tag文件传递数据,这会让Tag文件的功能更加强大,这当然是可以的,在Tag文件中有attribute指令,其语法格式如下:
<%attribute name="对象名字" required="true"|"false" type="对象的类型"%>
attribute指令中name属性是必须的,该属性是引用一个对象的名字.required为true时必须给其传值,为false时可以传可以不传,type为该对象的类型,默认为java.lang.String类型,可以改为其他类型,但要注意的是,必须对象类型必须带有包名,如不能简写为type="Integer"必须是type="java.lang.Integer"
注:在Tag文件中不可以再定义和attribute指令中name属性指定的对象具有相同名字的变量,否则将隐藏attribute指令中的对象,使其失效(可以通过观察源码发现,attribute中的变量其实在Tag文件中一个成员变量)
下面是使用attribute指令的一个例子计算三角形面积的例子:
JSP页面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib tagdir="/WEB-INF/tags/lib3" prefix="getTrangleArea" %>
<html>
<head>
<title>triangle</title>
</head>
<body bgcolor="#6495ed">
<p style="font-family: 宋体;font-size: 36px;color: crimson">
<%--------use tag signal---------%>
<getTrangleArea:triangle sideA="15" sideB="16" sideC="20"/>
</p>
</body>
</html>
Tag页面:
<%@ tag pageEncoding="UTF-8" %>
<%@ attribute name="sideA" required="true" %>
<%@ attribute name="sideB" required="true" %>
<%@ attribute name="sideC" required="true" %>
<%!
public String getArea(double A,double B,double C){
if(A+B>C&&A+C>B&&B+C>A){
double p = (A+B+C)/2.0;
double area = Math.sqrt(p*(p-A)*(p-B)*(p-C));
String result = String.format("%.2f",area);
return "<br>trangle area:"+result;
}
else{
return "error";
}
}
%>
<%
out.println("<br> sides:"+sideA+"-"+sideB+"-"+sideC);
double a = Double.parseDouble(sideA);
double b = Double.parseDouble(sideB);
double c = Double.parseDouble(sideC);
out.println(getArea(a,b,c));
%>
输出结果:
3.3.4 variable指令
Tag文件通过使用attribute指令JSP页面可以向Tag文件传递数据.在某些Web设计中,不仅需要向其传递数据,还需要他返回某些数据进行特殊处理.比如多个JSP页面需要Tag文件处理一些数据,但是不需要显示,因为每个JSP页面需要特殊的显示,这时候就可以使用variable指令,variable指令语法格式如下:
<%variable name-given="对象名字" variable-class="对象类型" scope="有效范围"%>
name-given:用来指定对象的名字,要符合命名规则
variable-class:指定的类型,注意需要打全包名,不能进行简写
scope中有三个属性值:
AT_BEGIN,在使用JSP页面标记的时候就可以使用该对象
NESTED,只能在标记体中使用该对象
AT_END,只能在标记体结束后使用该对象
Tag通过jspContext.setAttribute("对象的名字",对象的引用);把对象名字和对象引用存储到内置对象 jspContext中,JSP页面才能使用该对象。
3.3.5 Taglib指令标记
taglib指令格式如下:
<%@ taglib tagdir = "自定义标记库的位置" prefix = "前缀"%>
一个Tag文件也可以使用多个taglib指令标记引入若干个标记库,例如:
<%@ taglib tagdir = "自定义标记库的位置1" prefix = "自定义前缀1"%>
<%@ taglib tagdir = "自定义标记库的位置2" prefix = "自定义前缀2"%>
总结:
以上为Tag指令标记的用法介绍。