




已阅读5页,还剩35页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章JSP自定义标记,本章主要内容,自定义标记的定义和分类自定义标记库的组成属性自定义标记处理体内容的自定义标记引入脚本变量的自定义标记嵌套自定义标记自定义标记库的发布,自定义标记的定义和分类自定义标记库的组成属性自定义标记处理体内容的自定义标记引入脚本变量的自定义标记嵌套自定义标记自定义标记库的发布,JSP自定义标记可以看成是对JSP标准动作标记的一种扩展。自定义标记是用户定义的以XML形式表示的JSP语言元素。当一个包含自定义标记的JSP页面被转化为Servlet时,Web容器自动调用自定义标记对应的标记处理程序来处理JSP页面。通过自定义标记,将一些重复性的、与特定应用相关的业务逻辑以文档化标记的形式进行调用,维护JSP以文档为中心的开发方式,最大程度地降低JSP页面的代码含量,提高JSP页面可维护性。,自定义标记由下面几部分组成,(1)标记名称。标记名称由两部分组成:前缀,用来区分不同标记库,不同的标记库具有不同的前缀;后缀,用来区分统一标记库中的不同标记。前缀和后缀之间以冒号隔开。如自定义标记表示使用的是mytag标记库中的hello标记。(2)属性。就像XML文件中的标记一样,自定义标记可以有属性,可以通过属性来动态控制标记的行为。如标记表示自定义标记hello带有一个name属性。(3)体内容:在标记的开始元素与结束元素之间的内容称为体内容。如自定义标记welcome的体内容为welcome。,根据对体内容的不同行为,可以将自定义标记分为两种类型:(1)处理体内容的标记。对体内容(即对在开始和结束标记之间的内容)进行操作的标记,它必须继承接口javax.Servlet.jsp.tagext.BodyTag。(2)简单标记。不对体内容进行处理的标记。它必须继承接口javax.Servlet.jsp.tagext.Tag。注意:简单标记仍然可以有体内容,只不过它的标记处理程序不能读取体内容。,简单标记的处理过程,(1)Web容器设置标记处理器的pageContext属性来初始化标记处理器。(2)Web容器设置标记处理器的parent属性(如果标记不被其他标记包含,则该属性为null)。(3)设置标记开发定义的标记参数,它是一个从XML标记属性到相应标记处理器bean的属性的映射过程。如被调用的标记为,则Web容器调用标记处理器的setName()方法。(4)Web容器调用标记处理器的doStartTag()方法。方法返回SKIP_BODY,引导Web容器忽略体内容;返回EVAL_BODY_INCLUDE,Web容器分析体内容及其包含的子标记。(5)Web容器调用标记处理器的doEndTag()方法。方法返回SKIP_PAGE,引导Web容器忽略页面其他内容;返回EVAL_PAGE,Web容器分析页面其他内容。(6)Web容器调用标记处理器的release()方法,释放标记处理执行期间使用的资源,重置标记处理器的属性状态等。,体标记的处理过程,(1)Web容器设置标记处理器的pageContext属性来初始化标记处理器。标记处理器使用这个属性访问使用该标记的JSP页面信息。(2)Web容器设置标记处理器的parent属性(如果标记不被其他标记包含,则该属性为null)。(3)设置标记开发定义的标记参数,它是一个从XML标记属性到相应标记处理器bean的属性的映射过程。如被调用的标记为,则Web容器调用标记处理器的setName()方法。(4)Web容器调用标记处理器的doStartTag()方法。方法返回SKIP_BODY,引导Web容器忽略体内容;返回EVAL_BODY_INCLUDE,Web容器分析体内容及其包含的子标记。(5)调用SetBodyContent()方法。(6)调用doInitBody()方法。方法返回SKIP_BODY,引导Web容器忽略体内容;返回EVAL_BODY_Tag,Web容器分析体内容及其包含的子标记。(7)调用doAfterBody()方法。方法返回SKIP_BODY,引导Web容器忽略体内容;返回EVAL_BODY_Tag,Web容器分析体内容及其包含的子标记。(8)Web容器调用标记处理器的doEndTag()方法。方法返回SKIP_PAGE,引导Web容器忽略页面其他内容;返回EVAL_PAGE,Web容器分析页面其他内容。(9)Web容器调用标记处理器的release()方法,释放标记处理执行期间使用的资源,重置标记处理器的属性状态等。,自定义标记库有以下优点,易于安装在多个项目上良好的扩展性容易维护快速的开发时间,自定义标记的定义和分类自定义标记库的组成属性自定义标记处理体内容的自定义标记引入脚本变量的自定义标记嵌套自定义标记自定义标记库的发布,简单的自定义标记由下面的元素组成,标记处理器标记库描述符(TLD文件),说明:标记扩展与JavaBean的相同点在于都是一些公共的Java模块,不是为某一页面或某一组页面设计的;区别在于,标记是从使用它的JSP页面中接收属性来控制自己的行为,而JavaBean的工作原理是:JSP页面请求获取JavaBean的属性进行动态显示。从这个意义上说,自定义标记与JSP页面的交互是一种主动性的交互,而JavaBean与JSP页面的交互是一种被动性的交互。,开发自定义标记的步骤,(1)编写标记处理器。(2)编写自定义标记库的描述文件TLD(实际是一个XML文件)。(3)编写应用标记的JSP页面。上述三个步骤之间没有顺序限制。,程序61:HelloTag.java,packagetag;importjavax.servlet.jsp.tagext.TagSupport;importjava.io.*;importjavax.servlet.jsp.JspWriter;publicclassHelloTagextendsTagSupportpublicintdoStartTag()tryJspWriterJSPWriterOutput=pageContext.getOut();JSPWriterOutput.print(HelloTag!);catch(IOExceptionioEx)System.out.println(IOExceptioninHelloTag+ioEx);return(SKIP_BODY);publicintdoEndTag()returnEVAL_PAGE;,程序62:helloTag.tld,1.01.2helloTag/WEB-INF/HelloTaghelloTagsimplehellotagstaghelloTagtag.HelloTagempty,程序63:Hello.jsp,HelloTagsPage直接引用标记库示例,改进:,为了灵活部署程序,标记库也可以采用间接引用的方式,即tablib指示符中的uri属性指向一个逻辑名称,而不再是标记指示文件的绝对位置。在web.xml中定义逻辑名称与TLD文件之间的映射:/hello/WEB-INF/HelloTag.tld,自定义标记的定义和分类自定义标记库的组成属性自定义标记处理体内容的自定义标记引入脚本变量的自定义标记嵌套自定义标记自定义标记库的发布,自定义标记可以有自己的属性。自定义标记通过属性来动态接收页面传递来的信息。属性一般在开始标记中定义,语法为attr=“value”。/标记的属性只能以String的形式传递。对于String属性,其get/setXXX比较简单,因为Web容器自动进行映射,如本例中的name属性。然而对于其他类型的标记属性,编程者必须在标记处理器中的get/set方法来添加代码进行手工转换,也可以在标记描述文件中进行配置。,publicclassAttributeHelloTagextendsTagSupportprivateStringname;privateStringsex;publicvoidsetname(Stringname)=name;publicStringgetname()returnname;publicStringgetsex()returnsex;publicvoidsetsex(Stringsex)this.sex=sex;publicintdoEndTag()Stringprefix=newString();tryJspWriterJSPWriterOutput=pageContext.getOut();if(sex.equals(male)prefix=Mr.;elseprefix=Miss;JSPWriterOutput.print(Hello!+prefix+name);catch(IOExceptionioEx)System.out.println(IOExceptioninHelloTag+ioEx);return(SKIP_BODY);,helloTaghelloTagsimplehellotagswithattributeattributeHelloTagtag.AttributeHelloTagemptynametruetruesextruetrue,AttributeHello.jsp,HelloTagsPage,在标记描述TLD文件中用4个参数来定义一个标记属性。Name定义标记属性的名称。Required定义这个属性是否为必须,true代表为必须。Rtexprvalue定义属性值是否可以为JSP表达式的计算结果,true或者yes表示允许Type代表标记属性的类型。对于静态类型数值通常为java.lang.String。如果元素rtexprvalue是true或者是yes,元素类型决定了返回值类型。,attributeHelloTagtag.AttributeHelloTagemptynametruetruesextruetrueboolean,publicbooleangetsex()returnsex;publicvoidsetsex(booleansex)this.sex=sex;publicintdoEndTag()Stringprefix=newString();try/使用JSPWriter获得JSP的输出对象JspWriterJSPWriterOutput=pageContext.getOut();if(sex)prefix=Mr.;elseprefix=Miss;JSPWriterOutput.print(Hello!+prefix+name);catch(IOExceptionioEx)System.out.println(IOExceptioninHelloTag+ioEx);return(SKIP_BODY);,自定义标记的定义和分类自定义标记库的组成属性自定义标记处理体内容的自定义标记引入脚本变量的自定义标记嵌套自定义标记自定义标记库的发布,由于属性只适合传递简单的字符串变量,如果传递的信息过于复杂,可采用标记体内容的方式。体内容可以传递变量,也可以包含脚本代码。标记体内容可以被容器作为JSP页面来进行处理(只要在TLD中把体内容设置为JSP),输出的内容在标记输出内容的前边还是后面取决于在doStarttag()或在doEndtag()进行标记处理。,javax.Servlet.jsp.tagext包中的BodyTagSupport类已经实现BodyTag接口。因此处理体内容的标记处理程序只需要覆盖它们要使用的方法。BodyTagSupport类继承了TagSupport并实现了BodyTag接口。这使得编写处理体内容的标记处理程序更容易了。BodyTagSupport定义了get/setBodyContent()方法和一个保护类型的bodyContent实例变量专门用来处理体内容。BodyTagSupport类重新定义了doStartTag()生存周期方法以返回EVAL_BODY_BUFFERED。通过返回EVAL_BODY_BUFFERED,doStartTag()请求创建一个新的缓冲区即一个BodyContent。BodyContent是一个包含运行时正文处理结果的缓冲区。BodyContent继承了JSPWriter并作为标记正文的隐式输出。因此JSP容器创建BodyContent的一个实例,并且在处理标记的正文内容时,它写入这个实例而不是JSPWriter中。因此在标记中使用隐式对象输出时,实际上使用的是BodyContent对象而非JSPWriter。,程序6-10:logobodytag.javapackagetag;importjavax.servlet.http.*;importjavax.servlet.jsp.*;importjavax.servlet.jsp.tagext.*;publicclassLogoBodyTagextendsBodyTagSupport/自定义标记属性privateStringheading=null;privateStringimage=null;privateStringwidth=null;privateStringheight=null;publicintdoStartTag()throwsJspExceptiontryinth=newInteger(heading).intValue();if(!(h0,publicintdoEndTag()throwsJspExceptionJspWriterout=pageContext.getOut();StringimgDir=(HttpServletRequest)pageContext.getRequest().getContextPath()+;/获取体内容Stringmessage=getBodyContent().getString().trim();try/输出体内容out.println(+message.toUpperCase()+);catch(java.io.IOExceptionio)returnEVAL_PAGE;/doEndTag,/methodsdesignedtosetattributevaluespublicvoidsetHeading(Stringlevel)this.heading=level;publicvoidsetImage(Stringname)this.image=name;publicvoidsetWidth(Stringwidth)this.width=width;publicvoidsetHeight(Stringheight)this.height=height;/清空变量,避免标记重用产生问题publicvoidrelease()heading=null;image=null;width=null;height=null;/release,1.01.2logoTaglogoTagmylogotaglogotag.LogoBodyTagJSPThistagwritesalogoinsidetheJSP.headingtruetrueTheheadinglevelforthe
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 淡水养殖主题餐厅经营创新创业项目商业计划书
- 2025年无人机城市环境监测技术创新与治理
- 森林火灾智能预警系统创新创业项目商业计划书
- 2025年5G技术对电子商务的影响
- 2025年文化遗产数字化保护与智慧旅游导览系统用户体验可行性研究
- 2025年5G技术的城市智能交通管理
- 2025年电焊工题库及答案
- 电商直播基地用户需求与消费行为分析报告
- 指导合作型医护关系
- 广水拖拉管施工方案
- 旅游景区管理协议书
- 如何提高采购效率培训课件
- 《飞行控制系统》课件
- 环境保护工程质量保证措施
- 2025外研版英语八年级上册多元化教学计划
- 新团员培训第一课:青年你为什么要入团
- 公司6s管理制度
- 消防系统施工方案
- 台湾问题演讲稿
- 银行员工消保知识培训
- 2025年防范电信网络诈骗知识竞赛题库及答案
评论
0/150
提交评论