欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

自定义标签的使用(总结)

程序员文章站 2022-06-08 14:01:09
...

引入jstl.jar、standard.jar

一、最简单的自定义标签()

1、编写继承SimpleTagSupport

public class MyTag extends SimpleTagSupport {

    @Override
    public void doTag() throws JspException, IOException {
        getJspContext().getOut().write("hello walker");
    }
}

2、表现tld文件,放在WEB-INF下

<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
    version="2.0">
    <description>A tag library exercising SimpleTag handlers.</description>
    <tlib-version>1.0</tlib-version>
    <short-name>SimpleTagLibrary</short-name>
    <uri>mytid</uri>

    <tag>
        <description>Outputs a colored tile</description>
        <name>hello</name>
        <tag-class>Test.MyTag</tag-class>
        <body-content>empty</body-content>
    </tag>

</taglib>

注:属性说明

  • description //描述信息
  • tlib-version //指定标签库的版本号,基本不用我们操心
  • short-name //指定标签库的短名字,也是没什么用
  • uri //这是一个重要的子元素,是该标签库的唯一标识
  • tag //看名字就知道,这是定义标签的子元素,很重要 

   tag标签的属性说明

  • description //描述信息
  • name //该标签的唯一标识,很重要
  • tag-class //指定了处理该标签的类,也就是使用该标签谁给我返回结果
  • body-content //标签体,后面详说,很重要
  • attribute //属性,后面介绍,很重要

3、调用

<%@taglib uri="mytid" prefix="SimpleTagLibrary" %>  

<mytags:hello />

 

二、带属性的自定义标签

  1、自定义标签类的编写

public class MyTag extends SimpleTagSupport {

    private String map;
    public String getMap(){
        return this.map;
    }
    public void setMap(String map){
        this.map = map;
    }
    @Override
    public void doTag() throws JspException, IOException {
        HashMap<String,Integer> maps = (HashMap<String,Integer>)(getJspContext().getAttribute(map));
        Object[] array = maps.keySet().toArray();

        for (String str : maps.keySet()){
            getJspContext().getOut().write("<tr>");
            getJspContext().getOut().write("<td>");
            getJspContext().getOut().write(str);
            getJspContext().getOut().write("</td>");
            getJspContext().getOut().write("<td>");
            getJspContext().getOut().write(""+maps.get(str));
            getJspContext().getOut().write("</td>");
            getJspContext().getOut().write("</tr>");
        }
    }
}

2、tld

 

<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
    version="2.0">
    <description>A tag library exercising SimpleTag handlers.</description>
    <tlib-version>1.0</tlib-version>
    <short-name>SimpleTagLibrary</short-name>
    <uri>mytid</uri>

    <tag>
        <description>Outputs a colored tile</description>
        <name>hello</name>
        <tag-class>Test.MyTag</tag-class>
        <body-content>empty</body-content>
        <attribute>
            <name>map</name>
            <required>true</required>
            <fragment>true</fragment>
        </attribute>
    </tag>

</taglib>

注:

required:该属性是否必须

rtexprvalue:当前属性是否可接受运行时表达式的动态值

3、使用

<%
    HashMap<String,Integer> maps = new HashMap<String, Integer>();
    maps.put("李四",53);
    maps.put("张三",23);
    maps.put("walker",22);
    pageContext.setAttribute("map",maps);
  %>
      <table>
        <mytag:hello map="map"/>
      </table>

 

三、带标签体自定标签

 1、自定义标签类

/**
 * 带标签体的标签
 * @author Administrator
 *
 */
public class IteratorTag extends SimpleTagSupport{
    //标签属性,省去getter,setter
    private String collection;
    private String item;

    @Override
    public void doTag() throws JspException, IOException {
        //从page scope中获取属性名为collection的集合
        Collection itemList=(Collection) getJspContext().getAttribute(collection);
        //遍历集合
        for (Object object : itemList) {
            //将集合的元素设置到page范围
            getJspContext().setAttribute(item,object);
            //输出标签体
            getJspBody().invoke(null);
        }
    }
}

2、tld

<description>A tag library exercising SimpleTag handlers.</description>
    <tlib-version>1.0</tlib-version>
    <short-name>myTaglib</short-name>
    <uri>http://www.chinaebi.org/myTaglib</uri>
    <tag>
        <name>iterator</name>
        <tag-class>com.chinaebi.test.IteratorTag</tag-class>
        <body-content>scriptless</body-content>
        <attribute>
            <name>collection</name>
            <required>true</required>
            <fragment>true</fragment>
        </attribute>
        <attribute>
            <name>item</name>
            <required>true</required>
            <fragment>true</fragment>
        </attribute>
    </tag>

注:body-content说明

  • tagdependent:指定标签处理类自己负责处理标签体。
  • empty:指定该标签只能作用空标签使用。
  • scriptless:指定该标签的标签体可以是静态 HTML 元素,表达式语言,但不允许出现 JSP 脚本。
  • JSP:指定该标签的标签体可以使用 JSP 脚本。

3、使用

<%
    List list= new ArrayList();
    list.add("java");
    list.add("c++");
    list.add("php");
    pageContext.setAttribute("list",list);
    %>
    <table border="1" cellpadding="0" cellspacing="0">
    <myTag:iterator item="item" collection="list">
        <tr>
            <td>${item}</td>
        </tr>
    </myTag:iterator>
    </table>