第一步,做一个类,派生自SimpleTagSupport,“alt+/”选重写doTag()方法。

public class TestTag extends SimpleTagSupport {
    private String outerTagName="p";

    public void setOuterTagName(String outerTagName) {
        this.outerTagName = outerTagName;
    }
    private int count;

    public void setCount(int count) {
        this.count = count;
    }

    @Override
    public void doTag() throws JspException, IOException {
        JspFragment frag = this.getJspBody(); //当前生成的片段
        this.getJspContext().getOut().write("<"+outerTagName+">");//添加的属性
        for(int i=0;i<count;i++){
        frag.invoke(null);//生成输出
        }
        this.getJspContext().getOut().write("</"+outerTagName+">");
    }
}

第二步,配置

在WEB-INF文件夹中新建一个XML.File文件,扩展名更改为tld,选择XML template,完成创建。

taglib为根元素

<taglib xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
    version="2.1">

根元素下面写对整个文件的描述

<description>自定义jstl标签</description> 描述
<display-name>JSTL自定义标签</display-name> 显示的名字
<tlib-version>1.1</tlib-version> 版本
<short-name>c</short-name> 前缀
<uri>http://www.itnba.com/maya/myjstl</uri> 唯一标识

  <description>自定义jstl标签</description> 
  <display-name>JSTL自定义标签</display-name>
  <tlib-version>1.1</tlib-version>
  <short-name>c</short-name>
  <uri>http://www.itnba.com/maya/myjstl</uri>

后面写<tag>标签

<name>catch</name> 引用时:后面就是这个名字
<tag-class>com.itnba.maya.myel.TestTag</tag-class> com.itnba.maya.myel是第一步做的包名 TestTag是类名
<body-content>scriptless</body-content> 不能写脚本,即不能写<%%>
<required>false</required>是否必填,true是自动生成必须填,false可写可不写
<rtexprvalue>false</rtexprvalue>是否可以用el表达式<tag>

<tag>
  <description>
  ...描述
  </description>
  <name>catch</name> 
  <tag-class>com.itnba.maya.myel.TestTag</tag-class>
  <body-content>scriptless</body-content>
    <attribute>
    <description>
    第一条属性
    </description>
    <name>outerTagName</name>
    <required>false</required>
    <rtexprvalue>false</rtexprvalue>
    </attribute>
    

    <attribute>
    <description>
    第二条属性
    </description>
    <name>count</name>
    <required>false</required>
    <rtexprvalue>false</rtexprvalue>
    </attribute>
  </tag>
</taglib>

第三步,现在就可以引用这个JSTL自定义的标签了

先导一下写好的el函数,

prefix是在${}中用的名,uri是第二步配置中的那个唯一标识

<%@ taglib prefix="c" uri="http://www.itnba.com/maya/myjstl" %>

用prefix名:<tag>中<name>,后面就可以把写好的属性加上

<c:catch outerTagName="h3" count="2">
Hello Lee<br>
</c:catch>

这段代码应该显示三号标题,count是循环次数,两次,显示如下图。