JSP2自定义标签(一)——简单标签

来源:互联网 发布:mc9s12x 串口编程 编辑:程序博客网 时间:2024/05/16 18:37

 本文摘自:李刚 著 《轻量级 Java EE企业应用实战 Struts2+Spring+hibernate整合开发》

 

 

        在JSP规范的1.1版中增加自定义标签库规范,自定义标签库是一种非常优秀的表现层组件技术。通过使用自定义标签库,可以在简单的标签中封装复杂的功能。

为什么要使用自定义标签呢?主要是为了取代丑陋的JSP脚本。在HTML页面中插入JSP脚本有如下几个坏处:

        (1)JSP脚本非常丑陋,难以阅读;

        (2)JSP脚本和HTML代码混杂,维护成本高。

        (3)HTML页面中嵌入JSP脚本,导致美工人员难以参与开发。

        处于以上考虑,我们需要一种在页面中使用的标签,这种标签要具有和HTML标签类似的语法,但可以完成JSP 脚本的功能——这种标签就是JSP自定义标签。

在JSP1.1规范中开发自定义标签库比较复杂,JSP2简化了标签库的开发,在JSP2中开发标签库只需如下几个步骤:

        (1)开发自定义标签处理类;

        (2)建立一个*.tld文件,每个*.tld文件对应一个标签库,每个标签库对应多个标签。

        (3)在JSP文件中使用自定义标签。

        提示:标签库是非常重要的技术,通常来说,初学者,普通开发人员自己开发标签库的机会很少,但如果希望成为高级程序员,或者希望自己开发通用框架,就需要大量开发自定义标签。所有的MVC框架,如Struts2、SpringMVC、JSF等都提供丰富的自定义标签。

 

一. 开发自定义标签类

 

        当我们在JSP页面使用一个简单的JSP标签时,底层实际上由标签处理类提供支持,从而可以使用简单的标签来实现复杂的功能,从而使团队更好地协作开发。

自定义标签都必须继承一个父类:javax.servlet.jsp.tagext.SimpleTagSupport,除此之外,自定义标签还有如下的要求:

        (1)如果以标签类包含属性,每个属性都有对应的getter和setter方法;

        (2)重写doTag方法,这个方法负责生成页面内容。

        下面开发一个最简单的自定义标签,该标签负责在页面上输出HelloWorld: 

package ppp;import java.io.IOException;import javax.servlet.jsp.JspException;import javax.servlet.jsp.tagext.SimpleTagSupport;public class HelloWorldTag extends SimpleTagSupport{//重写doTag()方法,该方法在标签结束时生成页面内容public void doTag() throws JspException,IOException{//获取页面输出流,并输出字符串getJspContext().getOut().write("Hello World");}}

        上面的这个标签处理类非常简单,它继承了SimpleTagSupport父类,并重写了doTag()方法,而doTag()方法则负责输出页面的内容。该标签没有属性,所以无需提供Setter和Getter方法。

 

二. 建立TLD文件

 

        TLD是Tag Library Definition的缩写,即标签库定义,文件的后缀是tld,每个tld文件对应一个标签库,一个标签库中可以包含多个标签,tld文件也可以被称作标签库定义文件。

        标签库定义文件的根元素是taglib,它可以包含多个tag子元素,每个tag子元素都定义一个标签。通常我们都可以到web容器下复制一个标签库定义文件,并在此基础上进行修改即可。例如在tomcat6.0中,在webapps\examples\WEB-INF\JSP2路径下包含了一个jsp2-example-taglib.tld文件。这就是一个示范用的标签库定义文件。

        将该文件复制到web应用的WEB-INF\路径下,或者任意WEB-INF子路径下 ,并对该文件进行简单的修改,修改后的mytaglib.tld文件如下:

 

 

         上面标签库定义文件也是标准XML文件,该XML文件的根元素是taglib元素,因此我们编写标签库定义文件时都直接添加该元素即可。

taglib有2个字元素:

        (1tlib-version:指定该标签库的事先版本,这是一个作为标识的内部版本号,对于程序没有太大的作用。

        (2)short-name:标签库的默认短名,该名称通常也没有太大的用处。

        (3)uri:这个属性通常非常重要,他指定了标签库的URI,相当于指定了标签库的唯一标识。JSP页面使用标签库时就是根据该名称来使用此标签库的。

除此之外,taglib元素下可以包含多个tag元素,每个tag元素定义一个标签,tag元素下至少要包含以下三个子元素:

        (1)name:该标签库的名称,这个属性很重要,JSP页面就是根据该名称来使用此标签的。

        (2)tag-class:指定标签的处理类,毋庸置疑,这个标签非常重要,他指定了标签有哪个Java类来处理。

        (3)body-content:这个属性也很重要,他指定了标签体的内容。该元素的值可以是以下这几个:

                            a.    tagdependent:指定标签处理类自己负责处理标签体。

                            b.    empty:指定该标签的标签体只能作为空标签来使用。

                            c.    scriptless:指定该标签的标签体可以是静态的HTML元素、表达式语言,但绝不允许是JSP脚本。

                            d.    JSP:指定该标签可以使用JSP脚本。

         注意:因为JSP2规范不再推荐使用JSP脚本,所以JSP2自定义标签的标签体中不能在包含JSP脚本。所以,实际上,body-content元素的值不可以是JSP脚本。

定义了以上标签库定义文件之后,将标签库文件放在Web应用的WEB-INF路径或任意子路径下,Java Web会自动加载该文件,则该文件定义的标签库也将生效。

 

三. 使用标签库

 

        JSP页面中确定指定的标签需要两点:

        (1)标签库URI:确定使用哪个标签库。

        (2)标签名:确定使用哪个标签。

        使用标签库分成以下两个步骤:

        (1)导入标签库:使用taglib编译指令导入标签库,就是将标签库和指定前缀关联起来。

        (2)使用标签:JSP页面中自定义标签。

         taglib的语法格式如下:

         <% @ taglib uri = "tagliburi" prefix = "tagprefix" %>

        其中uri属性确定标签库的URI,这个URI可以确定一个标签库。而prefix属性指定标签库的前缀,即所有使用该前缀的标签都由此标签库处理。

使用标签的语法格式如下:

 

  

 

 如该标签没有标签体,则可以使用如下的语法格式:

 

 

        上面的使用标签的语法里都包含了设置属性值,前面介绍的HelloWorldTag标签没有任何的属性,所以使用该标签只需要用<mytag:helloWorld/>即可。其中mytag是taglib指令为标签库指定的前缀,而helloWorld是标签名。

 

 

  

原创粉丝点击