因为版本变化的关系,这篇文章未必有普适性
看这篇文章之前应该先看Sun的文章并最好动手实践之
http://java.sun.com/developer/technicalArticles/xml/WebAppDev3/
并且知道J2EE API文档的位置在
http://java.sun.com/j2ee/sdk_1.3/techdocs/api/index.html
自定义Tag其实并不是一件很困难的事情,就是猛一接触,不知道该从何下手。推荐先看看Sun公司的一篇文章,看完了,大致就有了一个印象。在这里无意去翻译这篇简单的文章,而是从这篇文章展开去说说。要说明的一点就是sun的文档中代码都是完全可用的,但是因为排版问题,代码的分行有些地方不正确,直接copy的时候要仔细整理一下代码,否则有可能会通不过编译,部署的时候会给你一大堆异常。
自定义Tag使用的包是javax.servlet.jsp.tagext,如果编译有问题,可以去Tomcat的\common\lib文件夹下面找jsp-api.jar引用上就可以了。
这个包里面的类和接口,基本上我们主要关心的就是以“Tag”结尾的那几个,接口Tag和BodyTag,类TagSupport和BodyTagSupport,还有一个接口IterationTag,不过一般不会用到。其他的我们都可以看作是辅助类,帮助获取信息什么的。我们可以仔细看看J2EE的API文档里面关于这个包的类说明。
上面类名里面的Body的意思可能一下子比较难理解。tag指的就是像<tagname></tagname>这样的东西,Body就是夹在tag中间的东西,比如<tagname>I am Body</tagname>。这么一来,这个tag也就成了BodyTag,因为它可以带Body。所以设计tag也要事先考虑好带不带Body,不过现实考虑,好像没有Body的tag应该也比较少吧。
Tag接口是这些类里面的根,所以先看看里面有什么。API文档里面那个Lifecycle图画的很粗糙,不过也能大致看清楚。我们也不过分纠缠细节,大致关心的就是doStartTag() 和doEndTag() 这一段。每当你写的tag在Jsp页面里面要被解释的时候,服务器就自动调用你的类里面的doStartTag()函数来完成你定义的逻辑,当解析完标签后调用doEndTag()。实现Tag接口来定制自己的tag无疑是最灵活的。但是,难度也比较大,我们定义自己的tag的时候完全不必要搞得这么有内涵。
BodyTag跟Tag类也差别不大,BodyTag继承自Tag和IterationTag,因为涉及了Body的原因,逻辑要复杂一些。API文档里面的Lifecycle图也比较清晰。有必要好好看看。里面主要说明的就是函数调用的顺序。但是在具体应用中,不一定都要按部就班的走完这整个Lifecycle,如果要想控制这些调用的路线。就要借用函数的返回值了,在上一个函数返回特定的值(都是已经定义好的常数)就可以改变服务器调用下一个函数的行为来完成你自己的逻辑。看到这里我也不禁佩服这些写类库的人,能想出这么个办法来解决问题。
为了方便我们开发,又提供了两个带“Support”的类来“支持”我们,方便我们开发。一般情况下我们只要继承这两个类中的一个,而且我觉得BodyTagSupport也更常用一些好像。要说明的一点就是两个Support类中TagSupport是BodyTagSupport的父类。类中的getId()和setId()这两个函数名并不是死的,这两个“Id”应该在你的程序中替换成你的标签名,比如你的tag名字是tagname,就是<tagname>,那么函数名就变成了getTagname ()和getTagname ()。这样的搞法原来在其他地方也有领教。(注意tagname第一个字母在函数名中大写)变化的名字有服务器自己去处理,无需编程者自己操心。原来函数名都是可以变化的,一定要注意。
说到这里可以结合Sun的文档的代码看看,就明白了。
至于部署和.tlb文件的格式,Sun文档上也都有。不再赘述。最后附上整理的返回值列表,这个我认为比较重要。
英文Evaluate大致是“评估,求值”的意思,这里我们可以理解为服务器“读取,读入,处理”的意思,翻译的时候我就随语境变通一下,下面加了下划线,如果有不当,请指正。
EVAL_BODY_INCLUDE:把Body读入存在的输出流中,doStartTag()函数可用
EVAL_PAGE:继续处理页面,doEndTag()函数可用
SKIP_BODY:忽略对Body的处理,doStartTag()和doAfterBody()函数可用
SKIP_PAGE:忽略对余下页面的处理,doEndTag()函数可用
EVAL_BODY_TAG:已经废止,由EVAL_BODY_BUFFERED取代
EVAL_BODY_BUFFERED:申请缓冲区,由setBodyContent()函数得到的BodyContent对象来处理tag的body,如果类实现了BodyTag,那么doStartTag()可用,否则非法
EVAL_BODY_AGAIN:请求继续处理body,返回自doAfterBody(),这个返回值在你制作循环tag的时候是很有用的。我观察了一下JSTL的源代码,想看看它的ForEach怎么编制的,但是一看里面逻辑异常复杂,短时间不能看出头绪,所以在这里也不敢妄言,如果哪位仁兄有研究,还请不吝赐教。
:包里面的其他类还没有研究,如果有研究再另行写个文档。
分享到:
相关推荐
下面我们将深入探讨自定义JSP标签的原理、创建过程及其应用。 一、JSP标签基础知识 JSP标签分为两种类型:标准动作标签(Standard Actions)和自定义标签(Custom Tags)。标准动作标签如`<jsp:include>`、`<jsp:...
本文将深入探讨如何掌握自定义JSP标签,以及其在实际开发中的应用。 一、JSP自定义标签概述 1. JSP自定义标签的作用:自定义标签提供了一种封装业务逻辑和视图的方式,使得代码结构更加清晰,降低了HTML和Java代码...
自定义JSP标签是Java服务器页面(JSP)技术中的一种高级特性,它允许开发者创建自己的可重用组件,以增强网页的可维护性和代码复用性。在JSP中,自定义标签与HTML标签类似,但它们可以执行更复杂的业务逻辑,提供了...
下面我们将深入探讨如何开发自定义JSP标签。 首先,我们需要理解自定义JSP标签的基本结构。自定义标签通常由三部分组成:标签库描述符文件(TLD),标签处理类(Tag Handler Class)以及标签库使用者在JSP页面中...
自定义JSP标签是JSP的一种扩展机制,它允许开发者定义自己的标签库,以提高代码的可读性和可重用性。本篇文章将深入探讨如何掌握自定义JSP标签。 一、自定义JSP标签的优势 1. 提高可读性:自定义标签可以提供更加...
而自定义JSP标签则是JSP的一个强大特性,它允许开发者创建自己的标签库,以更加直观、易于理解的方式组织代码,提升开发效率。本篇将深入探讨如何掌握自定义JSP标签,并解释其在网络编程中的重要性。 首先,了解JSP...
自定义JSP标签通常由三部分组成:标签库描述符文件(TLD)、标签处理类(Tag Handler)和标签库的使用者(JSP页面)。 1. 标签库描述符文件(TLD) TLD文件以XML格式定义了标签库,包括标签的名字、属性、行为等...
本文将深入探讨自定义JSP标签的创建与使用,以及它如何实现无刷新功能。 首先,理解JSP自定义标签的概念。自定义标签是开发者根据需求创建的,可以看作是预定义的HTML元素,它们扩展了JSP的功能,提供了更加灵活的...
### jsp自定义嵌套标签:定义与使用详解 在JavaServer Pages(JSP)技术中,自定义标签是扩展其功能的一种强大手段。而自定义嵌套标签,则是在此基础上进一步提升灵活性和重用性的机制。本文将深入探讨自定义嵌套...
在JSP页面中,你可以像使用标准JSP标签一样使用自定义分页标签。例如: ```jsp ${totalRecords}" itemsPerPage="10" /> ``` 三、分页逻辑实现 1. 计算总页数 根据总条目数和每页显示的条目数,可以计算出总...
**JSP页面自定义标签(Tag)详解** 在Java服务器页面(JSP)技术中,自定义标签(Custom Tag)是提升代码复用性和可维护性的重要手段。它允许开发者创建自己的HTML标签来封装复杂的Java逻辑,使得页面更加清晰、易...
然而,有时预定义的标签并不能满足我们所有的需求,这时就需要自定义JSP标签来扩展功能。本教程将深入讲解如何创建和使用自定义JSP标签,以实现更加灵活的HTML渲染和业务逻辑处理。 1. 自定义标签的概念: 自定义...