zoukankan      html  css  js  c++  java
  • [JSP]自定义标签库taglib

    目录

    自定义标签的步骤

    自定义标签的步骤大概有三步:

    1.继承javax.servlet.jsp.tagext.*下提供的几个标签类,如Tag、TagSupport、BodyTagSupport、SimpleTagSupport(JSP2.0)。

    2.在tld文件中配置标签库信息,以及标签与实现类的映射。

    3.在jsp文件中引用自定义标签。

    标签API

    Tag接口

    doEndTag():执行当前标签实例的结束标签。在doStartTag()执行后调用

    doStartTag():执行当前标签实例的开始标签。

    getParent():获取当前标签的父标签

    release():释放当前标签的状态

    setPageContext(PageContext):设置当前标签的页面

    setParent(Tag):设置当前标签的父标签

    TagSupport类

    TagSupport类是实现Tag接口的一个模板类。它实现了Tag接口的大部分方法,用户只需要实现doStartTag()doEndTag()方法。

    SimpleTag接口(JSP2.0)

    JSP2.0的接口,比Tag接口更简单。

    doTag():执行当前标签的所有处理任务。

    getParent():获取当前标签的父标签。

    setJspBody(JspFragment):提供当前标签的实体为一个JspFragment对象

    setJspContext(JspContext):设置JSP页面的

    setParent(JspTag):设置当前标签的父标签。

    SimpleTagSupport类(JSP2.0)

    SimpleTagSupport类是实现SimpleTag接口的一个模板类。它实现了SimpleTag接口的大部分方法,用户只需要实现doTag()方法。

    tld标签库描述文件

    tld全称为Tag Library Description,即标签库描述文件。

    tld文件用来配置标签库的基本信息。

    taglib主要元素

    taglib.tld

    <?xml version="1.0"encoding="UTF-8" ?>

    <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 web-jsptaglibrary_2_0.xsd"

    version="2.0">

        <tlibversion>1.0</tlibversion>

        <jspversion>2.0</jspversion>

        <shortname>taglib</shortname>

        <uri>http://notes.javaee.jsp.com/taglib</uri>

        <info>Private Taglib</info>

        <tag>

            <name>copyright</name>

            <tagclass>notes.javaee.jsp.taglib.Copyright</tagclass>

            <bodycontent>JSP</bodycontent>

            <info>Copyright tag.</info>

        </tag>

    </taglib>

    l  shortname指明推荐使用的prefix。

    l  uri指明引用这个标签库时使用的uri。

    l  tag指明要定义标签的信息。

    其中,tag可以设置的属性如下:

    属性

    描述

    name

    定义属性的名称。每个标签的是属性名称必须是唯一的。

    tagclass

    指定映射的Java类。

    required

    指定属性是否是必须的或者可选的,如果设置为false为可选。

    rtexprvalue

    声明在运行表达式时,标签属性是否有效。

    type

    定义该属性的Java类类型 。默认指定为String。

    description

    描述信息。

    fragment

    如果声明了该属性,属性值将被视为一个JspFragment。

    bodycontent

    指明标签体的限制,有3种取值:empty、JSP和tagdependent
    empty:不允许有标签体存在。
    JSP:允许有标签体存在。
    tagdependent:允许有标签体存在,但是标签体内的JSP代码不会被执行。

    如果tld文件位于/WEB-INF/下面,Tomcat会自动加载tld文件中的标签库。如果位于其他的位置,可以在web.xml中配置。

    <jsp-config>

        <taglib>

            <taglib-uri>http://notes.javaee.jsp.com/taglib</taglib-uri>

            <taglib-location>/WEB-INF/taglib.tld</taglib-location>

        </taglib>

    </jsp-config>

    或者在JSP中直接使用

    <%@ taglib uri="/WEB-INF/taglib.tld" prefix="taglib"%>

    实例

    使用TagSupport自定义标签

    1. 1.  继承标签API

    定义一个HelloTag类,继承TagSupport类。

    HelloTag.java:

    package notes.javaee.jsp.taglib;

     

    import javax.servlet.jsp.JspException;

    import javax.servlet.jsp.tagext.TagSupport;

     

    public class HelloTag extends TagSupport {

        private static final long serialVersionUID = -8828591126748246256L;

        private String name;

     

        @Override

        public int doEndTag() throws JspException {

            try {

                this.pageContext.getOut().println("Hello, " + name);

            } catch (Exception e) {

                throw new JspException(e);

            }

     

            return EVAL_PAGE;

        }

     

        public String getName() {

            return name;

        }

     

        public void setName(String name) {

            this.name = name;

        }

    }

    1. 2.  在tld中配置标签库信息

    在/WEB-INF下新建taglib.tld文件。

    <shortname>指明推荐使用的prefix为taglib。

    <uri>指明引用这个标签库时使用的uri为http://notes.javaee.jsp.com/taglib

    <tag>定义要引用的标签信息。<name>指明标签名,<tagclass>指明映射的Java类,和前面的对应。

    然后定义这个标签的属性。因为前面Java类中的属性为name,这里也要对应上。

    taglib.tld:

    <?xml version="1.0"encoding="UTF-8" ?>

    <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 web-jsptaglibrary_2_0.xsd"

    version="2.0">

        <tlibversion>1.0</tlibversion>

        <jspversion>2.0</jspversion>

        <shortname>taglib</shortname>

        <uri>http://notes.javaee.jsp.com/taglib</uri>

        <info>Private Taglib</info>

        <tag>

            <name>hello</name>

            <tagclass>notes.javaee.jsp.taglib.HelloTag</tagclass>

            <bodycontent>empty</bodycontent>

            <info>Hello tag with parameters.</info>

            <attribute>

                <name>name</name>

                <required>true</required>

                <rtexprvalue>true</rtexprvalue>

            </attribute>

        </tag>

    </taglib>

    1. 3.  在jsp文件中引用标签

    前面在tld文件中配置了各个关键信息,现在就可以直接在jsp文件中使用了。

    首先,需要在jsp文件中引入标签库文件。这里和标准标签库JSTL一样,使用taglib关键字来说明要引入的是标签库。uri是引入地址,prefix是标签库关键字。

    <%@ taglib uri="http://notes.javaee.jsp.com/taglib"prefix="taglib"%>

    由于前面定义的标签name为hello,所以可以使用的标签名为:prefix+name,即:taglib:hello。

    Hello.jsp:

    <%@ page language="java"contentType="text/html; charset=UTF-8"%>

    <%@ taglib uri="http://notes.javaee.jsp.com/taglib"prefix="taglib"%>

    <html>

    <head>

    <meta http-equiv="Content-Type"content="text/html; charset=UTF-8">

    <title>Insert title here</title>

    </head>

    <body>

    <taglib:hello name="World"/> <br/>

    </body>

    </html>

    结果:

    使用SimpleTagSupport自定义标签(JSP2.0)

    1. 1.   继承标签API

    定义一个HelloTag类,继承SimpleTagSupport类。

    PersonTag.java:

    package notes.javaee.jsp.taglib2;

     

    import java.io.IOException;

     

    import javax.servlet.jsp.JspException;

    import javax.servlet.jsp.tagext.SimpleTagSupport;

     

    public class PersonTag extends SimpleTagSupport {

        private String name;

        private String sex;

        private int age;

     

        @Override

        public void doTag() throws JspException, IOException {

            this.getJspContext().getOut().write(

                    "[Person Info]name: " + name + ", sex: " + sex + ", age:" + age);

        }

        public String getName() {

            return name;

        }

        public void setName(String name) {

            this.name = name;

        }

        public String getSex() {

            return sex;

        }

        public void setSex(String sex) {

            this.sex = sex;

        }

        public int getAge() {

            return age;

        }

        public void setAge(int age) {

            this.age = age;

        }

    }

    2.在tld中配置标签库信息

    在/WEB-INF下新建taglib.tld文件。

    关键配置信息基本和使用TagSupport自定义标签范例中一样。但是由于对应Java类中有3个属性,需要一一对应上。

    taglib.tld:

    <?xml version="1.0"encoding="UTF-8" ?>

    <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 web-jsptaglibrary_2_0.xsd"

    version="2.0">

        <tlibversion>1.0</tlibversion>

        <jspversion>2.0</jspversion>

        <shortname>taglib</shortname>

        <uri>http://notes.javaee.jsp.com/taglib</uri>

        <info>Private Taglib</info>

        <tag>

            <name>person</name>

            <tagclass>notes.javaee.jsp.taglib2.PersonTag</tagclass>

            <bodycontent>empty</bodycontent>

            <info>person info tag</info>

            <attribute>

                <name>name</name>

                <required>true</required>

                <rtexprvalue>true</rtexprvalue>

            </attribute>

            <attribute>

                <name>sex</name>

                <required>true</required>

                <rtexprvalue>true</rtexprvalue>

            </attribute>

            <attribute>

                <name>age</name>

                <required>true</required>

                <rtexprvalue>true</rtexprvalue>

            </attribute>

        </tag>

    </taglib>

    3.在jsp文件中引用标签

    引用标签方式和使用TagSupport自定义标签范例一样。

    personTag.jsp

    <%@ page language="java"contentType="text/html; charset=UTF-8"%>

    <%@ taglib uri="http://notes.javaee.jsp.com/taglib"prefix="taglib"%>

    <html>

    <head>

    <meta http-equiv="Content-Type"content="text/html; charset=UTF-8">

    <title>Insert title here</title>

    </head>

    <body>

    <taglib:person name="Alex"sex="man" age="18"/>

    </body>

    </html>

    结果:

  • 相关阅读:
    Query实例的ajax应用之二级联动的后台是采用php来做的
    关于jquery的css的一些知识
    这个代码给所有带有name属性的链接加了一个背景色
    jQuery生成一个DIV容器,ID是"rating".
    被included或者被required的文件都来自哪里呢
    msql_createdb: 建立一个新的 mSQL 数据库。
    php中调用这个功能可以在web页面中显示hello world这个经典单词
    啦啦啦测试心得
    maven命令
    robotframework使用
  • 原文地址:https://www.cnblogs.com/aimei/p/12201295.html
Copyright © 2011-2022 走看看