已阅读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页面 上述三个步骤之间没有顺序限制 程序6 1 HelloTag java packagetag importjavax servlet jsp tagext TagSupport importjava io importjavax servlet jsp JspWriter publicclassHelloTagextendsTagSupport publicintdoStartTag try JspWriterJSPWriterOutput pageContext getOut JSPWriterOutput print HelloTag catch IOExceptionioEx System out println IOExceptioninHelloTag ioEx return SKIP BODY publicintdoEndTag returnEVAL PAGE 程序6 2 helloTag tld 1 01 2helloTag WEB INF HelloTaghelloTagsimplehellotagstaghelloTagtag HelloTagempty 程序6 3 Hello jsp HelloTagsPage直接引用标记库示例 改进 为了灵活部署程序 标记库也可以采用间接引用的方式 即tablib指示符中的uri属性指向一个逻辑名称 而不再是标记指示文件的绝对位置 在web xml中定义逻辑名称与TLD文件之间的映射 hello WEB INF HelloTag tld 自定义标记的定义和分类自定义标记库的组成属性自定义标记处理体内容的自定义标记引入脚本变量的自定义标记嵌套自定义标记自定义标记库的发布 自定义标记可以有自己的属性 自定义标记通过属性来动态接收页面传递来的信息 属性一般在开始标记中定义 语法为attr value 标记的属性只能以String的形式传递 对于String属性 其get setXXX比较简单 因为Web容器自动进行映射 如本例中的name属性 然而对于其他类型的标记属性 编程者必须在标记处理器中的get set方法来添加代码进行手工转换 也可以在标记描述文件中进行配置 publicclassAttributeHelloTagextendsTagSupport privateStringname privateStringsex publicvoidsetname Stringname this name name publicStringgetname returnname publicStringgetsex returnsex publicvoidsetsex Stringsex this sex sex publicintdoEndTag Stringprefix newString try JspWriterJSPWriterOutput 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 throwsJspException try inth newInteger heading intValue if h 0 publicintdoEndTag throwsJspException JspWriterout 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 headingtruetrueTheheadinglevelforthelogo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《神经内镜与神经导航辅助显微镜下经鼻蝶入路垂体瘤切除术的临床疗效对比》
- 《行政法上的终身禁业立法完善研究》
- 《未成年人订立电子合同问题研究》
- 《SIP-IMS终端中Presence业务的设计与实现》
- 2024年建筑装饰材料进口出口购销合同
- 《MicroRNA调控上皮-间质转化的机制及其对鼻咽癌细胞侵袭和迁移的影响》
- 《ASLNC12089作为ceRNA维持HIF-1α-HIF1AN相对平衡抑制非小细胞肺癌进展的作用机制》
- 《活性炭纤维改性及对As(Ⅴ)的吸附研究》
- 2024年影视作品联合出品与投资合同
- 专题05-2022年北京高考数学满分限时题集
- 公共机构节能工作培训课件-课件
- (部编版)二年级语文上册第四单元知识点复习课件
- 输变电工程绿色建造
- DB13T 5182-2020 湿地修复工程技术规程
- 学校安全风险隐患排查台账表
- 边坡工程支护设计计算书Word
- GLP-1受体激动剂与DPP-4抑制剂幻灯
- 证券投资学习题(霍文文)附答案
- 地铁综合监控施工组织设计
- 日用陶瓷项目企划书(模板参考)
- 专利入池协议
评论
0/150
提交评论