java自定义标签-jsp c标签定义变量
JSP自定义标签体系结构介绍标签处理程序在创建自定义标签之前需要创建一个标签处理程序标签处理程序是一个执行自定义标签操作的Java对象在使用自定义标签时要导入一个标签库即一组标签标签处理程序对通过在Web部署描述符中声明库导入它然后用指令taglib将它导入JSP页如果JSP容器在转换时遇到了自定义标签那么它就检查标签库描述符taglibrarydescriptorTLD文件以查询相应的标签处理程序TLD文件对于自定义标签处理程序就像Web部署描述符对于servlet一样在运行时JSP页生成的servlet得到对应于这一页面所使用的标签的标签处理程序的一个实例生成的servlet用传递给它的属性初始化标签处理程序标签处理程序实现了生存周期方法生成的servlet用这些方法通知标签处理程序应当启动停止或者重复自定义标签操作生成的servlet调用这些生存周期方法执行标签的功能标签的类型可以定义两种类型的标签javaxservletjsptagextTagjavaxservletjsptagextBodyTag对正文进行操作即对在开始和结束标签之间的内容进行操作的标签必须实现BodyTag接口在这个教程中我们将称这些标签为正文标签我们将不对其正文操作的标签称为简单标签简单标签可以实现Tag接口尽管不要求它们这样做要记住不对其正文操作的标签仍然有正文只不过它的标签处理程序不能读取这个正文jsp自定义标签关键词jsp自定义标签定义标签要定义标签需要为该标签开发一个taghandler和helper类在标签库描述符中声明这个标签本节描述标签handler和TLD的属性并解释如何为在前面几节中介绍的标签开发taghandler和库描述符元素标签handler标签handler是由Web容器调用的一个对象用于执行带有自定义标签的JSP页面时对这个标签进行判断标签handler必须实现Tag或者BodyTag接口接口可以用于接受现有Java对象并使它成为标签handler对于新创建的处理器可以用TagSupport和BodyTagSupport类作为基类这些类和接口包含在javaxservletjsptagext包中JSP页面的servlet在对标签处理的不同阶段调用由Tag和BodyTag接口定义的标签handler遇到自定义标签的开始标签时JSP页面的servlet调用方法以初始化相应的handler然后调用handler的doStartTag方法遇到自定义标签的结束标签时调用处理器的doEndTag方法在标签handler需要与标签的正文交互时调用其他方法见带正文的标签为了提供标签handler的实现必须实现在处理标签的不同阶段调用的方法在表关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf16-1中汇总了这些方法表16-1标签handler方法标签handler类型方法简单doStartTagdoEndTagrelease属性doStartTagdoEndTagsetgetAttribute1Nrelease正文判断且无交互doStartTagdoEndTagrelease正文迭代判断doStartTagdoAfterBodydoEndTagrelease正文交互doStartTagdoEndTagreleasedoInitBodydoAfterBodyrelease标签handler可以使用一个能让它得以与JSP页面通信的API到API的入口点是页面上下文对象javaxservletjsppageContext通过它标签handler可以获取JSP页面能够访问的所有其他隐式对象请求会话和应用程序隐式对象可以有与其相关联的命名属性可以用[setget]Attribute方法访问这种属性如果标签是嵌入的标签handler还可以访问与外围标签关联的handler称为parent一组相关的标签handler类标签库一般是打包的且作为JAR文档部署标签库描述符标签库描述符TLD是一个描述标签库的XML文档TLD包含有关整个库以及库中包含的每一个标签的信息Web容器用TLD验证标签JSP页面开发工具也使用TLDTLD文件名必须有扩展名tldTLD文件也储存在WAR文件的WEB-INF目录中或者在WEB-INF的子目录中TLD必须以指定XML的版本和文档类型定义DTD的XML文档序言prolog开始xmlversion"10"encoding"ISO-8859-1"DOCTYPEtaglibPUBLIC"-SunMicrosystemsIncDTDJSPTagLibrary12EN"""Tomcat支持版本11和12的DTD不过本章所讨论的是12版本因为在开发的所有标签库中都应该使用最新的版本模板个人简介word模板免费下载关于员工迟到处罚通告模板康奈尔office模板下载康奈尔 笔记本 模板 下载软件方案模板免费下载库TLDtutorial-templatetld符合版本12Struts库TLD符合版本11的DTD它的元素要少且其中一些元素使用了稍微不同的名字TLD的根是taglib元素表16-2中列出了taglib的子元素表16-2taglib子子元素元素说明tlib-version标签库的版本jsp-version这个标签库要求的JSP规范版本short-nameJSP页面编写工具可以用来创建助记名的可选名字uri唯一标识该标签库的的URIdisplay-name将由工具显示的可选名small-icon将由工具使用的可选小图标large-icon可被工具使用的可选大图标description可选的标签特定信息listener见listener元素tag见tag元素listener元素标签库可以指定一些事件监听器类见处理Servlet生命周期事件这些监听器在TLD中作为listener元素列出Web容器将初始化监听器类并以类似在WAR级定义的监听器的方式注册它们与WAR级监听器不同这里没有指定标签库监听器注册的顺序listener元素的唯一子元素是listener-class元素它必须包含监听类的完全限定名tag元素库中的每一个标签都由给出其名字和其标签handler的类在由标签创建的脚本变量上的信息以及标签属性上的信息描述脚本变量信息可以在TLD中直接给出也可以通过tagextrainfo类给出见定义脚本变量的标签每一个属性声明包含指明属性是否是必需的其值是否可以由请求时表达式确定以及属性类型的内容见属性元素在tag元素中的TLD中指定标签在表16-3中出了tag的子元素表16-3标签子元素元素说明name唯一标签名tag-class标签handler类的完全限定名tei-classjavaxservletjsptagextTagExtraInfo的可选子类见提供有关脚本变量的信息body-content正文内容类型见body-conten元素和body-content元素display-name由工具显示的可选名small-icon可以由工具使用的小图标large-icon可以由工具使用的大图标description可选的标签特定的信息variable可选的脚本变量信息见提供有关脚本变量的信息attribute标签属性信息见Attribute元素下面几节描述开发在标签类型中介绍的每一种类型的标签所需要的方法和TLD简单标签标签handler简单标签的handler必须实现Tag接口的doStartTag和doEndTag方法在遇到开始标签时调用doStartTag方法因为简单标签没有正文所以这个方法返回SKIP_BODY在遇到结束标签时调用doEndTag方法如果要对页面的其他部分进行判断则doEndTag方法需要返回EVAL_PAGE否则它就返回SKIP_PAGE在第一节讨论的简单标签ttsimple由下列标签handler实现publicSimpleTagextendsTagSupportpublicintdoStartTagthrowsJspExceptiontrypageContextgetOutprint"Hello"catchExceptionexthrownewJspTagException"SimpleTag"exgetMessagereturnSKIP_BODYpublicintdoEndTagreturnEVAL_PAGEbody-content元素没有正文的标签必须用body-content元素声明它们的正文内容是空的body-contentemptybody-content自定义标签实验一概述JSP中有一块重要的技术自定义标签CustomTag最近这java自定义标签java自定义标签
几天在学习Struts的时候发现Struts中使用了很多自定义标签如htmlbean等所以我就做了个简单的试验学习一下这种技术首先介绍一下这种技术吧1优点取代了JSP中的Java程序并且可以重复使用方便不熟悉Java编程的网页设计人员2开发流程1编写JSP在JSP中使用自定义标签2在webxml中指定JSP中使用的标签的tld标签库描述文件文件的位置3tld文件中指定标签使用的类3自定义标签的分类1简单标签如mytagHelloWorld2带属性标签如imytagcheckinputdbnamemyBeangetDBName3带标签体的标签在自定义标签的起始和结束标签之间的部分为标签体BodyBody的内容可以是JSP中的标准标签也可以是HTML脚本语言或其他的自定义标签mytagcheckinputdbnamemyBeangetDBNamemytaglogmessageTableNamemytagcheckinput4可以被Script使用的标签定义了id和type属性的标签可以被标签后面的Scriptlet使用PpmytagconnectionidoraDBtypeDataSourcenameOracleoraDBgetConnection4接口及其他实际上自定义标签的处理类实现了TagHandler对象JSP技术在javaxservletjsptagext中提供了多个TagHandler接口JSP12中定义了TagBodyTagIterationTag接口在JSP20中新增了SimpleTag接口JSP还提供了上述接口的实现类TagSupportBodyTagSupport和SimpleTagSupportSimpleTagSupport只在JSP20中才有BodyTagSupport实现了BodyTagTag和IterationTag接口接口及其方法Tag接口方法SimpleTagdotageTagdoStartTagdoEndTagreleaseIterationTagdoStartTagdoAfterTagreleaseBodyTagdoStartTagdoEndTagreleasedoInitBodydoAfterBody下表引自Sun的JSP在线教程TagHandlerMethodsTagHandlerTypeMethodsSimpledoStartTagdoEndTagreleaseAttributesdoStartTagdoEndTagsetgetAttribute1NreleaseBodyEvaluationandNoInteractiondoStartTagdoEndTagreleaseBodyIterativeEvaluationdoStartTagdoAfterBodydoEndTagreleaseBodyInteractiondoStartTagdoEndTagreleasedoInitBodydoAfterBodyreleasePp下表中的EVAL是evaluate的缩写意思是评价估计求的值在下列的返回值中的意思是执行返回值意义SKIP_BODY表示不用处理标签体直接调用doEndTag方法SKIP_PAGE忽略标签后面的JSP内容EVAL_PAGE处理标签后继续处理JSP后面的内容EVAL_BODY_BUFFERED表示需要处理标签体EVAL_BODY_INCLUDE表示需要处理标签体但绕过setBodyContent和doInitBody方法EVAL_BODY_AGAIN对标签体循环处理具体用法可以查看其他参考资料Sun的Java教程相关部分二实验1试验介绍下面的实验就是基于上述开发流程开发的1在JSP中指定taglib的uritagliburi"HelloWorld"prefix"mytag"2在webxml中配置tag-locationtaglibtaglib-urihelloworldtaglib-uritaglib-locationWEB-INFhelloworldtldtaglib-locationtaglib3在tag-location中指定的tld文件中定义实现标签的处理类short-namemytagshort-nametagnamehelloworldnamePptag-classmytagHelloWorldTagtag-classbody-contentemptybody-contenttag4执行处理类mytagHelloWorldTag的doStartTag和doEndTag方法然后将结果输入到JSP中和JSP中的内容一起输出实际上自定义标签和JSP中的其他的内容被WebServer一起编译成servlet2完成后的试验的目录结构应用myjsp放在Tomcat的webapps下myjsp中包含J2EE标准目录结构WEB-INF和hellojspWEB-INF中包含子目录classes和lib及webxmltld文件可以放在WEB-INF下也可以放在WEB-INF的子目录下3开始实验31编写JSPhellojsp的源码--pagecontentType"texthtmlcharsetGBK"tagliburi"helloworld"prefix"mytag"htmlheadtitlejsp1titleheadbodybgcolor"ffffc0"h1下面显示的是自定义标签中的内容h1brbrPpmytaghelloworldmytaghelloworldbrformbodyhtml32编写webxmlwebxml的源码--xmlversion"10"encoding"UTF-8"--editedwithXMLSPYv5rel4UbyWilliams501--DOCTYPEweb-appPUBLIC"-SunMicrosystemsIncDTDWebApplication23EN"""web-apptaglibtaglib-uriHelloWorldtaglib-uritaglib-locationWEB-INFhelloworldtldtaglib-locationtaglibweb-app33编写tld文件helloworldtld的源码--xmlversion"10"encoding"ISO-8859-1"DOCTYPEtaglibPUBLIC"-SunMicrosystemsIncDTDJSPTagLibrary12EN"""Pptaglibtlib-version10tlib-versionjsp-version12jsp-versionshort-namemytagshort-nametagnamehelloworldnametag-classmytagHelloWorldTagtag-classbody-contentemptybody-contenttagPptaglib34编写标签实现类标签的实现类HelloWorldTagclass的源码--packagemytagimportjavaioIOExceptionimportjavaxservletjspimportjavaxservletjsptagextpublicclassHelloWorldTagextendsTagSupportpublicHelloWorldTagpublicintdoStartTagthrowsJspTagExceptionreturnEVAL_BODY_INCLUDEpublicintdoEndTagthrowsJspTagExceptiontrypageContextgetOutwrite"HelloWorld"catchIOExceptionexthrownewJspTagException"错误"returnEVAL_PAGE35执行效果部署到Tomcat的WebApps目录下启动Tomcat输入HelloWorld就是我们定义的标签部分的处理类输出的结果36注意这个试验我做了2天总是报错弄得很是灰心开始时以为tld文件或webxml文件配置不正确但怎么也找不到原因今晚我终于找到原因了是因为class文件一定要放在classes文件夹中我放到了lib中jar或servlet文件要放在lib目录中而class要放在classes目录中如果要放到lib目录中必须把mytag中的文件打包成jar文件然后把mytagjar放到lib目录中