您的位置:首页 > Web前端 > JavaScript

JSP 自定义标签 taglib TagSupport BodyTagSupport

2012-09-15 10:45 411 查看

JSP 自定义标签 taglib TagSupport BodyTagSupport

javaservlet自定义标签taglib
TagSupportBodyTagSupport

jsp自定义标签:

http://www.blogjava.net/limq/archive/2005/03/03/1669.html

jsp自定义标签(taglib)编写的原理和实现

http://www.blogjava.net/gdufo/archive/2008/09/04/226974.html

or : http://www.iteye.com/topic/157737

TagSupport与BodyTagSupport的区别

http://dongguoh.iteye.com/blog/100782

jsp自定义标签
引用

1. 什么是自定义标签

答:1) 用户自定义的Java语言元素, 实质是运行一个或者两个接口的JavaBean;

2) 可以非常机密地和JSP的表示逻辑联系在一起,又具有和普通JavaBean相同的业务逻辑处理能力;

2) 当一个JSP页面转变为servlet时,其间的用户自定义标签转化为操作一个称为标签hander的对象;

3) 可操作默认对象,处理表单数据,访问数据库以及其它企业服务;

2. 自定义标签库的特点

答:1) 通过调用页面传递参数实现定制;

2) 访问所有对JSP页面可能的对象;

3) 修改调用页面生成的响应;

4) 自定义标签间可相互通信;

5) 在同一个JSP页面中通过标签嵌套,可实现复杂交互。

3. 如何使用自定义标签库

答:1) 声明标签库

2) 使标签库执行对Web应用程序可用

4. 声明标签库

答:1) 使用taglib指令声明标签库

2) 语法:<%@taglib uri="URI" prefix="pre" %>

注意:a. uri属性可以是绝对的,也可以是相对URL,该URL指向标记库描述符(TLD)文件;

b. uri属性也可以是一个并不存在的URL,该URL为web.xml文件中将标记库描述符(TLD)文件的绝对URL到本地系统的一个映射;

3) 范例:<%@taglib uri="/WEB-INF/template.tld" prefix="test" %>

<%@taglib uri="http://java.sun.com/jstl/core" prefix="core" %>

5. 使标签库执行可用

答:方式一:在WEB-INF/classes目录下部署标记处理程序类;

方式二:将标记处理程序类打包成jar文件并置于WEB-INF/lib目录。

6. 几种典型的标签(疑问:可以有带主体而没有属性的标签么?)

答:1) 不带属性和主体的简单标签:<mytaglibs:SomeTag/>;

2) 不带主体但有属性的标签:<mytaglibs:SomeTag user="TonyDeng"/>;

3) 带有主体和属性的标签:<mytaglibs:SomeTag user="TonyDeng">

...// 标签体

</mytaglibs:SomeTag>;

注意:a. 属性列于start tag中,它是在标记库描述符(TLD)文件中指定,服务于标记库的自定义行为;

b. 标签体位于start tag和end tag间,可以是任何合法的JSP内容或者标签;

7. 定义标签

答:1) 开发实现tag的类(tag handler);

2) 编辑标记库描述符(TLD)文件;

3) 在web.xml中为标记库描述符(TLD)文件的绝对URL建立一个映射(该步骤可选);

8. 标记库描述符(TLD)文件

答:1) 一个描述标记库的XML文件;

2) 内容开始是整个库的描述,然后是tag的描述;

3) 标记库描述符(TLD)文件用于Web Container确认tag以及JSP页面发展工具;

9. 实现tag的类(tag handler)

答:1) 是一些在引用了标签的JSP页面执行期间被Web Container调用以求自定义标签值的对象;

2) 必须实现Tag, SimpleTag和BodyTag之一;

3) 可以继承TagSupport和BodyTagSupport之一。

10. 标签库的接口和类的继承关系

答:表现形式一:

a. 接口的继承关系:

☉ interface javax.servlet.jsp.tagext.JspTag

☉ interface javax.servlet.jsp.tagext.SimpleTag

☉ interface javax.servlet.jsp.tagext.Tag

☉ interface javax.servlet.jsp.tagext.IterationTag

☉ interface javax.servlet.jsp.tagext.BodyTag

b. 类的继承关系:

☉ class javax.servlet.jsp.tagext.TagSupport (implements javax.servlet.jsp.tagext.IterationTag, java.io.Serializable)

☉ class javax.servlet.jsp.tagext.BodyTagSupport (implements javax.servlet.jsp.tagext.BodyTag)

☉ class javax.servlet.jsp.tagext.SimpleTagSupport (implements javax.servlet.jsp.tagext.SimpleTag)

表现形式二:

(Interface)

JspTag



|ˉˉˉˉˉˉˉˉ|

(Interface) (Interface)

Tag SimpleTag ←--SimpleTagSupport



|

(Interface)

IterationTag←--TagSupport

↑ ↑

| |

(Interface) |

BodyTag ←--BodyTagSupport

2004-10-9 星期四 晴

11. 一个Tag处理程序类必须实现的方法

答:标签处理程序类型 方法

Simple doStartTag, doEndTag, release

Attributes doStartTag, doEndTag, set/getAttribute...release

Body,No Itrative and doStartTag, doEndTag, release

Evaluation

Body, Itrative Evaluation doStartTag, doAterTag, doEndTag, release

Body, Interaction doStartTag, doEndTag, release, doInitbody, doAfterBody

12. 简单的标签处理程序类

答:1) 必须实现Tag接口的doStartTag()和doEndTag()方法;

2) 因为不存在Body,doStartTag()方法必须返回SKIP_BODY;

3) 如其余页面要执行,doEndTag()方法返回EVAL_PAGE, 否则返回SKIP_PAGE;

4) 对于每一个标签属性,你必须在标签处理程序类里定义一个特性以及get和set方法以一致于JavaBeans体系惯例

13. 带Body的自定义标签

答:1) 必须实现Tag接口的doStartTag()和doEndTag()方法;

2) 可以实现IterationTag接口的doAfterBody()方法;

3) 可以实现BodyTag接口的doInitBody和setBodyContent方法;

4) doStartTag方法可以返回SKIP_BODY、EVAL_BODY_INCLUDE、或者EVAL_BODY_BUFFERED(当你想使用BodyContent);

5) doEndTag方法可以返回SKIP_PAGE或EVAL_PAGE;

6) doAfterBody方法可以返回EVAL_BODY_AGAIN, SKIP_BODY;

14. 定义脚本变量的标签(迭代的标签库)

答:1) 定义脚本标签的二个步骤:

a. 在标记库描述符(TLD)文件中列明脚本变量;

b. 定义标签扩展信息类(TEI)并且在TLD文件中包括这个类元素(tei-class);

2) 变量必须在标签处理程序类中使用pageContext.setAttribute()方法设置;

3) 标签扩展信息类(TEI)必须继承TagExtraInfo以及覆盖getVariableInfo()方法;

4) 变量的范围可以是AT_BEGIN, NESTED, AT_END(标签扩展信息类(TEI)的VariableInfo中定义)之一;

15. 脚本变量的有效性

答:变量 | 有效性

---------------------------------------

NESTED | 标签中的参数在starttag到endtag之间是有效的

AT_BEGIN | 标签中的参数在标签的开始到JSP页面结束是有效的

AT_END | 标签中的参数在标签的结束到JSP页面结束是有效的

2004-10-10 星期四 晴

16. Tag接口的方法

答:interface javax.servlet.jsp.tagext.Tag

------------------------------------------------------

+EVAL_BODY_INCLUDE:int

+EVAL_PAGE:int

+SKIP_BODY:int

+SKIP_PAGE:int

------------------------------------------------------

+release():void

+getParent():javax.servlet.jsp.tagext.Tag

+setParent(javax.servlet.jsp.tagext.Tag):void

+doEndTag():int

+doStartTag():int

+setPageContext(javax.servlet.jsp.PageContext):void

17. Tag的生命周期

答:1) setPageContext(javax.servlet.jsp.PageContext):void

2) setParent(javax.servlet.jsp.tagext.Tag):void

3) //setAttribute:void

4) doStartTag():int

5) doEndTag():int

6) release():void

18. BodyTag和Tag接口的关系

答:interface javax.servlet.jsp.tagext.BodyTag --> interface javax.servlet.jsp.tagext.Tag

------------------------------------------

+EVAL_BODY_AGAIN:int

------------------------------------------

+doInitBody():void

+setBodyContent(javax.servlet.jsp.tagext.BodyContext):void

+doAfterBody():int

19. BodyTag的处理过程

答:1) setPageContext(javax.servlet.jsp.PageContext):void

2) setParent(javax.servlet.jsp.tagext.Tag):void

3) //setParent()

4) doStartTag():int

5) setBodyContent(javax.servlet.jsp.tagext.BodyContent):void

6) doInitBody():void

7) doAfterBody():int

doEndTag():int

9) release():void

20. SimpleTag接口的方法

答:javax.servlet.jsp.tagext.SimpleTag

------------------------------------------

+doTag():void

+getParent():JspTag

+setJspBody(JspFragment jspBody):void

+setJspContext(JspContext pc):void

+setParent(JspTag parent):void

21. SimpleTage接口的生命周期

答:1) new:

每次遇到标签,容器构造一个SimpleTag的实例,这个构造方法没有参数。和红典的标签一样,SimpleTag不能缓冲,故不能重用,每次都需要构造新的实例。

2) setJspContext()、setParent(): 只有这个标签在另一个标签之内时,才调用setParent()方法;

3) 设置属性:调用每个属性的setter方法;

4) setJspBody();

5) doTag(): 所有标签的逻辑、迭代和Body计算,都在这个方法中;

6) return
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: