在 JSP 中创建自定义标签
原文:https://www.studytonight.com/jsp/creating-a-custom-tag.php
要创建自定义标签,需要以下组件:
- 应该扩展
SimpleTagSupport
的标签处理程序类。 - 标签库描述符(TLD) 文件
- 在 JSP 文件中使用自定义标签
标签处理程序类
您可以通过两种不同的方式创建标记处理程序类:
- 通过实现三个接口之一:
SimpleTag
、Tag
或BodyTag
,它们定义了在标签的生命周期中调用的方法。 - 通过扩展实现
SimpleTag
、Tag
或BodyTag
接口的抽象基类。简单标签支持、标签支持和身体标签支持类实现简单标签、标签和标签接口。扩展这些类使标记处理程序类不必实现接口中的所有方法,并且还提供了其他方便的功能。
标签库描述符
标签库描述符是一个 XML 文档,它包含关于整个库以及库中包含的每个标签的信息。网络容器和 JSP 页面开发工具都使用顶级域名来验证标签。
标签库描述符文件必须具有扩展名.tld
,并且必须打包在 WAR 文件的 /WEB-INF/ 目录或子目录中,或者打包在 JAR 中的标签库的 /META-INF/ 目录或子目录中。
自定义标签示例
在我们的例子中,我们将创建一个扩展标签支持类的标签处理程序类。当我们扩展这个类时,我们必须覆盖方法doStartTag()
。这个类还有另外两个方法,即doEndTag()
和release()
,我们可以根据自己的需求决定是否覆盖。
CountMatches.java
package com.studytonight.taghandler;
import java.io.IOException;
import javax.servlet.jsp.*;
import org.apache.commons.lang.StringUtils;
public class **CountMatches** extends **TagSupport** {
private String **inputstring**;
private String **lookupstring**;
public String **getInputstring**() {
return inputstring;
}
public void **setInputstring**(String *inputstring*) {
this.inputstring = inputstring;
}
public String **getLookupstring**() {
return lookupstring;
}
public void **setLookupstring**(String *lookupstring*) {
this.lookupstring = lookupstring;
}
@Override
public int **doStartTag**() throws JspException {
try {
JspWriter out = pageContext.getOut();
out.println(StringUtils.countMatches(inputstring, lookupstring));
}
catch (IOException e) {
e.printStackTrace();
}
return SKIP_BODY;
}
}
在上面的代码中,我们有一个doStartTag()
方法的实现,如果我们要扩展标记支持类,这是必须的。我们已经声明了两个变量inputstring
和lookupstring
。这些变量表示自定义标签的属性。我们必须为这些变量提供 getter 和 setter,以便将值设置到这些变量中,这些变量将在使用这个自定义标记时提供。我们还可以指定这些属性是否是必需的。
计数匹配作家. tld
<?xml version="*1.0*" encoding="*UTF-8*"?>
<taglib>
<tlibversion>1.0</tlibversion>
<jspversion>1.1</jspversion>
<shortname>**cntmtchs**</shortname>
<info>Sample taglib for Substr operation</info>
<uri>*http://studytonight.com/jsp/taglib/countmatches*</uri>
<tag>
<name>**countmatches**</name>
<tagclass>**com.studytonight.taghandler.CountMatches**</tagclass>
<info>String Utility</info>
<attribute>
<name>**inputstring**</name>
<required>**true**</required>
</attribute>
<attribute>
<name>**lookupstring**</name>
<required>**true**</required>
</attribute>
</tag>
</taglib>
taglib 元素指定了模式、所需的 JSP 版本以及这个标签库中的标签。TLD 中的每个标签元素代表库中存在的一个单独的自定义标签。这些标记中的每一个都应该有一个与之关联的标记处理程序类。
uri 元素表示唯一标识标签库的统一资源标识符。
标签元素中的两个属性元素表示标签有两个属性,提供给必需元素的真值表示标签正常工作需要这两个属性。
test.jsp
<%@taglib prefix="**mytag**" uri="*/WEB-INF/CountMatchesDescriptor.tld*"%>
<html>
<**mytag:countmatches** inputstring="*Studytonight*" lookupstring="*t*">
</**mytag:countmatches**>
</html>
如果这个标签工作正常,它应该在浏览器中打印一个值3
,因为“今晚学习”这个词中出现了 3 次“不”。