通过自定义标签详解,大家对如何自定义标签的步骤有了初步的了解,今天我们动手实践完成自定义标签,具体操作如下所示:
(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 浏览器显示结果
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/253219.html