目录
3.1 Tag文件
3.1.1Tag文件的结构
Tag文件是扩展名为.Tag的文本文件,其结构与JSP相似,包括普通的HTML标记符、某些特殊的指令标记、成员变量声明和方法的定义、Java程序片和Java表达式。
3.1.2Tag文件的保存
1、Tag文件所在目录
Tag文件可实现代码的复用。如果某Web服务目录下的JSP页面准备调用一个Tag文件,那么必须在Web服务目录下建立以下目录结构;
Web服务目录\WEB-INF\tags
注:WEB-INF(大写)和tags是固定的目录,tags下的子目录可自由给定。
2、Tag文件的编码
保存Tag文件时按照Tag文件指定的编码保存,如:
<%@tag pageEncoding="utf-8"%>
该Tag指令指定编码方式为utf-8,则Tag文件保存时应选择“utf-8”。
3.2 Tag标记
3.2.1 Tag文件和Tag标记
①JSP页面必须通过Tag标记来调用一个Tag文件。
②Tag标记的名字和Tag文件的名字一致。
③一个Tag文件对应一个Tag标记。
Tag标记格式为:
<Tag 文件名字/>
或
<Tag 文件名字>标体内容</Tag 文件名字>
3.2.2 Tag标记的使用
某Web服务目录下的一个JSP页面在使用Tag标记调用一个Tag文件之前必须首先使用taglib指令标记引入该Web服务目录下的标记库。
taglib指令的格式为:
<%@taglib tagdir="标记库的位置"prefix=“前缀”> //引入标记库
引入标记库后,JSP页面可使用带前缀的Tag标记调用相应的Tag文件,格式:
<"前缀":Tag去掉扩展名后的文件名/>
如:<computer:oddNumberSum/>调用文件名为oddNuberSum.tag的Tag文件。
注:“:”旁边不能有空格
3.2.3 Tag标记的运行原理
如果该Tag标记对应的Tag文件是首次被JSP页面调用,那么Tomcat服务器会将Tag文件转译成一个Java文件,并编译这个Java文件生成字节码文件,然后执行这个字节码文件(这和执行JSP页面的原理类似)。
如果该Tag文件已经被转编译为字节码文件,Tomcat服务器将直接执行这个字节码文件。
如果对Tag文件进行了修改,那么Tomcat服务器会重新将Tag文件转译成一个Java文件,并编译这个Java文件生成字节码文件,然后执行这个字节码文件。
3.3 Tag文件中的常用指令
3.3.1 Tag指令
tag指令语法:
<%@tag 属性1=“属性值” 属性2=“属性值”...%>
或
<%@tag 属性1=“属性值” %>
<%@tag属性2=“属性值”%>
...
<%@tag属性n=“属性值”%>
①language属性
作用:指定脚本语言
目前只能取值java,默认值为java,故无需指定。
②import属性
作用:为Tag文件引入包中的类
可取多值,默认值有:"java.lang.*" "java.servlet.*" "java.servlet.jsp.*" "javax.servlet.http.*"
③pageEncoding属性
作用:指定Tag文件的字符编码
默认值为ISO-8859-1,为了避免信息出现乱码,需要将属性设置为utf-8
3.3.2 include指令
其作用方法与JSP文件中的include指令标记类似(详情见JSP实用教程第二章2.6.2)
3.3.3 attribute指令
格式为:
<%@attribute name="对象名字"required=“true”|“false”type="对象的类型"%>
注:name属性是必需的,type在指定对象是必须使用包名,其默认值为java.lang.String。
作用:让使用该指令的JSP页面向该Tag文件传递需要的数据
name属性:可传递一个引用,方式如下:
<前缀:Tag文件名字 对象名字=“对象的引用”/>
required属性:默认值为false,当为true时,调用该Tag文件的JSP页面必须向该Tag文件中attribute指令中的name属性给出的对象传递一个引用,当为false时,调用该Tag文件的JSP页面必须向该Tag文件中attribute指令中的name属性给出的对象传递或不传递对象的引用,
注:注:在Tag文件中不可以再定义和attribute指令中name属性给出的对象具有相同名字的变量,否则将隐藏attribute指令中给出的对象,使其失败。
3.3.4 variable指令
1、指令格式:
<%@variable name-given="对象名"variable-class=“对象类型”scope=“有效范围”%>
作用:将Tag文件中的对象返回给调用该Tag文件的JSP页面。
属性name-given:是返回给JSP页面的对象,必须标识符规定(即可由字母数字下划线美元符号数字组成,且第一个字符不能为数字)。
属性variable-class:必须带有包名
属性scope:指定对象的有效范围,值可取AT_BEGIN,NESTED,AT_END.
2、对象的返回
Tag文件只有将对象的名字及其引用存储到jspContext中,才能使用该对象。
jspContext.setAttribute("对象名",对象的引用)
注:在JSP页面中不可以再定义与Tag文件返回的对象具有相同名字的变量,否则Tag文件无法将variable 指令给出的对象返回给JSP页面(并将出现编译错误)。如果 Tag 文件同时使用variable 指令和attribute指令,那么variable指令中name-given和attribute 指令中name给出的对象不能相同(否则将出现编译错误)。
3.3.5 taglib指令
JSP页面或Tag文件都可以使用taglib指令引入标记库,可使用多个taglib指令标记引入若干标记库。指令格式为:
<%@taglib tagdir="自定义标记库的位置"prefix=“前缀”>