第6讲 自定义标签库.ppt_第1页
第6讲 自定义标签库.ppt_第2页
第6讲 自定义标签库.ppt_第3页
第6讲 自定义标签库.ppt_第4页
第6讲 自定义标签库.ppt_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第6讲,自定义标签库,2,纲要,自定义标签概述 创建一个简单的自定义标签示例 创建自定义标签的基本步骤 给自定义标签添加属性 自定义标签处理标签体,3,(1)为什么要自定义标签? 由于在实际开发中,这些标准操作标签往往不能满足用户的要求,就需要我们自己来制定标签。即自定义标签库。,(2)自定义标签的格式。其格式与标准操作标签相似,其特征为: 所有的自定义标签都有名称,标签名称应该用“:”分隔前缀与后缀; 标签可以有任意数目的属性,属性可以是可选的或必需的; 标签可以将其他子标签包含在内,包含标签被称为被包含标签的父标签; 自定义标签可以有主体内容,即为标签开始元素和结束元素之间的内容(包括子标

2、签)。,自定义标签概述,4,创建一个简单的自定义标签示例,simple.jsp,web.xml,greeting.tld,GreetingTagHandler.java,5,(2)自定义标签的使用形式 空标签(不含标签体和属性) 格式: 或 例如: 带有属性的空标签 格式: 或 例如:“/ ,6,带有标签体的标签 格式: 标签体 例如: : 既带有属性又有标签体的标签 格式: 标签体 例如: 现在时间是:: ,请记住: 一个标签包含起始标记和结束标记; 在起始标记中可设置标签属性; 在起始标记和结束标记之间还可以有标签体; 执行顺序:起始标记、标签体、结束标记。,7,(3)自定义标签为什么能实

3、现一定功能?,自定义标签实际上是一个实现了特定接口的Java类,它封装了一些常用功能,在运行时被相应的代码所替换。如下图所示:,8,几个基本概念: 标签(Tag):让JSP页面实现特定功能, 通过标签可以使JSP网页变得简洁并且易于维护 ,是一种XML元素,它的名称和属性都对大小写敏感; 标签库(Tag library):由一系列功能相似、逻辑上互相联系的标签构成的集合,同一个标签库的“前缀”相同; 标签库描述文件(Tag Library Descriptor):是一个XML文件,它提供了标签库中类和JSP中标签引用的映射关系,也是一个配置文件,与web.xml类似; 标签处理类(Tag Ha

4、ndle Class):是一个Java类,这个类继承了TagSupport(或BodyTagSupport)类,也可能实现了Tag或其子接口,通过该类可以自已定义JSP标签的具体功能。,9,(4)自定义标签的类与接口:位于javax.servlet.jsp.tagext包,10,说明: JspTag是Tag和SimpleTag接口的父接口,是一个标记接口,不包含任何属性和方法; Tag接口中的方法和常量: setPageContext()、setParent():分别设置pageContext和父标签; doStartTag():遇到自定义标签的开始标记时去调用标签处理类的方法,返回值为:EV

5、AL_BODY_INCLUDE(表示标签体要执行,执行结果放在当前输出流中)、SKIP_BODY( 不执行标签体); doEndTag():遇到自定义标签的结束标记时去调用标签处理类的方法,返回值:EVAL_PAGE(Jsp页面的剩余内容将继续执行)、SKIP_PAGE(Jsp页面的剩余内容不执行)。,11,doAfterBody():是IterationTag接口增加的方法,在执行完标签体后调用,如果没有标签体,该方法将不会调用。该方法的返回值是:SKIP_BODY、EVAL_BODY_AGAIN(重复执行标签体); setBodyContent():是BodyTag接口中设置bodyCon

6、tent属性的方法,以备后面获取标签体内容;只有在doStartTag()返回EVAL_BODY_BUFFERED才执行; doInitBody():在setBodyContent()方法之后,执行标签体之前调用,为标签体的执行做准备;只有在doStartTag()返回EVAL_BODY_BUFFERED才执行; TagSupport类实现IterationTag接口,利用它可简化标签处理类的创建; BodyTagSupport类实现BodyTag接口,利用它可简化有关标签体处理类的创建。,12,2. 创建自定义标签的基本步骤,(1)实现Tag接口的标签处理类的生命周期,13,(2)实现Ite

7、rationTag接口的标签处理类的生命周期,14,(3)创建自定义标签的基本步骤: 分为4步: 创建标签处理类 编写、部署标签库描述(TLD)文件 在web.xml文件中配置标签库信息 在JSP文件中使用标签库,下面以创建标签为例进行说明,该标签的功能是能根据系统时间,进行不同的问候: Good morning(afternoon、evening、night等),15,1)创建标签处理类 该标签是空标签,只要实现doEndTag()方法即可,并返回EVAL_PAGE,继续执行剩余页面。 具体代码见myjctl.GreetingTagHandler.java。,2)编写、部署标签库描述(TLD

8、)文件 标签库描述(TLD)文件的作用是由标签找到对应的标签处理类。扩展名为tld,是xml类型文件,通常放在META-INF或WEB-INF或其子目录中,但不能存放在WEB-INFclasses目录和WEB-INFlib目录中。例如: WEB-INFtldsgreeting.tld。 TLD文件有一定格式要求,可复制Tomcat 6.0中TLD文件(如:.Tomcat 6.0webappsexamplesWEB-INFjsp2jsp2-example-taglib.tld)进行修改。 TLD文件的主要标记:,16,shortname标记:标签的“前缀”,如:c、jsp、simple等,用来标

9、识标签库,同一标签库的前缀相同; url标记:为每个自定义标签找到对应的处理类。uri包含了一个字符串,如: /CustomTags等,容器用它来定位TLD文件,在TLD文件中可以找到标签库中所有标签处理类的名称。 也可以在web.xml中设置。 tag标记:可包含如下子标记: 标签名 包名.标签处理类 其中:有4种取值:empty(无标签体)、JSP(默认,标签体可含JSP代码)、scriptless(标签体可以包含EL、JSP标准动作,但不能有脚本)、tagdependent(标签体交由标签处理) :可设置属性名、是否必需、属性值是否为运行时的表达式等,17,3)在web.xml文件中配置

10、标签库信息 例如:,/为JSP文件提供全局配置信息 /标签库信息,若在taglig指令中指明tld,则此标记可省略 /CustomTags/设置uri /标签库描述文件位置 /WEB-INF/tlds/greeting.tld ,4)在JSP中使用自定义标签,例如:,/ taglib指令 /使用自定义标签,18,(4) 自定义标签的调用过程, ,Web容器根据标签前缀,获得taglib指令中的uri属性值; Web容器根据uri属性在web.xml找到对应的元素; 从元素中获得对应的元素的值; Web容器根据元素的值从WEB-INF/目录下找到对应的tld文件; 从.tld文件中找到与标签名对

11、应的元素; 从元素中获得对应的元素的值; Web容器根据元素的值创建相应的标签处理类实例; Web容器调用这个实例的doStartTag/doEndTag方法完成相应的处理。,19,3. 给自定义标签添加属性,下面以创建标签为例进行说明,该标签能够设置访问者name属性,并根据系统时间来问候来访问者。, 现在时间是:: ,20,1)创建标签处理类 要设置标签属性name,需要在标签处理类中设置成员变量name,并增加setName(String name)和getName()方法。根据系统时间问候来访者在doStartTag()中实现,并返回EVAL_BODY_INCLUDE。doEndTag

12、()方法返回EVAL_PAGE,继续剩余页面的执行。 具体代码见GreetingAttributeTagHandler.java。,2)编写、部署标签库描述(TLD)文件 继续使用greeting.tld文件,增加一个新标记,并在其中加入标记及其子标记。具体如下:,21,greeting.tld新增内容:, Simple Tag with attributes. greetingAtt myjctl.GreetingAttributeTagHandler JSP name /属性名 true /该属性必不可少 true /可以用表达式赋值(默认为false) ,3)在web.xml文件中配置标

13、签库信息 本应用程序中web.xml已包含uri和tld信息,不必修改。,22,4)在JSP中使用自定义标签,例如:, 现在时间是:: ,在login.html中输入用户名,得到username字符串,并用username来设置标签的属性name,再根据系统时间问候来访者。,23,4. 自定义标签处理标签体,(1)实现BodyTag接口的标签处理类的生命周期,24,(2)修改标签体执行结果的例子,有时我们需要对标签体的执行结果进行修改后再输出,这可以通过自定义标签来实现。例如:, : ,25,(3)如何实现“修改标签体执行结果”?,继承BodyTagSupport类或实现BodyTag接口;

14、doStartTag()返回EVAL_BODY_BUFFERED; 在doAfterBody()方法中处理标签体:调用getBodyContent()、BodyContent的有关方法,获取标签体内容,并将程序处理结果存放到输出流。,由上可知,要得到标签体内容并进行修改,需要用到一个重要类BodyContent,它有两个重要方法: String getString():以字符串方式返回标签体内容 public JspWriter getEnclosingWriter():得到封装的JspWriter对象,26,(4)编程步骤: 如上述方法,创建标签处理类,具体代码见GreetingBodyTagHand

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论