全国咨询热线:400-618-4000

JAVA培训之自定义标签实例

更新时间:2019年03月21日18时01分 来源:传智播客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学院