`

JSP 自定义标签 taglib TagSupport BodyTagSupport

阅读更多
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


分享到:
评论

相关推荐

    创建JSP自定义标签.doc

    一个自定义标签其实是一个Java类,这个类需要继承自`TagSupport`或`BodyTagSupport`。这两个类由JSP容器提供,它们包含处理JSP页面与自定义标签之间交互所需的方法。选择继承哪个基类取决于标签是否需要处理内部内容...

    JSP自定义标签 例子

    1. **编写标签处理类**:这个类实现了`javax.servlet.jsp.tagext.Tag`接口或者其子接口,如`TagSupport`或`BodyTagSupport`。这些类提供了处理标签生命周期的方法,如`doStartTag()`和`doEndTag()`。 2. **定义TLD...

    JSP自定义标签.ppt

    例如,在`hello.tld`文件中定义一个名为`mytag`的自定义标签,然后在`web.xml`中配置标签库的URI和位置,最后在JSP页面中通过`&lt;%@ taglib&gt;`指令导入并使用自定义标签。 总的来说,JSP自定义标签是提高JSP应用程序可...

    jsp自定义标签开发手册

    自定义标签通过实现JSP Tag Library(标签库)接口或继承自`javax.servlet.jsp.tagext.TagSupport`类来创建。 ### 二、JSP标签库描述文件(TLD) 在开发自定义标签之前,我们需要定义一个Tag Library Descriptor ...

    在jsp中使用自定义taglib

    在JavaServer Pages (JSP) 中,自定义Taglib是一种扩展JSP功能的方式,它允许开发者创建可重用的自定义标签,以提高代码的可读性和可维护性。自定义Taglib通常由一系列标签(Tag)组成,这些标签对应于特定的Java类...

    JSP自定义标签

    创建自定义标签的第一步是编写一个Java类,该类需要继承`javax.servlet.jsp.tagext.TagSupport`或`javax.servlet.jsp.tagext.BodyTagSupport`。这两个基类提供了与JSP页面交互所需的基本方法。 **示例代码:** ```...

    jsp自定义标签库问答集锦.

    2. **引入标签库**:在 JSP 页面中引入自定义标签库,通常使用 `taglib` 指令来完成。 3. **执行 Web 应用**:在 Web 应用程序中执行自定义标签,使其能够发挥作用。 #### 四、引入自定义标签库 1. **使用 taglib ...

    jsp自定义标签介绍与操作实例.doc

    - **编写标签处理程序**:创建Java类,继承`TagSupport`或`BodyTagSupport`,并实现相应接口的方法。处理程序类需要定义处理标签逻辑的方法。 - **编写TLD文件**:在TLD文件中声明自定义标签,定义标签的名称、...

    JSP自定义标签开发使用

    - **辅助类**:如`TagSupport`和`BodyTagSupport`,提供了默认实现,方便开发者快速构建自定义标签。 4. **标签库描述文件(TLD)** - TLD文件是自定义标签与Java类之间的桥梁,它声明了每个标签的名称、类、属性...

    JSP 自定义标签(清华IT)PPT (适用于有一定编程基础的人员)

    1. **编写标签处理器类**:这个类需要继承自`javax.servlet.jsp.tagext.TagSupport`或`javax.servlet.jsp.tagext.BodyTagSupport`,并覆盖其中的特定方法,比如`doStartTag()`和`doEndTag()`,以实现自定义标签的...

    jsp自定义标签介绍与操作实例参考.pdf

    在JSP页面中使用自定义标签,需要在Web部署描述符(web.xml)中声明标签库,并通过`&lt;taglib&gt;`指令将其导入到JSP页面。当JSP容器遇到自定义标签时,它会查找对应的TLD文件以找到相应的标签处理程序。在运行时,生成的...

    jsp 自定义标签

    4. **在JSP文件中引入标签库并插入标签**:使用`&lt;%@ taglib %&gt;`指令在JSP页面中引入自定义标签库,然后像使用内置标签一样使用自定义标签,例如`&lt;mm:hello/&gt;`。 #### 四、JSP Tag API与TagSupport类 当Servlet容器...

    利用BodyTagSupport创建带标签体的自定义标签

    它是`TagSupport`类的一个子类,`TagSupport`是所有JSP自定义标签的基础。`BodyTagSupport`提供了处理标签体的能力,这意味着它可以包含其他元素或文本,就像HTML中的`&lt;div&gt;`、`&lt;p&gt;`等标签一样。 创建一个自定义...

    JSP自定义标签基础知识学习

    一旦标签处理类和描述文件创建完成,就可以在JSP页面中通过taglib指令引入并使用自定义标签了。具体做法是在JSP页面顶部添加taglib指令,指定自定义标签库的位置和前缀。之后,就可以按照给定的前缀加上标签名的方式...

    JSP扩展——自定义标签

    在JavaServer Pages (JSP)技术中,自定义标签是一种扩展JSP功能的重要方式,它允许开发者创建可重用的代码块,以提高代码的可维护性和可读性。自定义标签通过标记库(Tag Library)和标记描述文件(TLD, Tag Library...

    Taglib自定义标签

    【Taglib自定义标签】是JavaServer Pages (JSP)技术中的一种机制,允许开发者创建可重用的自定义标签库,以提高代码的可读性和可维护性。自定义标签能够封装复杂的业务逻辑,使得非Java程序员(如网页设计师)也能...

    自定义标签学习笔记

    3. **自定义标签在JSP页面编译时的行为**:当一个包含自定义标签的JSP页面被编译成Servlet时,自定义标签会被转换为一个Tag Handler对象。 4. **自定义标签的特点**: - **简化页面开发**:通过自定义标签可以...

    JSTL自定义标签实例解析

    `TagSupport`适用于无标签体的标签,而`BodyTagSupport`则用于包含标签体的标签。 - `setter`方法用于设置标签属性值,例如`doStartTag()`和`doEndTag()`会在标签开始和结束时被调用。 - `doStartTag()`和`...

Global site tag (gtag.js) - Google Analytics