在 JSP 中创建自定义标签

原文:https://www.studytonight.com/jsp/creating-a-custom-tag.php

要创建自定义标签,需要以下组件:

  1. 应该扩展SimpleTagSupport标签处理程序类。
  2. 标签库描述符(TLD) 文件
  3. 在 JSP 文件中使用自定义标签

标签处理程序类

您可以通过两种不同的方式创建标记处理程序类:

  1. 通过实现三个接口之一:SimpleTagTagBodyTag,它们定义了在标签的生命周期中调用的方法。
  2. 通过扩展实现SimpleTagTagBodyTag接口的抽象基类。简单标签支持标签支持身体标签支持类实现简单标签、标签和标签接口。扩展这些类使标记处理程序类不必实现接口中的所有方法,并且还提供了其他方便的功能。

标签库描述符

标签库描述符是一个 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()方法的实现,如果我们要扩展标记支持类,这是必须的。我们已经声明了两个变量inputstringlookupstring。这些变量表示自定义标签的属性。我们必须为这些变量提供 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 次“不”。