前面定义的版权标签,所有版权信息全部固化在标签处理程序之中,这样它仅适用于姓名为“颜志军”的开发者,也就是这个版权标签成为了颜志军的专用标签。显然,如果这个标签能方便设定版权的所有者,那么它将可以被每一个开发者所使用而不再只是颜志军的专用版权标签。正如您所想到的一样,自定义标签提供了传入特定信息的功能,更确切地说,自定义标签通过提供对属性的支持实现了这样的功能。
自定义标签在标记中可以通过属性值向自定义标签处理程序传递信息,形式与其它标记语言并无差别。例如,我们希望版权信息“颜志军版权所有 ©2008”中“颜志军”与“200 8”是可以在JSP文件中使用标签时进行设定的信息,那么就需要在标签中使用两个属性来传递这样的信息。我们假设通过属性copyOwner传递值“颜志军”,通过属性“startYear”传递“2008”,那么此前的JSP文件可以修改如下:
<%@ taglib uri="WEB-INF/tlds/testlib.tld" prefix="yzj" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>自定义标签简单示例</title>
</head>
<body>
<p>这里是正文内容</p>
<yzj:copyright copyOwner="颜志军" startYear="2008"/>
</body>
</html>
当然,如果像上述JSP文件那样来使用我们自定义的版权标签,还必须修改tld文件中的标签说明,具体地说就是需要为标签说明属性copyOwner与startYear。修改完成之后tld文件如下:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
"http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<taglib>
<tlibversion>1.0</tlibversion>
<jspversion>1.1</jspversion>
<shortname>yzj</shortname>
<tag>
<name>copyright</name>
<tagclass>com.yanzhijun.CopyRightTag</tagclass>
<bodycontent>empty</bodycontent>
<attribute>
<name>copyOwner</name>
</attribute>
<attribute>
<name>startYear</name>
</attribute>
</tag>
</taglib>
很容易想到,上述修改不会是全部的工作,决定标签显示信息的自定义标签处理程序也必须做出相应的修改才最终会实现通过标签属性设定部分信息的功能。标签处理程序处理标签属性的方式与JavaBeans是完全一样的,即可以通过为标签处理程序添加名称为“set+属性名”的方法取得标签中相应属性所设定值。
修改之后的标签处理程序如下:
package com.yanzhijun;
import java.io.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
public class CopyRightTag extends TagSupport
{
private String copyOwner;
private String startYear;
public void setCopyOwner(String copyOwner)
{
this.copyOwner = copyOwner;
}
public void setStartYear(String startYear)
{
this.startYear = startYear;
}
public int doEndTag()
{
try
{
String copyPre = new String(copyOwner.getBytes("ISO8859_1"), "GB2312") + "版权所有 ©" + startYear;
String info = new String(copyPre.getBytes("GB2312"), "ISO8859_1");
pageContext.getOut().println(info);
}
catch(IOException e){}
return EVAL_PAGE;
}
}
注意:上述代码中有几处调用了getBytes方法,其目的在于对中文信息进行转码,以便在JSP页面中显示正确的中文字符。
标签中的属性copyOwner在处理程序相应的设定值的方法是setCopyOwner,方法名是set后加上属性名copyOwner,不过根据Java通常的方法名命名规范,属性名copyOwner由于在set后,所以属性名copyOwner的首字母需要更改为大写。
标签的另一个属性startYear的处理形式与属性copyOwner是完全一样的。
重新编译上述Java代码,再次访问JSP页面,可以看到,版权信息依旧被正常显示。但是,不同的是,这里显示的“颜志军”与“2008”是在JSP页面中传入的而不是标签处理程序中固化的。
注意:如果您是在Tomcat运行之后才做上述修改,并且您并未修改Tomcat中关于WEB-INF目录动态载入的配置,那么重新运行JSP文件之前,应重启Tomcat。