背景以及浸染
开拓大略的标签
开拓带属性的标签
开拓带标签体的标签
以页面片段为属性的标签
具有动态属性的标签
一、标签库有什么浸染
自定义标签库是一种精良的表现层技能,之前先容的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