与XML文档类似,在JSP页面中标签库(Tag Libraries)技术允许使用自定义的标签。自定义标签在实现上也是一段Java代码,实现了特定的功能,在运行时标签将会被相对应的代码所代替。下面我们就通过在实际开发中遇到的一个例子来简要说明一下实现过程。
在具体的开发中,我们遇到需用select选择框显示,选择框内容要求从数据库读取。实现这个自定义标签,主要应注意以下几个方面:
1. 标签库描述文件(TLD)的编写;
2. 继承自TagSupport标签处理器类;(当然,也可以通过实现Tag接口来完成,本文主要介绍从TagSupport继承的方式)
3. JSP页面内使用标签的地方;
标签库描述文件主要是用来存储标签的相关配置信息,所有的属性之类的信息都在这个文件内。我们实现的标签库描述文件文件名为hongao.tld,截取部分内容如下:
<uri>tags-hongao</uri>
<tag>
<name>select</name>
<tagclass>com.hongaoerp.lib.utils.taglibs.SelectTag</tagclass>
<attribute>
<name>dataFrom</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>dataKind</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>selectedValue</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
……省略其他相关属性
</tag>
这里需要说明的地方是,属性的其中2个元素的含义:
1. required: 这个元素的意思是属性在JSP页面内是否是必须有值的,一般是False;
2. rtexprvalue: 这个元素设置属性是否是动态的,如果设成True的话,在JSP页面内可以使用JSP表达式给这个属性赋值,否则的话,只能直接指定值;
继承自TagSupport标签处理器类,所有的功能实现都在这个类内,不需要对父类所有的方法进行重写,只要按照需要重写对应的方法即可,本例中就是重写了doEndTag()方法,截取代码如下:
public class SelectTag extends TagSupport
{
private static final long serialVersionUID = 3408276515071928L;
private String dataSource = null;
private String selectedValue = null;
……省略其他属性
public int doEndTag() throws JspException
{
StringBuffer sb = new StringBuffer();
try
{
sb.append("<select" + addProperty() + ">").append(addExtOption());
……省略其他实现代码
}
}
}
最后我们来看一下JSP调用的地方,截取代码如下:
<h:select dataFrom="1" dataKind="projects" name="project.prjNo" selectedValue="${project.prjNo}" style="width: 156px" ></h:select>
这里要注意的地方,就是刚才在标签库描述文件内设定为必须输入的属性,一定要设置对应的值,否则就会初始化标签失败。
到这里我们就实现了一个基本的自定义标签,有更多的细节可以上网查找相关资料或联系作者讨论,希望对大家有所帮助。 |