【Jsp精品源码栏目提醒】:本文主要为网学会员提供“【精品】JSP自定义标签 - 其它资料”,希望对需要【精品】JSP自定义标签 - 其它资料网友有所帮助,学习一下!
1、自定义标签的体系结构自定义标签需要有一个相应的标签处理类, 当服务器遇到自定义标签时会调用标签处理类。
多个自定义标签组成一个自定义标签库,标签库有一个描述文件,该描述文件对库中的标签进行声明。
开发自定义标签其实就是定义标签处理类和编写标签库描述文件的过程。
1.1、什么是自定义标签库
JSP 容器遇到标签时会执行页面转发的操作。
如果希望在
JSP 中实现用类似于
JSP 标签的方式完成特定操作,可以通过自定义标签来完成。
自定义标签库是自定义标签的集合。
自定义标签在使用中会以下面几种形式出现:(1)简单格式简单格式不带标签体、不嵌套自定义标签。
例如:,your 为前缀,displayDate 为标签名称。
这种标签可以带有属性,例如:,name 和 type是自定义标签使用的两个属性。
(2)带有标签体自定义标签之间包含标签体,例如:Hello(3)自定义标签的嵌套使用嵌套使用标签是指自定义标签中又使用了自定义标签,例如:自定义标签库由一下成员组成: 标签处理程序 标签库描述文件(TLD)1、标签处理程序自定义标签的处理功能是由标签处理程序定义的。
因此,自定义标签的开发主要是标签处理程序的开发。
标签处理程序的开发有固有的规范,即开发实现特定接口的 Java 类。
运行时,
JSP 对应的 Servlet 会建立本页面使用的自定义标签处理类的一个实例。
标签处理类的规范由 Tag 接口定义。
如果要建立带标签体的标签处理类,可以实现 BodyTag 接口。
BodyTag 接口是 Tag 接口的子接口。
Tag 接口中,主要定义的是和标签生命周期相关的方法,主要方法有:(1) 当容器创建一个新的标签后,通过 setPageContext 方法来设置标签的页面上下文。
(2)使用 setParent 方法设置这个标签的上一级标签,如果没有上一级嵌套,设置为 null。
(3)设置标签的属性,这个属性在标签库描述文件中定义,如果没有定义属性,就不调用该类方法。
(4)调用 doStartTag 方法,这个方法可以返回 EVAL_BODY_INCLUDE 和SKIP_BODY, 当返回 EVAL_BODY_INCLUDE 时,就计算标签体,如果返回 SKIP_BODY时,就不计算标签体。
(5)调用 doEndTag 方法,这个方法可以返回 EVAL_PAGE 和 SKIP_PAGE,当返回EVAL_PAGE 时,容器将在标签结束时继续计算
JSP 页面的其他部分,如果返回SKIP_PAGE,容器将在标签结束时停止计算
JSP 页面的其他部分。
(6)调用 release 方法释放标签处理程序占用的资源。
为了简化开发,
JSP 规范又定义了一些辅助类。
例如:Tag 接口对应辅助类为TagSupport 类。
BodyTag 接口对应 BodyTagSupport 类。
2、标签库描述文件标签库描述文件(Tag Library Descriptor)包含了自定义标签的描述信息。
它把自定义标签和对应的处理程序关联起来。
一个标签库对应一个标签库描述文件,一个标签库描述文件可以包含多个自定义标签的声明。
1.21.2mytagThis taglib provides tag examplerepeatedu.
jsp.tag.SimpleTagscriptlessnumtruetrue相应的标签处理类文件:package edu.
jsp.tagimport javax.servlet.
jsp.JspExceptionimport javax.servlet.
jsp.tagext.SimpleTagSupportimport java.util.HashMapimport java.io.IOExceptionpublic class SimpleTag extends SimpleTagSupportprivate int numpublic void doTag throws JspException IOExceptionfor int i0 i(2) 带属性标签:如(3) 带标签体的标签:在自定义标签的起始和结束标签之间的部分为标签体Body。
Body 的内容可以是
JSP 中的标准标签,也可以是 HTML、脚本语言或其他的自定义标签。
(4) 可以被 Script 使用的标签:定义了 id 和 type 属性的标签可以被标签后面的 Scriptlet 使用。
4.接口及其他实 际 上 , 自 定 义 标 签 的 处 理 类 实 现 了 Tag Handler 对 象 。
JSP 技 术 在javax.servlet.
jsp.tagext 中提供了多个 Tag Handler 接口,
JSP1.2中定义了 Tag、BodyTag、IterationTag 接口,在
JSP2.0中新增了 SimpleTag 接口。
JSP 还提供了上述接口的实现类TagSupport、 ( 。
BodyTagSupport 和 SimpleTagSupport SimpleTagSupport 只在
JSP2.0中才有)BodyTagSupport 实现了 BodyTag、Tag 和 IterationTag 接口。
接口及其方法Tag 接口 方法SimpleTag dotageTag doStartTagdoEndTagreleaseIterationTag doStartTagdoAfterTagreleaseBodyTag doStartTagdoEndTagreleasedoInitBodydoAfterBody下表引自 Sun 的
JSP 在线教程。
Tag Handler MethodsTag Handler Type MethodsSimple doStartTag doEndTag releaseAttributes doStartTag doEndTag set/getAttribute1...N releaseBody Evaluation and No Interaction doStartTag doEndTag releaseBody Iterative Evaluation doStartTag doAfterBody doEndTag releaseBody Interaction doStartTag doEndTag release doInitBody doAfterBody release下表中的 EVAL 是 evaluate 的缩写,意思是:评价 估计 求...的值,在下列的返回值中的意思是执行。
返回值 意义SKIP_BODY 表示不用处理标签体,直接调用 doEndTag方法。
SKIP_PAGE 忽略标签后面的
JSP 内容。
EVAL_PAGE 处理标签后,继续处理
JSP 后面的内容。
EVAL_BODY_BUFFERED 表示需要处理标签体。
EVAL_BODY_INCLUDE 表示需要处理标签体但绕过 setBodyContent和 doInitBody方法EVAL_BODY_AGAIN 对标签体循环处理。
具体用法可以查看其他参考资料。
Sun 的 Java 教 程 相 关 部 分 :http://java.sun.com/webservices/docs/1.0/tutorial/doc/JSPTags.html二、实验1.试验介绍下面的实验就是基于上述开发流程开发的。
(1)在
JSP 中指定 taglib 的 uri:。
(2)在 web.xml 中配置 tag-location: /helloworld /WEB-INF/helloworld.tld (3)在 tag-location 中指定的.tld 文件中定义实现标签的处理类: mytag helloworld mytag.HelloWorldTag empty4执行处理类 mytag.HelloWorldTag 的 doStartTag 和 doEndTag 方法,然后将结果输入到
JSP 中,和
JSP 中的内容一起输出。
实际上自定义标签和
JSP 中的其他的内容被 WebServer一起编译成 servlet。
2. 完成后的试验的目录结构应用 myjsp 放在 Tomcat 的 webapps 下。
myjsp 中包含 J2EE 标准目录结构:WEB-INF 和 hello.
jsp。
WEB-INF 中包含子目录 classes和 lib 及 web.xmltld 文件可以放在 WEB-INF 下,也可以放在 WEB-INF 的子目录下。
3.开始实验3.1.编写
JSP —hello.
jsp 的
源码 -- 下面显示的是自定义标签中的内容3.2.编写 web.xml —web.xml 的
源码 -- /helloworld /WEB-INF/helloworld.tld3.3 编写 tld 文件 —helloworld.tld 的
源码 -- 1.0 1.2 mytag helloworld mytag.HelloWorldTag empty3.4 编写标签实现类 —标签的实现类 HelloWorldTag.class 的
源码 -- package mytagimport java.io.IOExceptionimport javax.servlet.
jsp.import javax.servlet.
jsp.tagext.public class HelloWorldTag extends TagSupport public HelloWorldTag public int doStartTag throws JspTagException return EVAL_BODY_INCLUDE public int doEndTag throws JspTagException try pageContext.getOut.writeHello World catch IOException ex throw new JspTagException错误 return EVAL_PAGE 3.5 执行效果部署到Tomcat的WebApps目录下,启动Tomcat,输入:http://localhost:8080/myjsp/hello.
jsp“Hello World”就是我们定义的标签部分的处理类输出的结果。
3.6 注意:这个试验我做了2天,总是报错,弄得很是灰心,开始时以为 tld 文件或 web.xml 文件配置不正确,但怎么也找不到原因。
今晚我终于找到原因了,是因为.class 文件一定要放在 classes 文件夹中,我放到了 lib中。
.jar 或 servlet 文件要放在 lib 目录中,而.class 要放在 classes 目录中,如果要放到 lib目录中必须把 mytag 中的文件打包成.jar 文件,然后把 mytag.jar 放到 lib 目录中。
希望你不要犯我犯过的这个错误!_有时间我会再写一篇介绍 Struts 详细处理流程的笔记。
这篇笔记整理的的确是
JSP1.2的自定义标签,在
JSP2.0中 xml 文件的格式变了,其他的就不太了解了!但我想变化应该不会太大,另外标准是向下兼容的,感兴趣的朋友可以看看,这是我的学习笔记,可能会对别人有些用处,所以贴出来献丑了!