JSP自定义标签开发(三)——标签语言的介绍

JSP自定义标签开发(三)——标签语言的介绍

2023年7月29日发(作者:)

JSP⾃定义标签开发(三)——标签语⾔的介绍JSP标签库(也称⾃定义库)可看成是⼀套产⽣基于XML脚本的⽅法,它经由JavaBeans来⽀持。在概念上说,标签库是⾮常简单和可以重⽤的代码构造。 ⾃定义标签有着丰富的特点,它们可以:1.可以通过调⽤页⾯传递的属性进⾏⾃定义;2.可以访问对于JSP页⾯可能的所有对象;3.可以修改由调⽤页⾯产⽣的响应。4.可以相互间通信。你可以创建并初始化⼀个JavaBean组件,创建⼀个变量引⽤标签中的bean,接着在其它的标签中引⽤该bean.5.可以在⼀个标签中嵌套另⼀个,可以在JSP页⾯中进⾏复杂的交互。 下⾯的代码声明在⽹页中使⽤新的标签,这个标签以hello为前缀,访问的路径为/demotag。<%@ taglib uri="/demotag" prefix="hello" %> ⾃定义标签为在JSP项⽬中创建易于重⽤的代码打开了⼀扇⼤门。你所需要的只是标签库和它的⽂档说明。 通过实现接⼝或者继承现有的类,我们就可以开发⾃定义的标签。常⽤的接⼝有:TagSupport类 该类是IterationTag的缺省实现。除了实现原有⽅法外,本⾝还增加了⼀些有⽤的其他⽅法和成员变量。下表列出其中重要的⼏个:名称

重写的⽅法和他们的返回值

void doStartTag()

void doAfterBody()

void doEndTag()

处理嵌套标签的有⽤的⽅法

void setParent(Tag)

Tag getParent()Tag findAncestorWithClass(Tag,Class)

标签属性操作

void setValue(String,Object)

Object getValue(String)

Enumeration getValues()

void removeValue(String)

受保护的实例变量

PageContext pageContext

描述

继承⾃Tag。返回值SKIP_BODY。

继承⾃IterationTag。返回值SKIP_BODY。

继承⾃Tag。返回值EVAL_PAGE。

接受和维护⼀个⽗标签的引⽤。

返回⽗标签的引⽤。

静态⽅法。寻找最近的指定类的标签。

设置属性。属性名是字符串,值可以是任何对象。

返回给定属性名的属性的值。

返回⼀个所有值的枚举。

删除给定的属性。

⼀个保存着PageContext对象的变量。 BodyTagSupport类 该类同时继承了TagSupport类,并实现BodyTag接⼝。除了前表所⽰⽅法,该类还提供了⼀些其它⽅法便于使⽤。 名称

重写的⽅法和他们的返回值

void doStartTag()

void doAfterBody()

void doEndTag()

⽤以处理缓冲的⽅法

void setBodyContent(BodyContent)

BodyContent getBodyContent()

JspWriter getPreviousOut()

实现Tag接⼝ 所有的标签处理器都需要间接或直接的实现这个接⼝。

下⾯列出Tag接⼝定义的⽅法和常量:描述

继承⾃Tag。返回值EVAL_BODY_BUFFERED。

继承⾃IterationTag。返回值SKIP_BODY。

继承⾃Tag。返回值EVAL_PAGE。

接受和维护⼀个BodyContent对象(缓冲对象)的引⽤。

返回BodyContent对象的引⽤。

返回JspWriter对象,BodyContent就是对他的简单包裹。

⽅法名

int doStartTag()

int doEndTag()

Tag getParent()

void release()

void setPageContext(PageContext)

void setParent(Tag)

  描述

当碰到标签起始标记时执⾏。(

当碰到标签结束标记时执⾏。()

获得⼀个⽗标签对象

从内存中释放该标签对象

设置当前页上下⽂(page context)

对⽗标签对象进⾏设置

常量

EVAL_BODY_INCLUDE

SKIP_BODY

EVAL_PAGE

SKIP_PAGE

描述

doStartTag()的返回值。指出jsp引擎计算标记体并输出doStartTag()的返回值。指出jsp引擎跳过标记体且不输出

doEndTag()的返回值。指出jsp引擎计算页⾯剩余部分并输出

doEndTag()的返回值。指出jsp引擎跳过页⾯剩余部分且不输出

setPageContext()⽅法setPageContext()⽅法是⼀个定制标签声明周期内第⼀个要被调⽤的⽅法。完整写法是:public void setPageContext(PageContext);jsp引擎会将jsp页转换时隐含创建的pageContext对象,作为参数,调⽤setPageContext⽅法。通常的做法会将这个参数保存为本标记处理器的参数。setParent()和getParent()⽅法当标签嵌套使⽤时,外层的标签被成为⽗标签,内部的被称为⼦标签。完整的写法是:public void setParent(Tag);public Tag getParent();其中setParent⽅法对⽗标签对象进⾏设置。⽽getParent⽅法⽤以获得⽗标签对象。setter⽅法当定制标签中包含属性时,在标签处理器中有和javaBean相同的设置机制。即每⼀个属性XXX,都有对应的setXXX()⽅法。这些⽅法的调⽤是在setPageContext()和setParent()之后,doStartTag()之前。(就是说所有的属性-即实例变量-必须完全赋值,因为随后的⽅法可能会调⽤到它们)doStartTag()⽅法该⽅法标志着真正的标签处理开始。当前三阶段的⽅法执⾏完后,jsp引擎就会调⽤doStartTag()⽅法了。完整写法是:public int doStartTag() throws JspException;该⽅法给了标签处理器⼀个初始化计算和校验属性值合法性的机会。如果初始化失败或属性值不合法,则抛出JspException异常,或其⼦类,如JspTagException。初始化计算过后,该⽅法将决定是否继续对标签体进⾏计算。作为结果,返回⼀个整数常量(EVAL_BODY_INCLUDE或SKIP_BODY),⽤以指⽰是否跳过标签体的执⾏。除此之外不返回任何其它值。doEndTag()⽅法执⾏完doStartTag()⽅法后,就该执⾏doEndTag()了。完整写法是:public int doEndTag() throws JspException;该⽅法标志着真正的标签处理结束。同样该⽅法将决定是否继续执⾏jsp⽂件中该标签之后的内容。它也会返回⼀个整数常量(EVAL_PAGE或SKIP_PAGE),⽤以指⽰页⾯后续内容是否跳过。注意此处的范围是页,并不是转换单位。所以计算不计算全都是针对该页⽽⾔。release()⽅法最后,jsp引擎将调⽤release⽅法,当标签处理结束,标签处理器对象不再使⽤时。完整写法是:public void release();注意。⼀个页⾯内同时有多个相同标签时,jsp引擎会只会为该标签创建⼀个对象。只有等该页内相同标签全部处理完了。jsp引擎才会调⽤release()⽅法,将该标签对象从内存清理掉。 ⾃定义标签的开发包括两个部分的开发:(1)开发标签的处理程序(java类)(2)标签描述⽂件(.tld⽂件) ⾃定义标签的种类有许多,可以根据实际项⽬的需要进⾏编写。但为了不重复的开发,jsp标准推出JSTL(标准标签库)。 在JSP应⽤程序中添加⾃定义标签的能⼒可以使⼯作重点放到以⽂档为中⼼的开发⽅式上。可以使 Java 代码不出现在JSP 页中,从⽽使这些页⾯更容易维护。 在创建⾃定义标签之前,需要创建⼀个 标签处理程序。标签处理程序是⼀个执⾏⾃定义标签操作的 Java 对象(Java类)。在使⽤⾃定义标签时,要导⼊⼀个 标签库 —— 即⼀组标签/标签处理程序对,这样页⾯编译时才能处理你的⾃定义标签。通过在 Web 部署描述符()中声明库导⼊它,然后⽤指令taglib将它导⼊ JSP 页。 如果JSP容器在编译JSP⽂件时遇到了⾃定义标签,那么它就检查 标签库描述符(tag library descriptor)(TLD) ⽂件以查询相应的标签处理程序。TLD ⽂件对于⾃定义标签处理程序,就像 Web 部署描述符对于 servlet ⼀样。 对正⽂进⾏操作 —— 即对在开始和结束标签之间的内容进⾏操作的 —— 标签必须实现 BodyTag 接⼝。我们将称这些标签为正⽂标签。我们将不对其正⽂操作的标签称为简单标签。简单标签可以实现Tag接⼝,尽管不要求它们这样做。要记住不对其正⽂操作的标签仍然有正⽂,只不过,它的标签处理程序不能读取这个正⽂。要构建简单标签,我们需要完成以下步骤:1. 创建实现了Tag接⼝(准确地说是 )的标签处理程序类。2. 创建⼀个 TLD ⽂件。

3. 在标签处理程序 Java 类中创建属性。

4. 在 TLD ⽂件中定义与标签处理程序 Java 类中定义的属性对应的属性。

5. 在 TLD ⽂件中声明 scriptlet 变量。

6. 实现 doStartTag() ⽅法。在标签处理程序类中,根据属性将值设置到 scriptlet 变量中。 在jsp1.2时代已经有标记库了, 并且功能强⼤,但标记库的编程和调⽤都⽐较复杂,导致真正使⽤到WEB开发中的还是不多。JSP2.0推出的简单标记库扩展解决了以上的问题。简单标记库相对JSP1.2中的标记库来说,优点在于对后台程序员来说,结构更简单,实现接⼝更少,可以轻松实现后台程序。 JSP 2.0中加⼊了新的创建⾃制标记的API:Tag,该API定义了⽤来实现简单标记的接⼝。和JSP 1.2中的已有接⼝不同的是,SimpleTag接⼝不使⽤doStartTag()和doEndTag()⽅法,⽽提供了⼀个简单的doTag()⽅法。这个⽅法在调⽤该标记时只被使⽤⼀次。⽽需要在⼀个⾃制标记中实现的所有逻辑过程、循环和对标记体的评估等都在这个⽅法中实现。从这个⽅⾯来讲,SimpleTag可以和IterationTag达到同等的作⽤。但SimpleTag的⽅法和处理周期要简单得多。在SimpleTag中还有⽤来设置JSP内容的setJspBody()和getJspBody()⽅法。Web容器会使⽤setJspBody()⽅法定义⼀个代表JSP内容的JspFragment对象。实现SimpleTag标记的程序可以在doTag⽅法中根据需要多次调⽤getJspBody().invoke()⽅法以处理JSP内容。⾃定义标签的分类:(1)不带主体和属性的简单标签:如< mytag:helloworld/>(2)不带主体但有属性的标签:如”/>(3)带标签体和属性的标签:在⾃定义标签的起始和结束标签之间的部分为标签体(Body)。Body的内容可以是JSP中的标准标签,也可以是HTML、脚本语⾔或其他的⾃定义标签。 (4使⽤脚本变量的标签:定义了id和type属性的标签可以被标签后⾯的Scriptlet使⽤。<%nection(); %>

发布者:admin,转转请注明出处:http://www.yc00.com/news/1690578884a372478.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信