1、JSP 标签库标准的 JSP 标记可以调用 JavaBeans 组件或者执行客户的请求,这大大降低了 JSP 开发的复杂度和维护量。JSP 技术也允许你自定义 taglib,其实换句话说,taglib 可以看成是对 JSP 标记的一种扩展,正如 xml 是对 html 的一种扩展一样。标准的 JSP 标记可以调用 JavaBeans 组件或者执行客户的请求,这大大降低了 JSP 开发的复杂度和维护量。JSP 技术也允许你自定义 taglib,其实换句话说,taglib 可以看成是对 JSP 标记的一种扩展,正如 xml 是对 html 的一种扩展一样。taglib 通常定义在 tag标签库中,
2、这种标签库存放着你自己定义的 tag 标签。简而言之,如果使用 taglib,那么你可以设计自己的 JSP 标记!一般来说,自定义 tag 标签主要用于操作隐藏对象、处理 html提交表单、访问数据库或其它企业级的服务,诸如邮件和目录操作等等。自定义 tag 标签的使用者一般都是那些对 java 编程语言非常精通,而且对数据访问和企业级服务访问都非常熟悉的程序员,对于 HTML 设计者来说,使得他可以不去关注那些较复杂的商业逻辑,而将精力放在网页设计上。同时,它也将库开发者和库使用者进行合理分工,自定义 tag 标签将那些重复工作进行封装,从而大大提高了生产力,而且可以使得 tag 库可用于不
3、同的项目中,完美地体现了软件复用的思想。在这篇文章中,我们主要讨论: 什么是自定义 tag 标签? 怎么使用 tag 标签?o 声明要使用的 tag 库o 找到与之对应的 tag 处理类o tag 标签的类型 自定义 tag 标签o tag 处理类o tag 库描述o tag 标签示例o 带属性的 tago 带 body 的 tago 定义了脚本变量的 tago 具有协作关系的 tag 自定义 tag 标签o 一个迭代 tag 的例子o 一个模板 tag 库o tag 处理类到底是怎样被调用的?什么是自定义的 tag?一个自定义的 tag 标签是用户定义的一种 JSP 标记。当一个含有自定义的
4、 tag 标签的 JSP 页面被 jsp 引擎编译成 servlet 时,tag标签被转化成了对一个称为 tag 处理类的对象进行的操作。于是当JSP 页面被 jsp 引擎转化为 servlet 后,实际上 tag 标签被转化成为了对 tag 处理类的操作。自定义 tag 标签有很多特色,诸如: 可以在 JSP 页面中自定义 tag 标签的属性 访问 JSP 页面中的所有对象 可以动态地修改页面输出 彼此这间可以相互通信。你可以先创建一个 JavaBeans 组件,然后在一个 tag 中调用此 JavaBeans 组件,同时可以在另一个tag 中调用它。 tag 允许相互嵌套,可以在一个 JS
5、P 页面中完成一些复杂的交互。使用 tag 标签本节主要描述怎样在 JSP 页面中使用 tag 标签,以及 tag 标签的不同类型。要使用 tag 标签,JSP 程序员必须做 2 件事: 声明此 tag 标签的 tag 库 实现此 tag 标签声明 tag 标签所在的 tag 库如果要使用 tag 标签,则应用 JSP 的 taglib 指示符来指定其tag 库(注意:taglib 要在在使用此 tag 标签之前声明)uri 属性定义了唯一的标签库描述( 以下简称 TLD),它可以是直接是 tld 文件名或一个独一无二的名字。prefix 是用来区别其它 TLD中和本 TLD 中有重名的 ta
6、g 的一种手段。TLD 必须以.tld 作为扩展名,并且存放在当前应用的 WEB-INF目录或其子目录下。你可以通过它的文件名直接引用它,也可以通过别的方式间接地引用它。以下 taglib 指示符直接引用一个 TLD:以下的 taglib 指示符通过一个逻辑名称间接地引用一个 TLD:如果是间接引用 TLD 的话,那你必须还要在 web.xml 中定义此逻辑名称与 tld 文件之间的映射,具体做法是在 web.xml 中加入一个名为 taglib 的元素:/tutorial-template/WEB-INF/tutorial-template.tld实现此 tag 标签为了实现 tag 标签,
7、你有 2 种方法来存放 tag 处理类。一、让tag 处理类以.class 的方式存放于当前应用的 WEB-INF/class 子目录下,二、如果 tag 处理类是以 JAR 包的形式存在的话,那可以放在当前应用的 WEB-INF/lib 目录下,如果 tag 处理类要在多个应用中共享,那么它就应放在 jsp 服务器上的 common/lib 目录下,对于tomcat 来说,就是 tomcat/common/lib 目录下。tag 标签类型自定义的 tag 标签遵循 XML 语法。它有一个开始标记和一个结束标记,有的还有 body(即文本节点):body一个不带 body 的 tag 标签如下
8、:简单的 tag 标签一个没有 body 和属性的 tag 标签如下:带属性的 tag 标签自定义标签可以有自己的属性。属性一般在开始标记中定义,语法为 attr=”value”。属性的作用相当于自定义标签的一个参数,它影响着 tag 处理类的行为。你可以在 TLD 中详细定义它。你可以用一个 String 常量给一个属性赋值,也可以通过表达式给它赋值,如。以 struts 为例,它的 logic:present 标签就是用的 String 常量来给属性赋值:而另一个标签 logic:iterate 是用表达式来给属性赋值:”id=”book” type=”database.BookDetai
9、ls”带 body 的 tag 标签一个自定义标签可以包含其它自定义标签、脚本变量、HTML标记或其它内容。在下述例子中,此 JSP 页面使用了 struts 的 logic:present 标签,如果些标签定义了 parameter=”Clear”的属性,则将清除购物车的内容,然后打印出一条信息:你选择了清除购物车!到底是用属性还是用 body 来传递信息?如上所述,我们既可以通过属性,也可以通过 body 来传递信息。但一般来说,比较简单的类型,如字符串或简单表达式最好采用属性来传递信息。定义脚本变量的 tag 标签所谓脚本变量,是指 JSP 中可以调用的变量或对象。它可由tag 标签产生
10、。以下示例阐述了一个 tag 标签定义了一个名为 tx 的由 JNDI 所定义的事务处理对象。脚本变量可以是 ejb 对象、事务、数据库连接等等:.具有协作关系的 tag 标签自定义 tag 标签之间可以通过共享对象来实现协作。在下述例子中,标签 tag1 创建了一个名为 obj1 的对象,在标签 tag2 仍可以重复使用 obj。在以下这个例子当中,如果外层的 tag 标签创建了一个对象,那么其内层的所有 tag 标签都可以使用这个对象。由于这样产生的对象没有一个指定的名字,那么就可以将少重名的冲突。这个例子阐述了一系列协作的嵌套对象。Tag 处理类Tag 处理类必须实现 Tag 接口或 B
11、odyTag 接口,不过现在一般都流行从 TagSupport 或 BodyTagSupport 类中继承,这些类或接口都可以在 javax.servlet.jsp.tagext 包中找到。当 JSP 引擎看到自己的 JSP 页面中包含有 tag 标签时,它会调用 doStartTag 方法来处理 tag 标签的开头,调用 doEndTag 方法来处理 tag 标签的结束。下表说明不同类型的 tag 所需要不同的处理过程:Tag 处理类的方法Tag 标签类型所调用的方法基本标签doStartTag, doEndTag, release带属性的标签doStartTag, doEndTag, se
12、t/getAttribute1.N, release带内容的标签doStartTag, doEndTag, release带内容的标签,且内容重复循环doStartTag, doAfterBody, doEndTag, release带内容的标签,且内容与 JSP 交互doStartTag, doEndTag, release, doInitBody, doAfterBody, release一个 tag 处理类可以通过 javax.servlet.jsp.PageContext 来与JSP 交互,通过 javax.servlet.jsp.PageContext 类,tag 处理类可以访问 JSP 中的 request、session 和 application 对像。