引入原因
多个JSP页面的共用信息可以放在一个单独JSP文件中,然后用Include指令或动作载入,实现代码复用。缺点是用户可以直接访问这些JSP文件(我们可能不希望用户访问),且include载入的文件可以放在任意目录中,目录显得杂乱不利维护。
解决方法:引入Tag文件。它是一种特殊的文本文件,扩展名为.tag,和JSP文件很类似,可以被JSP页面动态加载调用,但是用户不能通过该Tag文件所在Web服务目录直接访问这个Tag文件。
优点:将数据处理的代码放在Tag文件中,JSP页面只负责显示,实现数据处理和显示分离。
Tag文件使用
首先在project的web-inf目录下创建tags子目录,所有tag文件必须保存在该目录下。然后右键tags文件夹—-new—-other—-web—-JSP tag创建tag文件。
tag文件使用示例:
Show.tag
body>P>int size=1; for(int i=1;i<=3;i++){ size=size+1;%> jsp:doBody />P>body>1
2
3
4
5
6
7
8
examlpe3-2.jsp
'text/html; charset=gb2312' %>'look' tagdir='/WEB-INF/tags' %>HTML>调用标记 --%> look:Show> 我是一只小鸭子 look:Show> look:Show> 咿呀咿呀哟 look:Show> HTML>1
2
3
4
5
6
7
8
9
10
11
12
说明:Tag文件名Show对应着一个标记;Tags目录下所有文件集合称自定义标记库或标记库。
工作原理:JSP 引擎把Tag文件转换成Java文件,并编译成class文件供JSP程序动态调用。标记体传给Tag文件, Tag文件使用接受标记体信息。
Tag文件中的常用指令
Tag指令
Tag文件中的tag指令类似于JSP文件中的page指令。Tag文件通过使用tag指令可以指定某些属性的值,以便从总体上影响Tag文件的处理和表示。tag指令的语法如下:
在一个Tag文件中可以使用多个tag指令:
……
tag指令可以操作的属性有:body-content、language、import、pageEncoding。
Tag指令:body-content属性
属性值有:empty、tagdependent、scriptless,默认值是scriptless。
Empty:JSP页面必须使用没有标记体的Tag标记
Tag指令:language属性
指定Tag文件使用的脚本语言,目前只能取值java,其默认值就是java。
Tag指令:import属性
为Tag文件引入Java核心包中的类。import属性可以取多个值。
import属性已经有如下值:
“java.lang.*”
“javax.servlet.*”
“javax.servlet.jsp.*”
“javax.servlet.http.*”
Tag指令:pageEncoding属性
指定Tag文件的字符编码,其默认值是ISO-8859-1。
include指令
使用方法和作用与JSP文件中的include指令标记类似。
include指令标记的作用是在Tag文件中出现该指令的位置处,静态插入一个文件。其语法格式如下:
attribute指令
在Tag文件中通过使用attribute指令,可以让使用它的JSP页面向该Tag文件传递需要的数据,增强Tag文件功能。指令的格式如下:
name属性是必需的,JSP页面向它传递一个引用。比如,一个Tag文件MyTag.tag中有如下attribute指令:
那么JSP页面就可以如下使用Tag标记(假设标记的前缀为computer)调用MyTag.tag:
或
我向Tag文件中传递的值是1000
required属性可选。缺省值是false。若设为true,则JSP页面必须向Tag文件的attribute属性传递一个引用,否则出错。
type属性指定对象的类型。如type=“Java.util.Date”,如果缺省,则类型是java.lang.String。
variable指令
Tag文件通过使用variable指令可以将Tag文件中的对象返回给调用该Tag文件的JSP页面。
variable指令的格式:
例:
name-given属性是必需的。
variable-class可以是java.lang.String(缺省值)等类型。
scope属性表示在JSP页面中何时何地可以使用返回的对象。各属性值如下:
AT_BEGIN: 一旦开始使用Tag标记,就可以在任何地方用对象;
NESTED:只可以在标记体中使用对象;
AT_END:只可以在标记结束后才可以使用对象;
对象的返回
以下的variable指令:
为JSP页面返回名字是time的Date对象
Tag文件只有将对象信息存储到jspContext中,JSP页面才可以使用该对象。jspContext调用setAttribute(“对象的名字”,对象的引用)方法存储对象的名字以及该对象的引用。比如:jspContext.setAttribute(“time”,new Date());将名字是time的Date对象存储到jspContext中。
代码示例:
GiveDate.tag
@ tag import='java.util.*' %>@ variable name-given='time' variable-class='java.util.Date' scope='AT_END' %> jspContext.setAttribute('time',new Date()); %>@ tag language='java' pageEncoding='US-ASCII'%>1
2
3
4
5
6
lookTime.jsp
'text/html;charset=gb2312' %>'java.text.*' %>'/WEB-INF/tags' prefix='showTime'%>HTML>BODY> showTime:GiveDate />
当前时间: %--使用返回的time对象 --%>/BODY>HTML>1
2
3
4
5
6
7
8
taglib指令
一个Tag文件可以使用Tag标记来调用其它的Tag文件。Tag文件也必须使用指令引入该Web服务目录下的标记库,才可以使用Tag标记来调用相应的Tag文件。指令的格式如下:
一个Tag文件也可以使用几个指令标记引入若干个标记库,例如:
。