JSP标签库介绍
|
|
|
作者:Casey Kochmer 翻译:廖铮
来源:InterNet 加入时间:2005-1-8 |
<!—还不太了解Java Servlet Page的强大功能?那好,不妨跟我一道看看JSP最令人瞩目的强大工具之一:JSP标签库 。-->
笔者使用JSP和ASP从事编程工作也有很长一段时间了,我越来越觉得,在这两种服务器端编程解决方案中,JSP的功能要比ASP强大得多。我为什么要把JSP选作自己主要的服务器端应用程序编写工具呢?当然,JSP迷人的特性和功能不少,但标签库是让我做出这一决定的最重要诱因之一。
为什么这样说呢?原因有两个:维护和开发速度。服务器端脚本语言其实就像是开发Internet的熔炉。在一个服务器页面上,你可以很方便地混合各种不同的脚本方法和对象。这种页面简直就是建筑Web的混凝土。正是这种“材料”的混合给予了服务器端脚本强大的信息处理能力。它可以让服务器端程序设计人员开发出动态的、灵活的Web页面。但是,另一方面,脚本的自由混合却很难得到维护,特别是随着项目规模的不断增长而显得尤其严重。我们将不得不让有经验的程序员来建立和维护最终产品,结果让这些程序员成为了一般的Web设计人员。服务器端应用程序在最终的图形设计和实现这两方面上就弱化了。更糟糕的是,因为这些页面对代码而言变得很复杂,开发速度也就相应降低了。最后,许多中等规模或者大型的服务器端Web应用程序很晚才得以推出而且成本也无法控制。此外,在实现了这些应用程序之后,许多销售商还必须去寻找合格的程序员来维护这种乱得如同一盆意大利面条似的代码。
我们谁都不愿意看到这样的结果,所以,为了克服这个问题,ASP引进了COM对象技术,而JSP则提供了J2EE作为对策。这些解决方案都是建立在集中的、可重用代码库的机制之上。但是,他们使用起来可就太难了,耗费的时间也很多。还有,这些解决方案并没有减少建立混乱代码的诱惑,结果,我们只能组织起大型的、内部结构良好的开发团队来使用这些技术。这就意味着,尽管我们目前都已经有了建立大型项目的以上方法,中等规模的项目却没有被这些技术所光顾。
可现实是,中等规模的项目才是Web应用程序中的主体部分。所以,许多项目不得不面对其开发和维护环境不能满足其需要的局面。
幸好,JSP为我们提供了解决这一问题的最佳方案,标签库(Tag libraries)提供了建立可重用代码块的简单方式。但是和COM和J2EE不同的是,你不需要掌握任何额外的技能就可以建立标签库:如果你会编写JSP页面,你就会建立标签库。最后,标签库还改进了Web应用程序的维护性。这种对维护性的改进表现在:轻易地在JSP页面上就实现了基于XML的可定制接口。结果可想而知,Web设计人员可以建立JSP Web应用程序而无需知道JSP是怎么回事。这样一来,Web开发就成为一项非常富有效率的团队开发任务了。JSP程序员可以建立定制的标签和后端代码模块,而Web设计人员则可以使用定制标签并且全力关注于Web设计本身。标签库解决了代码混乱的问题,而且做得干净漂亮(事实上,XML才是解决这些问题的本质所在,但是标签库还是起到了相当关键的作用)。
什么是标签库?
JSP标签库(也被称作定制标签)是一种通过JavaBean生成基于XML的脚本的方法 。从概念上将,标签就是很简单而且可重用的代码结构。比方说,在我们最新发布的JSPKit(在JSP Insider内)中,我们就使用XML标签实现了对XML文档的轻松访问。请看以下的清单A。
清单A:执行XML/XSL 转换的示例标签及其所在的HTML页面\r
<%@ taglib uri="http://www.jspinsider.com/jspkit/JAXP" prefix="JAXP"%> <JAXP:TransformerTag> <JAXP:XMLFile>c:/xml/example.xml</JAXP:XMLFile> <JAXP:XSLFile>c:/xml/example.xsl</JAXP:XSLFile> </JAXP:TransformerTag>
以上的示例使用了简单的标签来访问处在幕后的更强大代码。在以上的事例中首先装载了一个XML文件,然后应用了一个XSL文件来创建一个将被发送到客户端的结果——这一切不过仅仅只是用了一个很简单的标签。
定制标签使得JSP项目中很容易创建重用的开放源代码模块。而你的全部需要不过就是标签库及其文档。标签库的重要特性如下所示:
易于安装在多个项目上 标签很容易从一个JSP项目迁移到其他项目。一旦建立了一个标签库,你只需要把这个个标签库包装成一个JAR文件就可以在其他JSP项目中重新使用了。不能重用的是你作为程序员在建立标签时所加进标签的内容。因为标签可以重新使用,所以标签库可以轻松地用于你自己的项目。目前,最好的标签资源可以在JSPTags.com这个站点找到。. 扩展JSP 标签库可以具备JSP规范(JSP 1.2)中的任何特性和功能。这也意味着你拥有了无限的能力可以扩展和增加JSP的强大功能却无需等待新版本JSP的发布。所以说,你完全可以取消页面上的JSP include调用了——只需用include标签建立自己的规范就可以了。 易于维护 标签库使得JSP Web应用程序变得很容易维护。主要有以下几个原因:
标签对任何人而言都很容易使用、易于理解。 你的所有逻辑都驻留在处于中心的标签处理器和JavaBean内。这样一来,如果你不得不更新你的代码,你只需要处理这些中心文件而无需修正使用这些代码的其他页面。 如果你需要增加新的功能,你不必改变任何已经存在的页面。你可以把额外的属性包含到你的标签内从而引进新的行为同时保留以前的属性,实现旧页面的正常运行。
比方说,你可能有如下的一个标签,它让你的文本都显示蓝色:
<BlueText>My Text</BlueText>
但是随着项目的进行,你又想让蓝色变暗。于是你保留自己的标签但是为其增加了一个新的属性:shade
<BlueText shade="teal">My Text</BlueText>
所有的老标签继续显示蓝色,但现在你可以使用同一标签来产生变暗的蓝色文本了。
标签提升了代码的重用性。那些经过多次测试和使用的代码肯定具有更少的bug。所以,使用定制标签的JSP页面也同样具有更少的缺陷,维护起来自然方便多了。 更快的开发速度 标签库是一种重用代码的好办法。我们知道,服务器端语言标准的重用代码方式是使用模版。标签库和模版库这种方式相比则好得多。采用模版库,你就需要针对每个项目修改模版或者建立生硬的接口。标签库则没有这些限制,而其所具有的面向对象特性则让标签库不仅用法灵活而且扩展能力极为强大。还有,因为你重用代码,结果在项目开发上花费的时间就大大降低了,而更多的时间则可以用来设计自己的Web应用程序。标签库的简单接口使得这些代码用法简单、易于调试。 虽然标签库用起来特别简单,但是,建立其内部支持层次可比建立简单的JavaBean复杂多了。这种复杂性的主要原因在于标签库包含了好几个部分。而你所需要掌握的技能不过是理解、熟悉Java和JSP。
定制标签内幕 一个简单的定制标签包括了以下几个要素:
1、JavaBean:为了充分利用Java的面向对象特性,重用代码应当放置在独立的代码容器内 。这些JavaBean可不是标签库的一部分。他们是标签库用来执行所分配任务的基础代码模块。
2、标签处理器:这是标签库的真正核心。标签处理器(tag handler)引用它所需要的任何外部材料(JavaBean)并且负责访问JSP页面的信息(PageContext对象)。而JSP页面则把页面上设置的标签属性都传递给标签处理器,JSP页面上的标签标示的内容也是这样处理的。当标签处理器完成其处理过程,它就会把处理后的输出结果回送给JSP页面做进一步处理。
3、标签库描述符(TLD文件):这是一种很简单的XML文件,TLD文件描述和说明了属性、信息和标签处理器文件位置等信息。JSP 容器使用这一文件来映射被调用标签库的位置和用法。
4、Web站点的web.xml文件:其实这就是你的Web站点上的初始化文件。在这个文件内你可以定义Web应用程序中使用的定制标签,还可以定义用来描述每个定制标签的TLD文件。
5、发布文件(WAR或JAR文件):如果你打算重用定制标签,那么你肯定需要想个简便的办法把标签从一个项目迁移到其他项目中去。把标签库打包成一个JAR文件就是这种既方便又高效的标签库发布方式。我们在以上的事例中没有建立JAR文件,但是如果你打算更进一步地了解JAR文件的细节,你不妨阅读“JSP WAR文件简介”。
6、JSP页面上的标签库声明:仅需使用标签库标示符即可方便地声明页面上存在的标签。标签库在页面上声明之后,你就可以随意使用它们了。
看起来会让你忙乎一阵子,实际上没那么糟糕。刚开始用的时候当然会有点棘手。其实真正关键的并不是编码而是把以上各个部分正确地组织起来。这种层次性的结构是很重要的,也正是如此才可以说标签库及灵活又易于使用。更重要的事,这些层次可以让整个建立标签库的过程都能通过JSP IDE自动完成。今后的JSP IDE更可以自动完成创建定制标签的大部分工作,而你自己则只需要负责建立代码和标签处理器。
(注意:一个标签处理器只定义一个定制标签;而一个标签库则是很多个标签处理器的集合,它们执行同一任务。)
建立你的第一个标签 以下的进阶指南将介绍如何把JSP扩展为具有自己的HTML编码功能 。这种编码方法用<和 >符号代替HTML代码,而且很容易经过扩展以执行其他编码操作。整个示例虽然简单,但它确实向你说明了定制标签的最基础要素。
创建JavaBean 代码中的任何可重用部分都应该包含在JavaBean内。这一点是很重要的。这样你就可以在其他项目中重用这些代码了。由于任何放置在标签处理器内的代码都不会在标签以外被重用,所以代码的重用部分要与之分离。在我们的示例中,HTML编码逻辑很一般,所以我们直接把他们放在了JavaBean内,请参看清单B。
创建标签处理器\r 标签处理器使用了清单C的代码。
这些代码很简单,其中包括:
读取包含在打开和关闭标签内的文本。 调用HTML编码函数。 将结果返回给JSP页面。 创建标签描述符\r 我们需要描述自己的标签以便系统知道他们到底具有什么含义。TLD文件通常就以标签处理器命名并被存放在"/WEB-INF/"目录之下。该文件的文件扩展名是.tld。请参看清单D。
更新Web XML文件 现在你就可以告诉JSP容器使用标签库了。为此你需要修改web.xml文件:增加一个taglib项以注册标签库并为标签分配一个URI。URI是Web站点上唯一应用于这一特定标签的索引。由于标签今后还可能用在不同的Web站点上,所以你最好采用完整的URL和/或者包名字(package name)来保证这一唯一性。示例代码请参看清单E。
使用新标签 定制标签现在就可以用在你的JSP页面上了 。你只需要在页面上使用taglib指示符声明所要采用的标签即可。标签通过其唯一的URI被索引,然后被分配给一个前缀(prefix)。这一前缀并没有什么特别的意义,只要它不和指示符内的其他名称不冲突就可以了。请参看以下的清单F和G。
清单F:在JSP页面上使用HTML编码标签
<%@ taglib uri="HTMLEncode" prefix="Examples" %> <html> <head></head> <body> <pre> <Examples:HTMLEncode> < Hello , Simple sample > </Examples:HTMLEncode> </pre> </body> </html>
清单G:代码示例输出\r
< Hello , Simple sample > which displays as: < Hello , Simple sample >
实际上,我就用这个标签对页面上的所有代码示例进行了编码。你可以注意到定制标签是在服务器上进行处理的。这就是说,你不会在输出页面上看到定制标签。
正如你所看到的那样,建立标签并非难事。最麻烦的是学习标签处理器的整个细节。我们不过是触及了皮毛。由于这一过程需要采取的步骤很多,所以刚入门的JSP程序员可能在建立标签的时候会觉得很困惑。
小结\r 标签库是JSP尚未得到广泛应用的重要特性之一 。它所提供的自己定制新标签等功能和以往的Web设计方式还是很不同的,适应起来自然有一段时间。不过,越来越多的开发人员已经在逐渐使用标签库完成自己的Web设计任务。到2001年末,估计标签库就会成为许多JSP项目中最常见的特性之一。
标签库的优点非本文所能全面阐述。标签库还具有其他很多优点。标签库促使JSP开发进入了前所未有的新天地。对JSP开发人员来说这确实是一种很令人振奋的新技术,从此我们就获得了建立任何类型Web应用程序的自由。标签库让JSP变成了最丰富、最具动态开发能力的Web编程环境。
作者简介:
Casey Kochmer 是Amberjack Software公司的总裁,该公司是JSP Insider的母公司。作为一位高级web应用程序设计师,Casey利用自己12年专业编程经验为JSP Kit做出了重要贡献。他还是JSP Buzz和其他许多站点文章的作者。闲暇之时,Casey喜欢徒步漫游华盛顿州的奥林匹克山。
[文章录入员:tonny] |
|
|
|
|