欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

自定义JSP标签(tag)浅议

程序员文章站 2022-03-10 15:34:07
因为版本变化的关系,这篇文章未必有普适性 (标准化越来越近了):namespace prefix = o ns = "urn:schemas-microsoft-com:...

因为版本变化的关系,这篇文章未必有普适性

 (标准化越来越近了):namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

看这篇文章之前应该先看sun的文章并最好动手实践之

https://java.sun.com/developer/technicalarticles/xml(标准化越来越近了)/webappdev3/

并且知道j2ee api文档的位置在

https://java.sun.com/j2ee/sdk_1.3/techdocs/api/index.html

 

自定义tag其实并不是一件很困难的事情,就是猛一接触,不知道该从何下手。推荐先看看sun公司的一篇文章,看完了,大致就有了一个印象。在这里无意去翻译这篇简单的文章,而是从这篇文章展开去说说。要说明的一点就是sun的文档中代码都是完全可用的,但是因为排版问题,代码的分行有些地方不正确,直接copy的时候要仔细整理一下代码,否则有可能会通不过编译,部署的时候会给你一大堆异常。

 

自定义tag使用的包是javax.servlet.(sun企业级应用的首选).tagext,如果编译有问题,可以去tomcat(一个很好用的jsp运行平台)commonlib文件夹下面找jsp(sun企业级应用的首选)-api.jar引用上就可以了。

 

这个包里面的类和接口,基本上我们主要关心的就是以“tag”结尾的那几个,接口tagbodytag,类tagsupportbodytagsupport,还有一个接口iterationtag,不过一般不会用到。其他的我们都可以看作是辅助类,帮助获取信息什么的。我们可以仔细看看j2eeapi文档里面关于这个包的类说明。

 

上面类名里面的body的意思可能一下子比较难理解。tag指的就是像<tagname></tagname>这样的东西,body就是夹在tag中间的东西,比如<tagname>i am body</tagname>。这么一来,这个tag也就成了bodytag,因为它可以带body。所以设计tag也要事先考虑好带不带body,不过现实考虑,好像没有bodytag应该也比较少吧。

 

tag接口是这些类里面的根,所以先看看里面有什么。api文档里面那个lifecycle图画的很粗糙,不过也能大致看清楚。我们也不过分纠缠细节,大致关心的就是dostarttag() doendtag() 这一段。每当你写的tagjsp(sun企业级应用的首选)页面里面要被解释的时候,服务器就自动调用你的类里面的dostarttag()函数来完成你定义的逻辑,当解析完标签后调用doendtag()。实现tag接口来定制自己的tag无疑是最灵活的。但是,难度也比较大,我们定义自己的tag的时候完全不必要搞得这么有内涵。

bodytagtag类也差别不大,bodytag继承自tagiterationtag,因为涉及了body的原因,逻辑要复杂一些。api文档里面的lifecycle图也比较清晰。有必要好好看看。里面主要说明的就是函数调用的顺序。但是在具体应用中,不一定都要按部就班的走完这整个lifecycle,如果要想控制这些调用的路线。就要借用函数的返回值了,在上一个函数返回特定的值(都是已经定义好的常数)就可以改变服务器调用下一个函数的行为来完成你自己的逻辑。看到这里我也不禁佩服这些写类库的人,能想出这么个办法来解决问题。

 

为了方便我们开发,又提供了两个带“support”的类来“支持”我们,方便我们开发。一般情况下我们只要继承这两个类中的一个,而且我觉得bodytagsupport也更常用一些好像。要说明的一点就是两个support类中tagsupportbodytagsupport的父类。类中的getid()setid()这两个函数名并不是死的,这两个“id”应该在你的程序中替换成你的标签名,比如你的tag名字是tagname,就是<tagname>,那么函数名就变成了gettagname ()gettagname ()。这样的搞法原来在其他地方也有领教。(注意tagname第一个字母在函数名中大写)变化的名字有服务器自己去处理,无需者自己操心。原来函数名都是可以变化的,一定要注意。

 

说到这里可以结合sun的文档的代码看看,就明白了。

 

至于部署和.tlb文件的格式,sun文档上也都有。不再赘述。最后附上整理的返回值列表,这个我认为比较重要。