目录
一:Tag文件
1.Tag文件的结构
Tag文件时扩展名为.tag的文本文件,结构于JSP文件相似。
Tag文件中可以包括普通的HTML标记符,一些特殊的指令标记,成员变量声明和方法的定义,Java程序片和Java表达式。
以下为一个简单的Tag文件a.tag,文件扩展名为.tag ,文件内容与JSP文件大致相同。
a.tag
<%@ tag pageEncoding ="utf-8"%>
<p style ="font-family:宋体;font-size:30">
1~100的奇数和:
<%
int sum=0,i=1;
for(i=1;i<=100;i++){
if(i%2==1)
sum+=i;
}
out.println(sum);
%>
</p>
2.Tag文件的保存
a. Tag文件所在目录
Tag文件可以实现代码的复用,为了能让一个JSP页面使用某一个Tag文件,必须将这个Tag文件放到Tomcat服务器指定的目录中。
建立目录格式为:
Web服务目录\WEB-INF\tags
例如ch3\WEB-INF\tags
WEB-INF和tags都是固定的目录名称,但tags下的子目录可以由用户给定,也可以直接保存再tags下
b.Tag文件的编码
保存Tag文件必须按照Tag文件指定的编码保存。
例如:
方法1:在Tag文件中使用tag指令
<%@ tag pageEncoding ="utf-8" %>
方法2:在保存该Tag文件时,将保存类型修改为 UTF-8。
二:Tag标记:
1.Tag标记 与 Tag文件
jsp页面必须通过Tag标记来调用一个Tag文件,tag标记的名字和Tag文件的名字一致,也就是说当我们写了一个tag文件放到特定的目录中,也就给出了一个tag标记
<Tag文件的名字/>
或
<Tag文件的名字>其他内容</Tag文件的名字>
一个Tag文件对应一个Tag标记,把全体Tag标记称为一个自定义标记库或简称为标记库
2.Tag标记的使用
一个jsp页面通过使用tag标记来调用一个Tag文件。Web服务目录下的一个jsp页面使用tag标记调用文件之前,必须首先使用taglib指令标记引入该web服务目录下的标记库,只有这样jsp才能调用相应的tag文件
taglib指令的格式如下:
<%@ taglib tagdir ="标记库的位置"prefix="前缀">
taglib指令中的prefix给出的前缀由用户自定义,其好处是,通过前缀可以有效区分不同标记库中具有相同名字的标记文件。
<%@ page contentType="text/html"%>
<%@ page pageEncoding="utf-8"%>
<%@ taglib tagdir="/WEB-INF/tags"prefix="computer"%>
<HTML><body bgcolor=cyan>
<h1>调用Tag文件计算100内奇数和:</h1>
<computer:a/> //使用Tag标记
</body></HTML>
3.Tag标记的运行原理:
1.如果该Tag标记对应的tag文件是首件被jsp调用,那么tomcat服务器会将tag文件转译成一个java文件,并编译这个java文件生成字节码文件,然后执行这个字节码文件
2.如果该tag文件已经被编译成字节码文件,tomcat服务器将直接执行这个字节码文件
3.如果对tag文件进行了修改,那么tomcat服务器将会重新将tag文件转译成一个java文件,并编译这个java文件生成字节码文件,然后执行这个字节码文件
三:Tag文件的常用指令:
Tag文件中经常使用的指令有tag、taglib、include、attribute、variable。
1.tag指令:
Tag文件通过使用tag指令可以指定某些属性的值。tag指令的语法如下:
//使用一条tag指令为属性指定需要的值
<%@ tag 属性1="属性值"属性2="属性值"...属性n="属性值"%>
//也可以使用多个tag指令为属性指定需要的值:
<%@ tag 属性1="属性值"%>
<%@ tag 属性2="属性值"%>
...
<%@ tag 属性n="属性值"%>
a.language属性:
languae属性的值指定Tag文件使用的脚本语言,默认值为Java,目前也只能取值Java。
b.import属性:
import属性的作用是为Tag文件引入包中的类,import属性可以取多个值。
c.pageEncoding属性:
该属性指定Tag文件的字符编码,默认值为ISO-8859-1。目前,为避免显示信息乱码现象,Tag文件需要将该属性值设置为UTF-8。
2.include指令:
在tag文件中也有和jsp文件类似的include指令标记,和jsp文件中的include指令标记类似。
3.attribute指令:
在Tag文件中通过使用attribute指令让使用它的JSP页面向该Tag文件传递需要的数据。
attribute指令的格式如下:
<%@ attribute name="对象名字"required="true"("false") type="对象的类型"%>
例如:
<%@ attribute name="result" required="true" type="java.lang.Double"%>
//需要注意的是:这里type属性的值必须使用包名,不能简写为Double
attribute指令中的name属性是必须的,该属性的值是一个对象的名字。
JSP页面在调用Tag文件时,可向name属性指定的对象传递一个引用。
如果attribute指令中没有使用type指定对象的类型,那么对象的类型默认为java.lang.String类型
JSP页面使用Tag标记向所调用的Tag文件中name指定的对象传递一个引用,方式如下:
<前缀:Tag文件名字 对象名字="对象的引用"/>
注:在Tag文件中不可以再定义和attribute指令中的name属性给出的对象具有相同名字的变量,否则将隐藏attribute指令中给出的对象,并使其失效
4.variable指令:
Tag文件通过使用variable指令可以将Tag文件中的对象返回给调用该Tag文件的JSP页面
a.variable指令的格式:
<%@ variable name-given="对象名"variable-class="对象类型"scope="有效范围"%>
其中的name-given的值就是Tag文件返回给JSP页面的对象,该对象名须符合标识符规定。
variable-class的值是返回的对象的类型,对象的类型必须带有包名
如果没有使用variable给出对象的类型,那么对象的类型默认为java.lang.String类型
b.对象的返回:
Tag文件为了给JSP页面返回一个对象,必须将返回的对象的名字以及该对象的引用储存到Tomcat服务器提供的内置对象jspContext中,只有存入其中,JSP页面才可以使用该对象。
5.taglib指令:
JSP页面或Tag文件都可以使用taglib指令引入标记库,taglib指令格式如下:
<%@ taglib tagdir="自定义标记库的位置"prefix="前缀"%>
最后看一个Tag文件的例子:
triangle.tag 保存在ch3\WEB-INF\tags目录中。
calculator.jsp
<%@ page contentType="text/html"%>
<%@ page pageEncoding="utf-8"%>
<%@ taglib tagdir="/ch3/WEB-INF/tags"prefix="getArea"%> //这里的prefix前缀是自己取名的
<HTML><body bgcolor=yellow>
<getArea:triangle sideA="3"sideB="4"sideC="5"/>
</body></HTML>
<%@ 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 "三角形面积:"+result;
}
else{
return "该三边无法构成一个三角形";
}
}
%>
<%
double a=Double.parseDouble(sideA);
double b=Double.parseDouble(sideB);
double d=Double.parseDouble(sideC);
out.println(getArea(a,b,c));
%>