自定义标签的开发

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

编写简单标签处理器通常不是实现SimpleTag接口, 而是继承SimpleTagSupport类。
public class HelloTag extends SimpleTagSupport{ public void doTag() throws JspException, IOException{ JspWriter out = getJspContext().getOut(); out.print("<font color='blue'>Hello, This is simple tag.</font>"); } }
3.1.2 自定义标签的开发步骤
创建和使用自定义标签一般包含下面3个步骤:
1. 创建标签处理类(tag handler); 2. 创建标签库描述文件(TLD); 3. 在JSP文件中导入标签库和使用标签。
1. 创建标签处理类
标签处理类是实现某个标签接口或继承某个标签类的实现类, 程序实现了SimpleTag接口.
在DD文件中声明标签
• JSP 2.0之前开发人员还必须在DD(web.xml)中为URI指 定其TLD文件的具体位置。然后,容器会首先查找web.xml 文件的<taglib>元素,建立URI与TLD之间的映射。
例如,对于上述标签,可以将下面代码加到web.xml文 件的<web-app>元素中:
只有tlib-version元素是必须的,其他元素是可选的
可包含一个<uri>元素:
<uri>http://www.mydomain.com/sample</uri>
指定访问该库中的标签使用的URI 可以使用下面的taglib指令把库导入到JSP页面中:
<%@ taglib prefix="test" uri="http://www.mydomain.com/sample"%>
<!ELEMENT taglib ( tlib-version, jsp-version, short-name, uri?, display-name?, small-icon?, large-icon?,description?, validator?, listener*, function+, tag+) >
然而,如果在web.xml文件中包含对同一个URI的显式映射, 则显式映射要比这种隐式映射优先。
这里的< uri>元素值看上去像一个Web资源的URI,实际上它 仅仅是一个逻辑名称,并不与任何Web资源对应,容器使用它 仅用来完成URI与TLD文件的映射。 可以使用三种类型的URI:
• (1)绝对URI:例如,http://www.mydomain.com/sample和 http://localhost:8080/taglibs。 • (2)根相对URI:例如,/mytaglib和/taglib1/helloLib。 • (3)非根相对URI:例如,HelloLib和taglib2/helloLib。
例3.2 sampleLib.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 version="2.0"> <tlib-version>1.0</tlib-version> <uri>http://localhost/sampleLib</uri> <tag> <name>hello</name> <tag-class>sampleLib.HelloTag</tag-class> <body-content>empty</body-content> </tag> </taglib>
容器如何查找TLD文件
• 实际上,容器会自动建立一个<uri>名和TLD文件之间的映射。 • 在部署一个Web应用时,只要把TLD文件放在容器会搜索的位置上, 容器就会发现这个TLD,并为标签库建立一个映射。
容器自动搜索的位置包括:
• /WEB-INF目录或其子目录; • /WEB-INF/lib目录下的JAR文件中的META-INF目录或其子目录
3.1.3 SimpleTag接口及其生命周期
SimpleTag接口中定义了生存周期方法,允许在Java类和JSP 之间传输信息,由Web容器调用来初始化SimpleTag操作。 1. SimpleTag接口的方法 • public void wk.baidu.cometJspContext(JspContext pc) • public void setParent(JspTag parent) • public void setJspBody(JspFragment jspBody) • public JspTag getParent() • public void doTag() throws JspException, IOException
2. 创建标签库描述文件
• 标签库描述文件(Tag Library Descriptor,简称TLD)是XML格 式的文件,其扩展名一般为.tld。TLD文件主要用来定义可以使 用哪些标签以及与这些标签的处理类的对应关系等。
标签库描述文件: sampleLib.tld
TLD文件一般存放在Web应用程序的/WEB-INF目录或其子目录 下
3.2
理解TLD文件
每个自定义标签都必须在TLD文件声明。当在JSP页面中使用自定 义标签时,容器将读取TLD文件,从中获取有关自定义标签的信 息,如标签名、类名、是否是空标签以及是否有属性等。
3.2.1 <taglib>元素
<taglib>元素是根元素。它包含一些二级元素。下面是 <taglib>元素的DTD:
为了开发自定义标签,Sun提供了一些接口和类,它们称为标 签扩展API
• javax.servlet.jsp.tagext包 • javax.servlet.jsp包
3.1.1 标签扩展API
javax.servlet.jsp.tagext包 JspTag SimpleTag SimpleTagSupport Tag IterationTag BodyTag
<%@ page contentType="text/html" %> <%@ taglib prefix="demo"
uri="http://localhost/sampleLib"%>
<html><head> <title>Using Custom Tag</title></head> <body> <h2>Hello Tag Example</h2> <demo:hello/><br> <demo:hello></demo:hello> </body> </html>
3.1.4 SimpleTagSupport类
是SimpleTag接口的实现类,它除实现了SimpleTag接口中 的方法外,还提供了另外3个方法,如下所示: • protected JspContext getJspContext() 返回标签中要 处理的JspContext对象。 • protected JspFragment getJspBody() 返回 JspFragment对象,它存放了标签体的内容。 • public static final JspTag findAncestorWithClass(JspTag from, Class klass) 返回带指定类的祖先标签。
3.1

简单标签的开发
标签扩展API 自定义标签的开发步骤 SimpleTag接口及其生命周期 SimpleTagSupport类
3.1.1 3.1.2 3.1.3 3.1.4
3.1.1 标签扩展API
在JSP页面中可以使用两类自定义标签。
• 一类是简单(simple)的自定义标签,JSP2.0增加 • 一类是传统(classic)的自定义标签,JSP1.1提供
3. 在JSP页面中使用标签
在JSP页面要使用自定义标签,需要通过<taglib>指令声 明自定义标签的前缀和标签库的URI,格式如下所示: <%@ taglib prefix= "demo" uri="http://localhost/sampleLib"%>
例3.3 : hello.jsp
第3章
自定义标签的开发
3.1 简单标签的开发 3.2 理解TLD文件 3.3 几种类型标签的开发
引言
在JSP页面中,不但可以用JSP标准标签(如 <jsp:include>),也可使用自定义的标签 自定义标签是用户自定义的一种标签,是用Java语言开发 的程序,当其在JSP页面中使用时将执行某种动作。 功能: 采用Java程序控制页面输出内容,实现页面输出格 式重用(一次编写,重复使用) 目的: 允许开发人员把服务器端行为以标记处理的形式 放到JSP页面中,实现页面设计和逻辑设计分开 代码重用,JSP代码更简洁
<taglib> <taglib-uri>/WEB-INF/sampleLib.tld</taglib-uri> <taglib-location>/WEB-INF/sampleLib.tld </taglib-location> </taglib>
3.2.2 <tag>元素
<taglib>元素可以包含一个或多个<tag>元素,每个<tag>元 素都提供了关于一个标签的信息,如要在JSP页面中使用的标 签名、标签处理器类及标签的属性等。<tag>元素的定义如下:
例3.1:程序HelloTag.java:向JSP输出一条消息
要正确编译该文件,必须将Tomcat安装目录中的\lib\jspapi.jar文件添加到classpath路径中。 部署时,将编译后的标签处理文件类放到web应用程序的WEBINF\classes目录下
1. package sampleLib; 2. import java.io.*; 3. import javax.servlet.jsp.*; 4. import javax.servlet.jsp.tagext.*; 5. public class HelloTag implements SimpleTag{ 6. JspContext jspContext = null; 7. JspTag parent = null; 8. public void setJspContext(JspContext jspContext){ 9. this. jspContext = jspContext; 10. } 11. public void setParent(JspTag parent){ 12. this. parent = parent; 13. } 14. public void setJspBody(JspFragment jspBody){ } 15. public JspTag getParent(){ 16. return parent; 17. } 18. public void doTag() throws JspException, IOException{ 19. JspWriter out = jspContext.getOut(); 20. out.print("<font color='blue'>Hello, This is a simple tag.</font>"); 21. } 22. }
标签扩展API的层次结构
TagSupport
BodyTagSupport
标签处理器类还要使用到异常类,定义在 javax.servlet.jsp包中。 • JspException – 简单标签的doTag()方法和传统标签的有关方法都 抛出JspException异常 • JspTagException – JspTagException扩展了JspException。
相关文档
最新文档