您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 数据库 > java自定义标签开发
Java自定义标签的开发与应用在JSTL提供了四个标签库(核心标签库、国际化标签库、数据库标签库和XML标签库),涉及到了几十个标签。虽然这些标签可以完成比较复杂的工作,但它们仍然无法满足程序中的特殊需求。因此,就需要用户根据自己的需要来定制JSP标签,这种由用户自己实现的JSP标签被称为自定义标签。.1自定义标签基础自定义标签和JSTL中的标签从技术上看没有任何区别,可以将这些标签统称为JSP标签。JSP标签在JSP页面中通过XML语法格式被调用,当JSP引擎将JSP页面翻译成Servlet时,就将这些调用转换成执行相应的Java代码。也就是说,JSP标签实际上就是调用了某些Java代码,只是在JSP页面中以另外一种形式(XML语法格式)表现出来。1.1编写输出随机数的标签开始自定义标签的学习之前,在这一节先来实现一个简单的自定义标签,以使读者做一下热身,同时读者通过本节的例子可以对自定义标签的实现方法和过程有一个感性的认识。【实例1-1】实现输出随机数的标签1.实例说明在本例实现的自定义标签(random标签)的功能是输出一个指定范围的随机整数。random标签有如下几个特征:没有标签体。有两个属性:min和max。其中min属性表示生成随机数的最小值,max属性表示生成随机数的最大值。min属性的默认值是0,max属性的默认值是Integer.MAX_VALUE。生成随机数的范围是min=randommax。random标签的标准调用形式如下:ct:randommin=1max=100/其中“ct”是调用标签时的前缀,通过taglib指定的prefix属性指定。上面的代码的功能是输出一个在1(包括)和100(不包括)之间的随机数。2.编写标签类标签类是自定义标签的核心部分。实现标签类的方法有很多,但最简单的方法是编写一个从javax.servlet.jsp.tagext.TagSupport类继承的Java类,并在该类中覆盖TagSupport类的doStartTag方法。为了读取标签中的属性值,还需要在标签类中为每一个标签属性提供一个相应数据类型的标签类属性以及该属性的setter方法(不需要getter方法)。生成随机数的代码需要放在标签类的doStartTag方法中。该标签类的实现代码如下:packagechapter1;importjava.io.IOException;importjava.util.Random;importjavax.servlet.jsp.JspException;importjavax.servlet.jsp.tagext.TagSupport;publicclassRandomTagextendsTagSupport{//封装random标签的两个属性的JavaBean属性privateintmin=0;privateintmax=Integer.MAX_VALUE;//min属性的setter方法publicvoidsetMin(intmin){this.min=min;}//max属性的setter方法publicvoidsetMax(intmax){this.max=max;}//覆盖TagSupport类的doStartTag方法//当遇到标签(也就是ct:random)的开始标记时调用该方法@OverridepublicintdoStartTag()throwsJspException{try{Randomrandom=newRandom();//生成一个在min和max之间的随机数intresult=min+random.nextInt(max-min);//将生成的随机数输出到客户端pageContext.getOut().write(String.valueOf(result));}catch(IOExceptione){}//TagSupport类的doStartTag方法默认返回SKIP_BODY,表示忽略自定义标签体returnsuper.doStartTag();}}在RandomTag类的doStartTag方法中使用了一个pageContext变量来获得JspWriter对象(JSP的out内置对象)。pageContext变量是在TagSupport类中定义的一个类变量,该变量通过TagSupport类中的setPageContext方法进行赋值。实际上,setPageContext方法是在Tag接口中定义的,而TagSupport实现了Tag接口的setPageContext方法。Servlet容器在调用doStartTag方法之前,会先调用Tag接口的setPageContext方法来初始化pageContext变量。Tag接口将在1.1.3节介绍,在这里只要知道所有的标签类都必须实现Tag接口。为了简化标签类的实现,JSPAPI提供了一个TagSupport类,有了TagSupport类,用户在编写标签类时就不需要实现Tag接口的所有方法了。3.编写标签库描述符文件(TLD文件)在JSTL中有若干TLD文件(详见图9.1),其中tld是TagLibraryDescriptor(标签库描述符)的缩写。要想使一个自定义标签正常工作,必须在TLD文件中对该标签进行配置。在TLD文件中主要配置如下两部分内容:标签库的配置信息标签库中具体标签的配置信息标签库的配置信息主要包括如下的内容:标签库的版本:使用tlib-version标签设置。正常使用标签库中的标签所需要的最低JSP版本:使用jsp-version标签设置。标签库的默认前缀:使用short-name标签设置。标签库的URI:使用uri标签设置。标签库的描述信息:使用description标签设置。标签的配置信息主要包括如下的内容:标签名:使用name标签设置。标签对应的Java类:使用tag-class标签设置。标签体的类型:使用body-content标签设置。标签的描述信息:使用description标签设置。标签属性的信息:每一个标签属性对应一个attribute标签。在attribute标签中可以指定标签名(使用name标签设置)、该属性是否必须指定(使用required标签设置)、该属性是否支持动态属性值(使用rtexprvalue标签指定)等配置信息。在WEB-INF目录中建立一个jsp-taglib.tld文件,并在该文件中输入如下的内容:!--标签库描述符文件头--?xmlversion=1.0encoding=UTF-8?taglibxmlns=:xsi=:schemaLocation=://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsdversion=2.0!--标签库的配置信息--description自定义标签库/descriptiontlib-version1.1/tlib-versionshort-namect/short-nameuri!--random标签的配置信息--tagdescription产生一个指定范围的随机数/descriptionnamerandom/nametag-classchapter1.RandomTag/tag-classbody-contentempty/body-contentattributenamemin/namerequiredfalse/requiredrtexprvaluefalse/rtexprvalue/attributeattributenamemax/namerequiredfalse/requiredrtexprvaluefalse/rtexprvalue/attribute/tag/taglib上面的配置代码分为三部分:标签库描述符文件头、标签库配置信息和random标签的配置信息。其中描述库文件头的内容并不需要读者去记忆,读者只需要将JSTL中的任何一个TLD文件打开,将其中的标签库描述文件头部分复制过来即可。如果在标签库描述符文件中包含中文,需要将encoding属性改成“UTF-8”或“GBK”。标签库的URI被uri元素指定为“”,该标签值就是taglib指令的uri属性值。short-name元素指定了标签库的默认前缀。要注意的是,该默认前缀并不等于taglib指令的prefix属性值,也就是说,taglib指令的prefix属性值和short-name元素的值毫无关系。short-name元素值实际上只是个推荐的标签库前缀,如国际化标签库的描述符文件(fmt.tld)中的short-name元素值是“fmt”。在使用taglib指令引用某个标签库时,应尽量使用short-name元素推荐的标签库前缀,当然,也可以设置其他的前缀名。random标签的标签体类型为“empty”(body-content元素的值),表示该标签不支持标签体。关于body-content元素支持的其他值,将在后面的部分详细介绍。random标签的min属性和max属性都被设置可选的属性,并且都不支持动态属性值。因此,在JSP页面中设置random标签的这两个属性时只能直接为它们赋值。4.测试random标签在Web根目录\chapter1目录建立一个random.jsp文件(在本章的所有JSP文件都放在该目录下),并输入如下的内容:%@pagelanguage=javacontentType=text/html;charset=UTF-8%%@tagliburi==ct%%@tagliburi==c%!--使用forEach标签产生1个10至200之间的随机数--c:forEachbegin=1end=1!--调用random标签--ct:randommin=10max=200//c:forEach在浏览器地址栏中输入如下的URL:浏览器显示的输出结果如图1.1所示。图1.1使用random标签产生1个10至200之间的随机数5.程序总结在部署和安装自定义标签时,TLD文件应放在WEB-INF目录或其子目录中(包括classes和lib目录)。根据本例实现的random标签,可以将开发自定义标签的基本步骤总结如下:实现一个标签类。该标签类可以实现Tag接口、继承TagSupport类或实现其他的接口(这些接口将在后面的部分详细介绍)。在标签库描述符文件(TLD文件)中配置自定义标签。部署和安装自定义标签。主要是将.class文件放在WEB-INF\classes目录中,并且将TLD文件放在WEB-INF目录或其子目录中。1.1.2自定义标签能做什么自定义标签除了可以读取标签的属性值外,还可以完成如下的工作:单次执行标签体中的内容。重复执行标签体中的内容。修改标签体中的内容。忽略JSP页面中位于自定义标签后面的内容。在上一节介绍了Tag接口中的doStartTag方法,该方法在We
本文标题:java自定义标签开发
链接地址:https://www.777doc.com/doc-6123943 .html