背景以及浸染

开拓大略的标签

开拓带属性的标签

jsp自定义嵌套标签Java自界说标签 jQuery

开拓带标签体的标签

以页面片段为属性的标签

具有动态属性的标签

一、标签库有什么浸染

自定义标签库是一种精良的表现层技能,之前先容的MVC模式,我们利用jsp作为表现层,但是jsp语法嵌套在html页面,美工还是很难直接参与开拓,并且jsp脚本和html代码耦合在一起,掩护本钱较高。
我们能不能开拓一套和html风格类似并且能完成jsp脚本功能的标签来办理这种低效的协作办法呢?于是标签库就出身了。

这是Java中标签规范的继续体系,实现Tag接口的我们叫做传统式标签库开拓,这种开拓模式略显发繁芜,基本已经被SimpleTag式的大略式开拓标签库给取代了。
Java中供应了一个默认的实现类SimpleTagSupport来实现自定义标签,我们只要继续此类即可。

二、开拓一个最大略的标签库

开拓一个自定义标签库的过程如下:

开拓自定义标签处理类

创建.tld文件,每个此文件对应一个标签库,标签库中可以由多个标签

在jsp页面利用标签

首先我们先从自定义标签处理类开始,正如上文所说,这个类只有继续了SimpleTagSupport这个类可以省去省去重写SimpleTag接口中的一些方法。
我们说个doTag()这个方法很主要,这个方法类似于我么main方法一样,当jsp页面加载到我们定义的标签的时候就会过来调用这个方法。

public class MyTag extends SimpleTagSupport { @Override

这是一个大略的标签处理类,详细的细节暂时不用关心,只须要知道,它卖力向jsp页面输出字符串即可。
下面我们看看第二步,创建tld文件。
这个文件我们没有必要重新写一遍,到Tomcat做事器上的webapps/examples/WEB-INF/jsp2中复制一个过来,修正名字存放到我们的项目中WEB-INF的任意子路径下。
删除一些标签成如下内容:

我们看到这是一个XML文件,根元素为taglib,而taglib紧张有以下几个子元素:

description //描述信息

tlib-version //指定标签库的版本号,基本不用我们操心

short-name //指定标签库的短名字,也是没什么用

uri //这是一个主要的子元素,是该标签库的唯一标识

tag //看名字就知道,这是定义标签的子元素,很主要

对付taglib这个根元素,我们紧张关心他下面的uri和tag两个子元素,一个标签库可以由多个标签,也便是可以有多个tag标签。
关于tag标签,紧张有以下几个子元素:

description //描述信息

name //该标签的唯一标识,很主要

tag-class //指定了处理该标签的类,也便是利用该标签谁给我返回结果

body-content //标签体,后面详说,很主要

attribute //属性,后面先容,很主要

对付以上标签大家可能已经知道什么意思,但是详细用在什么地方可能不清楚,本小节的末了会综合三个步骤自定义一个大略的标签。
接下来先容在jsp页面是如何利用标签。

利用标签库也是有两个步骤,首先导入标签库,然后引用标签。
我们利用taglib编译指令导入标签库,详细魄式如下:

<%@ taglib uri=\"大众tld文件中指定的唯一标识\"大众 prefix=\公众指定标签前缀\"大众%>

我们看到这个导入标签库的编译指令紧张有两个属性,一个是用于定位我们已经写好的标签库,定位的方法便是读取每个tld文件中的URI元素的值,prefix用于指定我们利用标签时的前缀,等用的时候就很随意马虎理解了,现在阐明反而不随意马虎说清楚。
我们利用标签的格式如下:

<刚刚指定的前缀 :标署名 />

标署名便是我们标签库中每个tag都会有的name的值,这指定了该语句是引用的那个标签。
下面我们通过详细的例子直不雅观感想熏染下。

<%@ page contentType=\"大众text/html;charset=UTF-8\公众 language=\"大众java\公众 %><%@taglib uri=\公众mytid\"大众 prefix=\"大众mytags\"大众%><html>

<taglib xmlns=\"大众http://java.sun.com/xml/ns/j2ee\"大众

public class MyTag extends SimpleTagSupport { @Override

结果如下:

这就完成了一个最大略的标签库的定义和利用的过程,首先我们在index.jsp页面通过URI引入mytag标签库,指定了利用该标签库的前缀为mytags,然后<mytags:hello />引用name为hello的tag标签,然而在加载这条语句的时候会通过我们的tag中指定的处理类,找到它并实行,末了通过此标签处理类想我们的jsp页面输出了一个字符串。
以上便是一个最大略的自定义标签的过程,为了更好的理解后续的较繁芜的自定义标签办法,上述内容值得感想熏染体会。

三、开拓带属性的标签

如果我们通过拦截器获取了从数据库查出来的一个结果集,我们此处希望调用标签来将结果集以表格的形式输出来,此时我们的这个结果集又该如何传到标签处理类中呢?这时我们可以利用属性。
详细看代码:

<%@ page contentType=\"大众text/html;charset=UTF-8\"大众 language=\"大众java\"大众 %><%@taglib uri=\公众mytid\"大众 prefix=\"大众mytag\"大众%><html>

<taglib xmlns=\公众http://java.sun.com/xml/ns/j2ee\"大众

public class MyTag extends SimpleTagSupport { private String map; public String getMap(){ return this.map;

我们首先先从index.jsp页面看起,首先我们定义了一个HashMap用来存放一个大略的个人信息,键为姓名值为年事。
末了我们设置共享范围为当前page。
然后<mytag:hello map=\"大众map\"大众/>,这里的map=“map”,第一个map是属性名,第二个只是一个字符串。
下面进入到tld页面看,这个页面基本没有什么改动,只是多了个attribute元素,attribute中有几个子元素,第一个是name指定这个属性的唯一标识,第二个required指定该属性是否是必须属性。
第三个fragment指定该属性是否支持jsp脚本。
紧张关心name这个元素。
这个值和jsp页面调用标签时利用的属性名必须一样,并且这个属性值还必须和标签处理类中的私有属性名一样,这便是为了jsp页面的属性值能够自动的传入到标签处理类的属性中,我们看这个标签处理类

这个类定义了私有属性map,和我们的tld文件中的属性名是同等的。
getJspContext().getAttribute(map),首先是得到了调用该标签的jsp页面的pageContext,这便是方法getJspContext的返回值,由于我们在jsp页面设置了一个共享数据(maps),于是我们同名名字获取该工具,这里的map便是我们的私有属性,他的值被自动赋值了,详细的值便是jsp页面传入的参数。
后面的代码就很大略了,循环输出数据到jsp页面上。

轻微理一下思路,这种带属性的标签利用实在和无属性差不多,都是先引入了标签库,加载标签的的时候通过URI找到对应的标签库,只不过这次将一个字符串赋值给了tld中attribute元素中名为map的属性,然后跳向对应的标签处理类,顺便把map属性的值自动赋值处理类中的私有属性,然后实行输出代码。
个中须要把稳的是属性名一定要统一,其余,如果标签的属性值是8种基本数据类型,那么在JSP页面在通报字符串时,JSP引擎会自动转换成相应的类型,但如果标签的属性值是复合数据类型,那么JSP引擎是无法自动转换的。
对付通报非基本数据类型的操作,后续文章会先容。

为了篇幅不过于长,还剩下的内容留不才篇,如有缺点,望指出!

本文作者Walker_YAM