JSP2自定义标签的使用方法
JSP2.0标签使用方法
JSP2.0中标签的使用由多个部分组成:
(1)WEB_INF/web.xml中添加标签引用(在web.xml文件的jsp-config节点中添加)
(2)标签的实现,可能是class也可能是web templet
(3)在jsp文件中添加引用
在实际使用中,分析jsp2.0标签可以先从jsp文件入手,然后再分析web.xml及相应的标签库文件。
2.2 基本标签的使用方法
2.2.1 jsp文件中的标签引用及使用方法
以下是一个简单的jsp文件:
说明:
(1)首先以<%@ taglib prefix="mytag" uri="…" %>说明标签前缀及该前缀引用的标签所在路径,在这个例子中uri值是一个相对路径(本地路径),即当前项目根目录下WEB-INF/ jsp2/ jsp2-example-taglib.tld。如果使用的是本地路径就不需要在web.xml中配置路径映射了;
(2)指定了标签前缀后,在jsp页面的body内就可以使用这个前缀来引用标签库中的指定标签了,如
2.2.2 web.xml中的配置
如果在上述例子中使用的不是本地路径,那么就需要在web.xml中配置路径转换,如使用:<%@ taglib prefix="mytag" uri=" http://mytaglib/myTestTags1 " %>来引用标签库,那么就需要在web.xml文件的jsp-config节点中添加如下配置:
JSP解释器会将http://mytaglib/myTestTags1根据web.xml中的配置转化为本地路径。当然
2.2.3 标签库中的配置
在标签库中的配置实际上就是配置对实现类的引用,JSP解释器会根据jsp文件中对标签的引用,在标签库中找到相应的标签,然后再根据标签中的定义调用具体的实现类,本例中在jsp文件中对标签的引用:
该标签由四个部分组成:
(1)description:描述该标签的作用
(2)name:标签的名字,该名字在jsp文件使用,相当类名;
(3)tag-class:标签的实现索引,相当于类的实现;本例索引指定jsp2.examples.simpletag.HelloWorldSimpleTag,是一个java的类文件,应放在WEB_INF/classes/jsp2/examples/simpletag目录下的HelloWorldSimpleTag.class文件;
(4)body-content:在jsp文件中使用标签时,标签中的内容类别,本例的值是empty,表示helloWorld这个标签中没有内容。如果在jsp页面中在该标签中加入了内容,如
2.2.4 类的实现
类HelloWorldSimpleT ag实现如下:
说明:
(1)jsp标签调用的类一般继承于SimpleT agSupport
(2)SimpleTagSupport中实现了getJspContext()这个方法,这个方法可以获取指向jsp页面的输出流。
(3)getJspContext().getOut().write( "Hello, world!" ):输出Hellow,World!
2.3含有变量的tag配置
2.3.1 jsp文件中的标签引用及使用方法
以下是引用了带有变量标签的jsp页面:
说明:
(1)
(2)${count},在页面中显示输出参数的值,count是输出参数的名字
2.3.2 标签库中的配置
标签库中的相应配置如下:
该标签由六个部分组成:
(1)description:见上文
(2)name:见上文
(3)tag-class:见上文
(4)body-content:这个例子的值是scriptless,表示标签中的内容是脚本
(5)variable:输出参数,在jsp中使用${count}来引用这个输出变量的值,输出参数名并不是强制性的,这里只是一个约定,即要求repeat实现类最后有count这个输出参数,以便在jsp页中方便引用,如果没有也不会报错;
(6)attribute:输入参数,在jsp中使用< mytag:repeat num="5">来设置这个输入参数num,这个参数名是强制性的,即要在repeat实现类中有setNum这个方法,如果没有相应的方法jsp页面会报错;
说明:
(1)getJspContext().setAttribute定义了输出到jsp页面的输出参数count,这里的count是一个字符串,它的值可以不与标签库中variable定义相同,如,它可以是len,当然在jsp引用时应以这里为准,即使用${len}引用;
(2)setNum(int num)方法:接收输入参数,这个方法命名规则为set+输入参数名,该方法带一
个参数,用于接收输入参数的值。
2.4 函数标签的定义方法
说明:
(1)函数标签的引用比其它标签的引用都要简单,它的引用与高级语言中的函数调用方法类似,直接在函数名后的括号后面输入相应的参数值即可,不需要另加用标签的其它属性来说明输入参数。
说明如下:
(1)这种方法的定义包含在function元素中;
(2)name:函数名
(3)function-class:该函数真正的实现class,本例中,caps函数是由WEB_INF/classes/ jsp2/examples/el路径中的Functions类来实现的;
(4)function-signature:说明函数的输入及输出参数类型,不用指明参数名。
说明:
(1)函数标签实现类就是普通的类,它不需要从某个父类继承;
(2)函数标签实现类中必须有相应的方法与标签库中相应的函数字义相同(包括函数名,输入参数个数及输入参数类型,函数的返回值);
2.5 标签模板
标签模板的特点:
(1)没有tld文件在jsp中通过<%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %>引用,即使用tagdir代替了uri,这里的tags是一个文件夹,不是文件,在该文件夹中包含了所需的标签模板;
(2)通过以下方式传入参数值:
(3)displayProducts是与/WEB-INF/tags目录中的某个文件名;
(4)通过
(5)标签模板是一个纯文本文件,类似于html文件,而不需要通过java的类来实现标签的定义;(6)标签模板的主要作用重在排版,而其它标签的作用重在功能的实现;
自定义标签
从图上可以看出结构。接口的实现类:SimpleTagSupport (Jsp2.0)、TagSupport、BodyT agSupport
步骤:
1、创建标签的处理类(Tag Handler Class) 实现上述类或接口
2、创建标签库描述文件(Tag Library Descrptor File) 即TLD文件
1.TagSupport处理标签的方法
1、TagSupport类提供了两个处理标签的方法:
public int doStartTag() throws JspException
public int doEndTag() throws JspException
2、doStartTag:但JSP容器遇到自定义标签的起始标志,就会调用doStartTag()方法。doStartTag()方法返回一个整数值,用来决定程序的后续流程。
A.Tag.SKIP_BODY:表示?>…之间的内容被忽略;
B.Tag.EVAL_BODY_INCLUDE:表示标签之间的内容被正常执行。
3、doEndTag:但JSP容器遇到自定义标签的结束标志,就会调用doEndTag()方法。doEndTag()方法也返回一个整数值,用来决定程序后续流程。
A.Tag.SKIP_PAGE:表示立刻停止执行网页,网页上未处理的静态内容和JSP程序均被忽略任何已有的输出内容立刻返回到客户的浏览器上。
B.Tag_EVAL_PAGE:表示按照正常的流程继续执行JSP网页。
定义标签类,实现TagSupport类:
创建标签库描述文件(Tag Library Descriptor)
1、标签库描述文件,简称TLD,采用XML文件格式,定义了用户的标签库。TLD文件中的元素可以分成3类:
A.标签库元素
B.标签元素
C.标签属性元素
2、标签库元素用来设定标签库的相关信息,它的常用属性有:
A.shortname:指定Tag Library默认的前缀名(prefix);
B.uri:设定Tag Library的惟一访问表示符。
3、标签元素用来定义一个标签,它的常见属性有:
https://www.360docs.net/doc/9d12699441.html,:设定Tag的名字;
B.tagclass:设定Tag的处理类;
C.bodycontent:设定标签的主体(body)内容。
1)empty:表示标签中没有body;
2)JSP:表示标签的body中可以加入JSP程序代码;
3)tagdependent:表示标签中的内容由标签自己去处理。
4、标签属性元素用来定义标签的属性,它的常见属性有:
https://www.360docs.net/doc/9d12699441.html,:属性名称;
B.required:属性是否必需的,默认为false;
C.rtexprvalue:属性值是否可以为request-time表达式,也就是类似于< %=…% >的表达式。
在页面中使用标签:
<%@ taglib uri="https://www.360docs.net/doc/9d12699441.html," prefix="Q" %>
二、带标签内容的
/*
* 计算带标签内容的自定义标签
*/
使用标签: