1.1、 如何进行自定义简单标签:
对于自定义标签而言,如果我们要想使用我们自己定义的简单标签我们必须了解下面的相关类及接口的关系!这样我们就可以开发我们自己的标签库了!下面我们来看一下吧!
我们只要实现SimpleTag接口的实现类SimpleTagSupport抽象类就可以了!在此我们先来了解一下 SimpleTag 接口中定义的方法:
1 public interface SimpleTag extends JspTag { 2 3 public void doTag() 4 throws javax.servlet.jsp.JspException, java.io.IOException; 5 6 public void setParent( JspTag parent ); 7 8 public JspTag getParent(); 9 10 public void setJspContext( JspContext pc ); 11 12 public void setJspBody( JspFragment jspBody ); 13 14 15 }
以下是该接口中方法的作用:
- setJspContext 方法:该方法把代表 JSP 页面的 pageContext 对象传递给标签处理器对象。
- setParent 方法:该方法把父标签处理器对象传递给当前标签处理器对象
- getParent 方法:该方法用于获得标签的父标签处理器对象
- setJspBody 方法:该方法用于把代表标签体的 JspFragment 对象传递给标签处理器对象
- doTag 方法:该方法用于完成所有的标签执行的业务逻辑。该方法可以抛出 javax.servlet.jsp.SkipPageException 异常,用于通知 web 容器不再执行 JSP 页面中位于结束标记后面的内容。
1.2、标签处理器类的生命周期:
开发自定义标签,其核心就是要编写处理器类,在我们了解过SimpleTag 接口中的方法后我们来了解一下当我们编写实现SimpleTag接口的标签处理器类后,其生命周期是是怎样的(即:方法的执行顺序)?
我们了解了标签处理器类后,我们下面来了解一下标签库描述文件
- 标签库描述(Tag Library Description)文件简称为 tld 文件,其扩展名为 .tld
- 多个标签的集合就形成了一个标签库,标签库中的所有标签都必须在标签文件中进行描述
- tld 文件可以放置在 web 应用程序的 WEB-INF 目录及其子目录中,但不能放置在 WEB-INF 目录下的 classes 和 lib 子目录中。其中tld文件也可以放置在META-INF 目录及其子目录中
下面就是tld文件的部分内容:
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!-- DTD约束引用--> 3 <taglib xmlns="http://java.sun.com/xml/ns/javaee" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd" 6 version="2.1"> 7 <!-- tld 文件的描述信息--> 8 <description>JSTL 1.2 core library</description> 9 <display-name>JSTL core</display-name> 10 <tlib-version>1.2</tlib-version> 11 <short-name>c</short-name> 12 <uri>http://java.sun.com/jsp/jstl/core</uri> 13 <validator> 14 <description> 15 Provides core validation features for JSTL tags. 16 </description> 17 <validator-class> 18 org.apache.taglibs.standard.tlv.JstlCoreTLV 19 </validator-class> 20 </validator> 21 <!-- 在 tag 标签中定义的我们的自定义标签--> 22 <tag> 23 <description> 24 Catches any Throwable that occurs in its body and optionally 25 exposes it. 26 </description> 27 <!-- 自定义标签的名字--> 28 <name>catch</name> 29 <!-- 自定义标签的处理器类全类名--> 30 <tag-class> 31 org.apache.taglibs.standard.tag.common.core.CatchTag 32 </tag-class> 33 <!-- 自定义标签的标签体的内容类型:在2.0版本中只有empty、scriptless、tagdependent 三种类型,但到了2.1版本后加了 JSP 类型,更加丰富了标签体的灵活性。 34 – empty:没有标签体 35 – scriptless:标签体可以包含 el 表达式和 JSP 动作元素,但不能包含 JSP 的脚本元素 36 – tagdependent:表示标签体交由标签本身去解析处理。若指定 tagdependent,在标签体中的所有代码都会原封不动的交给标签处理器,而不是将执行结果传递给标签处理器 37 – JSP:接受所有JSP语法,如定制的或内部的tag、scripts、静态HTML、脚本元素、JSP指令和动作。 38 --> 39 <body-content>JSP</body-content> 40 <!-- 在attribute标签中定义自定义标签的属性--> 41 <attribute> 42 <description> 43 Name of the exported scoped variable for the 44 exception thrown from a nested action. The type of the 45 scoped variable is the type of the exception thrown. 46 </description> 47 <!-- 自定义标签属性的名字--> 48 <name>var</name> 49 <!-- 自定义标签属性是不是必须的,取值可以有true|false|yes|no--> 50 <required>false</required> 51 <!--该属性 rtexprvalue 的全拼是 runtime expression value 运行时表达式值!该属性表示是否可以接受运行时表达式的值。 可以填的值 yes|false|true|no --> <rtexprvalue>false</rtexprvalue> 52 </attribute> 53 </tag> 54 </taglib>
这样我们就可以在我们的JSP页面中引用我们自己定义的标签了!
- 在 JSP 页面使用 taglib 指令引入标签库描述文件:
<%@ taglib prefix=“” uri=“” %>
- uri:属性用于指定所引入的标签库描述(tld)文件中所定义的 <uri> 元素的内容;prefix 属性用于为引入的 tld 文件指定一个”引用代号”。prefix 属性可以由 jsp 文件的作者任意指定,只要与其他 taglib 指令的 prefix 属性值不同就可以。