既然明白了 Web 服务器是如何处理 JSP 页面请求的,那么让我们研究一下如何实现定制 JSP 标记。注:JSP 标记既来自标准库(如 Java Standard Template Library,JSTL),也来自您自己编写的库(也称为定制标记)。通常,定制标记处理特殊的问题领域。对本文而言,我们在处理如何管理图像。目前,Java 2 Extended Edition(J2EE)V1.2 和 V1.3 使用 JSP 规范 V1.2。在写作本文的时候,Sun 已经发布了 JSP 规范 V2.0。这个新规范并未对实现定制标记的方法进行重大更改。
通过 taglib 伪指令,可以将标准和定制标记库导入 JSP 页面,如下所示:
<%@ taglib uri='imagesizer.tld' prefix='util' %>
这个伪指令指定了标记库描述符文件的位置,这里指定的是 imagesizer.tld,还指定了在页面中使用它时的前缀,这里指定的是 util。如前面的标记示例所示,将标记与其前缀及其名称一起使用:
<util:imagesizer src="images/LazyDog.jpg"/>
标记库描述符告诉 Web 容器哪些标记是可用的,以及它们如何发挥作用。清单 1 显示了这样一个示例。文件使用了 XML 格式,并且易于读取,而应用程序开发平台 — 如 IBM WebSphere Studio Application Developer(Application Developer)可以帮助您填充字段,并且验证文件。最重要的信息是 tag 元素:它定义了定制 JSP 标记的名称和实现标记的 Java 类。它还显示了标记接受的任何属性和主体内容。
清单 1. 标记库描述符(Tag Library Descriptor,TLD)摘录
<taglib > <tlibversion> 1.0 </tlibversion> <jspversion> 1.1 </jspversion> <tag> <name>imagesizer</name> <tagclass>tags.ImageSizerTag</tagclass> <bodycontent>empty</bodycontent> <attribute> <name>src</name> <required>required</required> </attribute> <attribute> <name>alt</name> </attribute> <attribute> <name>quality</name> </attribute> </tag> </taglib>
文章整理:西部数码--专业提供域名注册、虚拟主机服务
在这个示例中,tag 有三个属性,其中只有 src 属性是必需的。可选的 alt 属性模拟 HTML 的 img alt 属性。作为练习,您可以扩展该 JSP 标记以包含其它可选的 img 属性。(大约有 12 种这些属性。)最后,实现提供了一个可选的 quality 属性,以使页面编写人员可以控制已重新调整大小的图像的颗粒度和大小。
编写定制 JSP 标记的下一步是实现标记的 Java 代码。在本文中,标记 imagesizer 是在 tags.ImageSizerTag Java 类中实现的。大多数 J2EE 定制标记支持都位于 javax.Servlet.jsp.tagext 包中。imagesizer 类继承了标准的 TagSupport,后者实现不带主体的标记。TagSupport 的子代类是 BodyTagSupport,它也实现标记,并且带有主体。这两个类际迪至?Tag 接口,其中,当第一次读取标记以及当 Web 容器完全读取标记后再次读取标记时,会调用 doStartTag 和 doEndTag 方法。ImageSizer 标记只实现了 doEndTag,因为一旦所有属性信息都可用时,它需要起作用。
在 TagSupport 类中,PageContext 类提供了对有关 JSP 页面的重要信息的访问。例如,PageContext 提供了对 HttpRequest 和 HttpResponse 对象的访问。这些对象对于读取表单值和写响应是至关重要的。如果您希望跟踪用户的首选项,并且将表单值从一个页面传递到另一个页面,该请求还提供了对 HttpSession 的访问。PageContext 还提供了对 ServletContext 的访问,后者有助于您查找 servlet 的路径、名称和其它信息。在 ImageSizer 代码中(如清单 2 所示),有许多对 PageContext 对象及其提供信息的引用。图 3 显示了这些类的关系。就象任何标准类图一样,实心框代表类,而虚线框代表接口。用从派生的类或接口到其父类或接口的一条线来表示继承。
清单 2. ImageSizerTag doEndTag 实现
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




