乐鱼电竞



  • 教育行业A股IPO第一股(股票代码 003032)

    全国咨询/投诉热线:400-618-4000

    JAVA培训之自定义标签实例

    更新时间:2016年09月29日16时59分 来源:乐鱼播客JAVA培训学院 浏览次数:

    通过自定义标签详解,大家对如何自定义标签的步骤有了初步的了解,今天我们动手实践完成自定义标签,具体操作如下所示:
    (1)创建web应用Example11,在该应用下新建一个标签处理类,名称为MyTag,该类实现了SimpleTag接口,主要代码如例1-1所示:
    例1-1 MyTag.java
    public class MyTag implements SimpleTag{
         private PageContext pageContext;
         private JspFragment body;
        @Override
        public void doTag() throws JspException, IOException {
           //向页面中输出内容
           pageContext.getOut().print("hello tag");
        }
        @Override
        public JspTag getParent() {
           return null;
        }
        @Override
        public void setJspBody(JspFragment jspBody) {
           this.body=jspBody;
        }
        @Override
        public void setJspContext(JspContext pc) {
           this.pageContext=(PageContext) pc;//将参数pc赋值给成员变量pageContext
        }
        public void setParent(JspTag parent) {}
    }
    在例1-1中,MyTag类中定义了两个成员变量,分别是pageContext和body。当Tomcat服务器调用了setJspBody(JspFragment jspBody)、setJspContext(JspContext pc)方法时,将方法中的参数赋值给成员变量。那么我们就可以通过pageContext获得其他内置对象,然后在doTage()方法中使用pageContext获得out对象,再调用print(String s)方法向浏览器输出内容。
    (2)在WEB-INF目录下新建一个目录,名称为tld,然后在该目录下新建一个tld文件,名称为itcast-tag.tld,主要代码如例1-2所示:
    例1-2 itcast-tag.tld
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
                            "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
    <taglib>
     <tlib-version>1.0</tlib-version>
     <jsp-version>1.2</jsp-version>
     <short-name>itcast</short-name>
     <uri>http://www.itcast.cn/tags/it-1.0</uri>
    </taglib>
    (3)例1-2中,文件的约束可以参考c标签的tld文件,我们在jstl-1.2.jar文件中找到c.tld文件,然后将文件的约束拷贝到itcast-tag.tld文件中,如例1-3所示:
    <?xml version="1.0" encoding="UTF-8"?>
    <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 1.1 core library</description>
      <display-name>JSTL core</display-name>
      <tlib-version>1.1</tlib-version>
      <short-name>c</short-name>
      <uri>http://java.sun.com/jsp/jstl/core</uri>
     
     <tlib-version>1.0</tlib-version>
     <jsp-version>1.2</jsp-version>
     <short-name>itcast</short-name>
     <uri>http://www.itcast.cn/tags/it-1.0</uri>
    </taglib>
    (4)例1-3中,上面的部分代码是c.tld文件中的代码,我们需要将内容修改成我们自定义的标签信息,如例1-4所示:
    <?xml version="1.0" encoding="UTF-8"?>
    <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">
      <tlib-version>1.0</tlib-version>
      <short-name>itcast</short-name>
      <uri>http://www.itcast.cn/tags/it-1.0</uri>
    </taglib>
    (5)在例1-4的基础上添加自定义标签的处理类相关信息,如例1-5所示:
    <?xml version="1.0" encoding="UTF-8"?>
    <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">
      <tlib-version>1.0</tlib-version>
      <short-name>itcast</short-name>
      <uri>http://www.itcast.cn/tags/it-1.0</uri>
     
      <tag>
      <name>MyTag</name>
      <tag-class>cn.itcast.tag.MyTag</tag-class>
      <body-content>empty</body-content>
      </tag>
    </taglib>
    下面我们来分析例1-5中自定义标签处理类的相关信息,如下所示:
    • <name>myTag</name>:指定当前标签的名称;
    • <tag-class>cn.itcast.tag.MyTag</tag-class>:指定当前标签的标签处理类;
    • <body-content>empty</body-content>:指定标签体的类型,我们这里使用的是空标签,类似于HTML标签中的<br/>标签。
    (6)在WebRoot目录下新建一个jsp页面,名称为myTag.jsp,在该页面中导入自定义标签库,主要代码如例1-6所示:
    例1-6 myTag.jsp
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ taglib prefix="it" uri="/WEB-INF/tld/itcast-tag.tld" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
       <it:MyTag/>
    </body>
    </html>
    例1-6中,<%@ taglib prefix="it" uri="/WEB-INF/tld/itcast-tag.tld" %>是用来导入标签库,目的是为页面指定tld文件的位置,也可以将uri的值设为http://www.itcast.cn/tags/it-1.0,这个路径是我们在itcast-tag.tld文件中配置的。当标签库被导入了,在页面中使用自定义的标签时,页面会有提示。
    (7)将Example11发布到服务器中,然后启动服务器,在浏览器端访问myTag.jsp,浏览器显示结果如图1-1所示:

    图1-1 浏览器显示结果
    以上自定义标签的处理类实现了SimpleTag接口,需要重写五个方法,而且需要我们自己在类中定义成员变量pageContext,然后对该变量进行赋值操作,这样很麻烦。有一种简便的方法可以让我们只重写doTag()方法,其他方法不用考虑,那就是继承SimpleTagSupport类。SimpleTagSupport类的结构如图1-2所示:

    图1-2 SimpleTagSupport类
    由图1-2中可知,SimpleTagSupport类实现了SimpleTag接口,那么它必然重写了SimpleTag接口的五个方法,我们再来看看SimpleTagSupport类又定义了哪些方法,如下所示:

    图1-3 SimpleTagSupport类的相关方法
    例1-3中,除了重写的SimpleTag接口的方法,它还提供了以下三个方法:
    • JspTag findAncestorWithClass(JspTag from,Class<?> klass):查找最接近给定实例的给定类类型的实例。此方法使用来自 Tag 和/或 SimpleTag 接口的 getParent 方法。此方法用于协调各协作标记,了解即可;
    • JspFragment getJspBody():返回服务器通过setJspBody()方法传入的正文;
    • JspContext getJspContext():返回服务器通过setJspContext()方法传入的页面上下文。
    (8)在Example11中新建一个标签处理类,名称为MyTag1,该类继承SimpleTagSupport类,主要代码如例1-7所示:
    例1-7 MyTag1.java
    public class MyTag1 extends SimpleTagSupport{
        @Override
        public void doTag() throws JspException, IOException {
            this.getJspContext().getOut().print("继承SimpleTagSupport类的标签");
        }
    }
    例1-7中,MyTag1重写了父类的doTag()方法,调用父类的getJspContext()方法获得JspContext类的对象,然后获得out对象,利用out对象向浏览器端输出内容。
    (9)在itcast-tag.tld文件中添加MyTag1的配置信息,如例1-8所示:
    此处省略例1-5中的代码
    <tag>
      <name>MyTag1</name>
      <tag-class>cn.itcast.tag.MyTag1</tag-class>
      <body-content>empty</body-content>
    </tag>
    (10)在myTag.jsp页面中添加一个标签,如例1-9所示:
    此处省略例1-6中的代码
    <br> SimpleTagSupport:<it:MyTag1/>
    (11)在浏览器端再次访问myTag.jsp页面,浏览器显示结果如图1-4所示:

    图1-4 浏览器显示结果


    本文版权归乐鱼播客java学院所有,欢迎转载,转载请注明作者出处。谢谢!
    作者:乐鱼播客java学院
    首发:http://java.itcast.cn/
    0 分享到:
    和我们在线交谈!
    【网站地图】【sitemap】