JSP/Servlet: 简介 Tag File

可以来设计一个简单的Tag File,Tag File通常是存放在WEB-INF/tags/目录下,下面是设计的简单Tag File:

hello.tag
<table border="1"> 
<tr><td>Hello! World!</td></tr> 
</table> 

假设Tag File取名为hello.tag,*.tag是Tag File建议的扩展名,也可以是*.tagx,Tag File也可以包括其它的Tag File,如果是这样的情况,建议可以用*.tagf作为扩展名。

Tag File中目前只有静态的内容,事实上您可以在当中使用合法的JSP语法来撰写,像是Scriptlet、EL、指令元素或动作元素等等,可以撰写以下的JSP网页来使用自订的Tag File:

test.jsp
<%@taglib prefix="caterpillar" tagdir="/WEB-INF/tags" %> 
<html> 
<body> 
<caterpillar:hello/> 
</body> 
</html> 

执行这个JSP网页,将会传回以下的内容:

<html> 
<body> 
<table border="1"> 
<tr><td>Hello! World!</td></tr> 
</table> 
</body> 
</html> 
Tag File实际上会转译为 Simple Tag,以Tomcat为例的 话,您可以在work\Catalina\localhost\myjsp\org\apache\jsp\tag\web

下找到转译之后的*.java与*.class档案,名称为hello_tag.java与hello_tag.class,是继承 SimpleTagSupport的类别。

在Tag File中可以使用out、config、request、response、session、application、jspContext等隐含物 件,前六个的使用与JSP网页中所使用的隐含对象是相同的,jspContext在转译之后,实际上则是JspContext对象。

在Tag File中可以使用<jsp:invoke>与<jsp:doBody>两个标签,前者可以用来处理Fragment,后者可以用来决定要不要处理卷标间的本体文字,这在下一个主题再介绍。

在Tag File中可以使用的指令元素有taglib、include、tag、attribute、variable五个,前两者的使用方式与在JSP网页中是 相同的,tag指令则类似于JSP网页中的page指令,用于指定与Tag File相关的属性(像是pageEncoding、body-content等),attribute用以指定卷标的属性,而variable用于设定 Tag File的Scripting Variable,以传回JSP网页中使用,后三者在下一个主题再介绍。


JSP/Servlet: <jsp: doBody>、<jsp:invoke>与指令元素

在Tag File中可以使用<jsp:doBody>与<jsp:invoke>动作元素,前者是用来处理卷标本体文字,后者则是用来设 定标签间的Fragment,这两个动作元素搭配着attribute与variable两个指令元素来作示范会比较好说明。

首先介绍<jsp:doBody>您可以用它来决定是否显示本体文字,例如撰写如下的Tag File:

check.tag

<%@attribute name="password"%>
<% if(password.equals("1234")) { %> 
<jsp:doBody/> 
<% } else { %> 
密码不正确 
<% } %> 

必须先说明的是,这边使用了Scriptlet,这并不是一个良好的示范,若能搭配JSTL或自订标签库来完成Tag File的撰写会是比较好的,这边纯綷是为了说明方便才使用了Scriptlet。
上面这个Tag File会检查传入的属性password是否符合我们设定的密码,如果符合就执行<jsp:doBody>,表示显示卷标之间的本体文字, 否则显示密码不正确的讯息,attribute指令元素可以指定自订卷标所使用的属性文字,可以使用下面的JSP网页来测试:

test.jsp
<%@taglib prefix="caterpillar" tagdir="/WEB-INF/tags/" %> 
<html> 
<body> 
<caterpillar:check password="${ param.pwd }"> 
您的秘密礼物在此! 
</caterpillar:check> 
</body> 
</html> 

您可以发现,Tag File即使是用来当作自订标签库的简便方式,也是十分的方便,不需要在tld档中作额外的设定,也可以得到相关的功能。
attribute除了指定属性文字之外,也可以将属性当作Fragment传入,方便在Tag File中作个别的处理,例如下面撰写一个table.tag:

table.tag
<%@attribute name="frag1" fragment="true"%> 
<%@attribute name="frag2" fragment="true"%>
<table border="1"> 
<tr> 
<td><b>frag1</b></td> 
<td><jsp:invoke fragment="frag1"/></td> 
</tr> 
<tr> 
<td><b>frag2</b></td> 
<td><jsp:invoke fragment="frag2"/></td> 
</tr> 
</table> 

在这个Tag File中,将attribute的属性设定为Fragment,然后想取得指定的Fragment的话,就可以使用<jsp: invoke>动作元素,并指定Fragment的名称,使用下面这个JSP网页来测试:

test.jsp
<%@taglib prefix="caterpillar" tagdir="/WEB-INF/tags/" %> 
<html> 
<body> 
<caterpillar:table> 
<jsp:attribute name="frag1"> 
Fragment 1 here 
</jsp:attribute> 
<jsp:attribute name="frag2"> 
Fragment 2 here 
</jsp:attribute> 
</caterpillar:table> 
</body> 
</html> 

在JSP网页中,同样的是使用<jsp:attribute>来说定Fragment的文字内容,执行这个JSP网页,会传回以下的内容:

<html> 
<body>
<table border="1"> 
<tr> 
<td><b>frag1</b></td> 
<td>Fragment 1 here</td> 
</tr> 
<tr> 
<td><b>frag2</b></td> 
<td>Fragment 2 here</td> 
</tr> 
</table> 
</body> 
</html> 

在Tag File与JSP网页之间,可以使用variable指令元素设定Scripting Variable,以在两者之间传递变量内容,例如撰写以下的Tag File:

precode.tag
<%@attribute name="preserve" fragment="true" %> 
<%@variable name-given="code" scope="NESTED" %>
<jsp:doBody var="code" />
<table border="1"> 
<tr> 
<td> 
<pre><jsp:invoke fragment="preserve"/></pre> 
</td> 
</tr> 
</table> 

在这个Tag File中,使用variable设定Scripting Variable为"code",作用范围为"NESTED",也就是在起始卷标与结束卷标之间,而其中<jsp:doBody>中多了一项 属性var,表示在JSP网页中的<jsp:body>卷标中的文字内容将设定给"code"变量,可以用下面这个JSP网页来测试:

test.jsp
<%@ taglib prefix="caterpillar" tagdir="/WEB-INF/tags" %> 
<html> 
<body> 
<caterpillar:precode> 
<jsp:attribute name="preserve"> 
<b>${ code }</b> 
</jsp:attribute>
<jsp:body> 
PROGRAM MAIN 
PRINT 'HELLO' 
END 
</jsp:body> 
</caterpillar:precode> 
</body> 
</html> 

<jsp:body>之间的虚拟程序代码将会传入给"code"变量,由于它是Scripting Variable,可以在标签之内起作用,所以在<jsp:attribute>中的EL式${code}可以取得Tag File中"code"的内容,也就是<jsp:body>传入的文字,之后我们将<jsp:attribute>的内容当作 Fragment在Tag File中作处理,结果将会如以下的网页:

<html> 
<body> 
<table border="1"> 
<tr> 
<td> 
<pre><b> 
PROGRAM MAIN 
PRINT 'HELLO' 
END 
</b></pre> 
</td> 
</tr> 
</table> 
</body> 
</html>
  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值