收藏 分享(赏)

第六章 JSP自定义标记.ppt

上传人:kpmy5893 文档编号:10097727 上传时间:2019-10-09 格式:PPT 页数:41 大小:2.16MB
下载 相关 举报
第六章 JSP自定义标记.ppt_第1页
第1页 / 共41页
第六章 JSP自定义标记.ppt_第2页
第2页 / 共41页
第六章 JSP自定义标记.ppt_第3页
第3页 / 共41页
第六章 JSP自定义标记.ppt_第4页
第4页 / 共41页
第六章 JSP自定义标记.ppt_第5页
第5页 / 共41页
点击查看更多>>
资源描述

1、第6章 JSP自定义标记,华北电力大学控制与计算机工程学院 主讲:赵 强 Mobile: 13611310168 email: ,本章主要内容,自定义标记的定义和分类自定义标记库的组成 属性自定义标记处理体内容的自定义标记引入脚本变量的自定义标记嵌套自定义标记自定义标记库的发布,JSP自定义标记可以看成是对JSP标准动作标记的一种扩展。自定义标记是用户定义的以XML形式表示的JSP语言元素。当一个包含自定义标记的JSP页面被转化为Servlet时,Web容器自动调用自定义标记对应的标记处理程序来处理JSP页面。 通过自定义标记,将一些重复性的、与特定应用相关的业务逻辑以文档化标记的形式进行调用

2、,维护JSP以文档为中心的开发方式,最大程度地降低了JSP页面的代码含量,提高JSP页面可维护性。,6.1 什么是自定义标记,6.1.2 自定义标记表示,(1)标记名称。标记名称由两部分组成:前缀,用来区分不同标记库,不同的标记库具有不同的前缀;后缀,用来区分统一标记库中的不同标记。前缀和后缀之间以冒号隔开。如自定义标记表示使用的是mytag标记库中的hello标记。 (2)属性。就像XML文件中的标记一样,自定义标记可以有属性,可以通过属性来动态控制标记的行为。如标记表示自定义标记hello带有一个name 属性。 (3)体内容。在标记的开始元素与结束元素之间的内容称为体内容。如自定义标记:

3、welcome其中体内容为“welcome”。,根据对体内容的不同行为,可以将自定义标记分为两种类型: (1)处理体内容的标记。对体内容(即对在开始和结束标记之间的内容)进行操作的标记,它必须继承接口javax.Servlet.jsp.tagext.BodyTag。 (2)简单标记。不对体内容进行处理的标记。它必须继承接口javax.Servlet.jsp.tagext.Tag。注意:简单标记仍然可以有体内容,只不过它的标记处理程序不能读取体内容。,6.1.3 简单标记的处理过程,(1)Web容器设置标记处理器的pageContext属性来初始化标记处理器。 (2)Web容器设置标记处理器的p

4、arent属性(如果标记不被其他标记包含,则该属性为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容器分析页面其他

5、内容。 (6)Web容器调用标记处理器的release()方法,释放标记处理执行期间使用的资源,重置标记处理器的属性状态等。,6.1.4 体标记的处理过程,(1)Web容器设置标记处理器的pageContext属性来初始化标记处理器。标记处理器使用这个属性访问使用该标记的JSP页面信息。 (2)Web容器设置标记处理器的parent属性(如果标记不被其他标记包含,则该属性为null)。 (3)设置标记开发定义的标记参数,它是一个从XML标记属性到相应标记处理器bean的属性的映射过程。如被调用的标记为,则Web容器调用标记处理器的setName()方法。 (4)Web容器调用标记处理器的doS

6、tartTag()方法。方法返回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()方法

7、。方法返回SKIP_PAGE,引导Web容器忽略页面其他内容;返回EVAL_PAGE,Web容器分析页面其他内容。 (9)Web容器调用标记处理器的release()方法,释放标记处理执行期间使用的资源,重置标记处理器的属性状态等。,6.1.5 自定义标记库有以下优点,易于安装在多个项目上; 良好的扩展性; 容易维护; 快速的开发时间。,自定义标记的定义和分类自定义标记库的组成 属性自定义标记 处理体内容的自定义标记引入脚本变量的自定义标记嵌套自定义标记自定义标记库的发布,6.2.1 简单的自定义标记库的组成,标记处理器标记处理器是一个执行自定义标记操作的Java对象。 标记库描述符(TLD文

8、件)标记库描述符文件是一个简单的XML文件,以.tld为后缀,文件保存在WEB-INF目录中或它的子目录中。,说明:标记扩展与JavaBean的相同点在于都是一些公共的Java模块,不是为某一页面或某一组页面设计的,区别在于:标记是从使用它的JSP页面中接收属性来控制自己的行为,而JavaBean的工作原理是:JSP页面请求获取JavaBean的属性进行动态显示。从这个意义上说,自定义标记与JSP页面的交互是一种主动性的交互,而JavaBean与JSP页面的交互是一种被动性的交互,因此自定义标记的自由度就大的多。,6.2.2 开发自定义标记的步骤,(1)编写标记处理器。 (2)编写自定义标记库

9、的描述文件TLD(实际是一个XML文件)。 (3)编写应用标记的JSP页面。上述三个步骤之间没有顺序限制。,程序61:HelloTag.java,package tag; import javax.servlet.jsp.tagext.TagSupport; import java.io.*; import javax.servlet.jsp.JspWriter; public class HelloTag extends TagSupport public int doStartTag() try /使用JSPWriter获得JSP的输出对象JspWriter JSPWriterOutput

10、 = pageContext.getOut();JSPWriterOutput.print(“Hello Tag!“); catch (IOException ioEx) System.out.println(“IOException in HelloTag “ + ioEx);return (SKIP_BODY); public int doEndTag() return EVAL_PAGE; ,程序62:helloTag.tld,1.01.2helloTag/WEB-INF/HelloTaghelloTagsimple hello tags taghelloTagtag.HelloTage

11、mpty,程序63:Hello.jsp,Hello Tags Page直接引用标记库示例,自定义标记的定义和分类自定义标记库的组成 属性自定义标记 处理体内容的自定义标记引入脚本变量的自定义标记嵌套自定义标记自定义标记库的发布,自定义标记可以有自己的属性。自定义标记通过属性来动态接收页面传递来的信息。属性一般在开始标记中定义,语法为 attr=“value”。 标记的属性只能以String的形式传递。对于String属性,其get/set XXX比较简单,因为Web容器自动进行映射,如本例中的name 属性。然而对于其他类型的标记属性,编程者必须在标记处理器中的get/set方法来添加代码进行

12、手工转换。,6.3.1属性自定义标记,在标记描述TLD文件中用4个参数来定义一个标记属性。 Name 定义标记属性的名称。 Required 定义这个属性是否为必须,true代表为必须。 Rtexprvalue 定义属性值是否可以为JSP表达式的计算结果,true或者yes表示允许 Type 代表标记属性的类型。对于静态类型数值通常为java.lang.String。如果元素rtexprvalue是true或者是yes,元素类型决定了返回值类型。,自定义标记的定义和分类自定义标记库的组成 属性自定义标记 处理体内容的自定义标记引入脚本变量的自定义标记嵌套自定义标记自定义标记库的发布,由于属性只

13、适合传递简单的字符串变量,如果传递的信息过于复杂,可采用标记体内容的方式。体内容可以传递变量,也可以包含脚本代码。标记体内容可以被容器作为JSP页面来进行处理(只要在TLD中把体内容设置为JSP),输出的内容在标记输出内容的前边还是后面取决于在doStarttag()或在doEndtag()进行标记处理。,javax.Servlet.jsp.tagext包中的BodyTagSupport 类已经实现BodyTag 接口。 因此处理体内容的标记处理程序只需要覆盖它们要使用的方法。BodyTagSupport 类继承了 TagSupport 并实现了 BodyTag 接口。这使得编写处理体内容的标

14、记处理程序更容易了。BodyTagSupport 定义了get/setBodyContent() 方法和一个保护类型的 bodyContent 实例变量专门用来处理体内容。 BodyTagSupport 类重新定义了doStartTag()生存周期方法以返回 EVAL_BODY_BUFFERED。 通过返回 EVAL_BODY_BUFFERED,doStartTag() 请求创建一个新的缓冲区即一个 BodyContent。 BodyContent是一个包含运行时正文处理结果的缓冲区。BodyContent 继承了 JSPWriter 并作为标记正文的隐式输出。因此JSP 容器创建 BodyC

15、ontent 的一个实例,并且在处理标记的正文内容时,它写入这个实例而不是JSPWriter 中。 因此在标记中使用隐式对象输出时,实际上使用的是 BodyContent 对象而非 JSPWriter。,自定义标记的定义和分类自定义标记库的组成 属性自定义标记 处理体内容的自定义标记引入脚本变量的自定义标记嵌套自定义标记自定义标记库的发布,在自定义标记中引入脚本变量,需要以下几个步骤: (1)实现一个TagExtraInfo子类来定义变量。 (2)在标记描述文件中引入TagExtraInfo子类。 (3)编写代码在标记处理器本身的页面上下文中引入变量。,VariableInfo(String

16、varName,String className,Boolean declare,int scope)来定义,构造函数各参数意义如下: varName:变量名称,JSP中用它来访问脚本变量。 className:类名称,用来定义变量类型。 declare:作为一个boolean参数,用来控制是否要创建一个新的变量。一般情况默认值为true。 Scope: 定义标记中变量的范围。自定义标记中定义的变量有三种类型的范围:Nested、AT_begin和AT_end。如果定义的范围是Nested,则Web容器只能在定义标记体中获取该变量;如果定义的范围是AT_begin,则只有在标记打开之后,Web

17、容器才能获取该变量;如果定义的范围是AT_end,则只有在标记关闭之后,Web容器才能获取该变量。,自定义标记的定义和分类自定义标记库的组成 属性自定义标记 处理体内容的自定义标记引入脚本变量的自定义标记嵌套自定义标记自定义标记库的发布,当一个标记完全被另一个标记包围时,就说它是嵌套的。可以对多个JSP标记进行嵌套引用,这样子标记就可以访问和存储父标记的数据和方法。子标记访问父标记需要使用BodyTagSupport类中的 findAccetorWithClass()方法和getParent()方法。,自定义标记的定义和分类自定义标记库的组成 属性自定义标记 处理体内容的自定义标记引入脚本变量的自定义标记嵌套自定义标记自定义标记库的发布,利用jar文件的标记库分发方式,整个标记库作为一个jar分发,所有标记处理类文件及标记库描述文件都放在jar中,而且标记库描述文件必须放到jar包的META-INF下。,END,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报