JSP自定义标签_第1页
JSP自定义标签_第2页
JSP自定义标签_第3页
JSP自定义标签_第4页
JSP自定义标签_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、主题:主题: JSP是一种是一种Web开发语言,是一种基于开发语言,是一种基于Java的技的技 术。术。JSP页面与传统的页面与传统的HTML语言有些类似,也由一语言有些类似,也由一 些标签组成。所不同的是,它是一种在服务端动态些标签组成。所不同的是,它是一种在服务端动态 生成生成Web页面的技术,而不仅仅是像页面的技术,而不仅仅是像HTML语言的语言的 静态显示。静态显示。 JSP页面可以将内容与显示分离。它可以通过类页面可以将内容与显示分离。它可以通过类 似似HTML页面的标签来将页面作统筹规划,然后再页面的标签来将页面作统筹规划,然后再 将动态生成的内容嵌入到各个标签当中去。通过服将动态

2、生成的内容嵌入到各个标签当中去。通过服 务端的务端的JSP引擎,生成新的内容并以引擎,生成新的内容并以HTML格式发送格式发送 到客户端浏览器中。到客户端浏览器中。 随着随着Web应用开发技术的不断发展,及业务展应用开发技术的不断发展,及业务展 显的愈加复杂,传统的显的愈加复杂,传统的JSP页面在开发进度和效率页面在开发进度和效率 上已经不再能满足需求。如何将业务逻辑代码与上已经不再能满足需求。如何将业务逻辑代码与 展现代码分离,使代码更易于维护和修改,成了展现代码分离,使代码更易于维护和修改,成了 JSP Web开发领域的一个瓶颈。开发领域的一个瓶颈。 JavaBean组件技术将业务逻辑进行

3、了封装,提组件技术将业务逻辑进行了封装,提 高了可复用性,降低了维护高了可复用性,降低了维护JSP成本。那么在页面成本。那么在页面 展现方面,展现方面,JSP是否也提供了一种机制,使得展现是否也提供了一种机制,使得展现 代码封装后,可以进行复用?代码封装后,可以进行复用? JSP标签库是生成脚本的一种机制。标签库是生成脚本的一种机制。 标签是规划页面的工具。在编写页面时,经标签是规划页面的工具。在编写页面时,经 常会碰到一些基本的页面标签。如编辑表格标常会碰到一些基本的页面标签。如编辑表格标 签签“”,页面控件标,页面控件标 签签”“及在及在JSP开开 发中已经占有了很大比重的发中已经占有了很

4、大比重的JavaBean标签标签 “”等,这些都是页面默认配等,这些都是页面默认配 置的标签。置的标签。 自定义标签就是我们根据自己要求来制定、组合一些已存自定义标签就是我们根据自己要求来制定、组合一些已存 在的脚本代码,形成一个新的脚本代码。在的脚本代码,形成一个新的脚本代码。 自定义标签其实是一个自定义标签其实是一个Java类,他封装了一些标签代码,类,他封装了一些标签代码, 形成一个具有某个功能的新标签。形成一个具有某个功能的新标签。 封装为一个封装为一个Java类的好处:类的好处: 1.增加了可扩展性。我们可以在不同标签之间可以建立增加了可扩展性。我们可以在不同标签之间可以建立 起一个

5、继承关系,这样构建新的自定义标签时,可以对已有起一个继承关系,这样构建新的自定义标签时,可以对已有 的标签进行某种程度的升级或改进,而不需要重新创建,提的标签进行某种程度的升级或改进,而不需要重新创建,提 高了开发效率。高了开发效率。 2.增加了可复用性。我们可以将自定义标签打包成一个增加了可复用性。我们可以将自定义标签打包成一个 Java档案文件,以便在不同应用之间自由移植。档案文件,以便在不同应用之间自由移植。 login 标签处理类的规范由标签处理类的规范由Tag接口定义。如果要建立带标签体接口定义。如果要建立带标签体 的标签处理类,可以实现的标签处理类,可以实现BodyTag接口。接口

6、。BodyTag接口是接口是 Tag接口的子接口。接口的子接口。 为了简化开发,为了简化开发,JSP规范又定义了一些辅助类。例如:规范又定义了一些辅助类。例如:Tag 接口对应辅助类为接口对应辅助类为TagSupport类。类。BodyTag接口对应接口对应 BodyTagSupport类。类。 Tag接口中,主要定义的是和标签生命周期相关的方法和接口中,主要定义的是和标签生命周期相关的方法和 Tag接口常量接口常量 Tag接口方法接口方法 (1)public void setPageContext(PageContext pc) 当容器创建一个新的标签后,通过当容器创建一个新的标签后,通过s

7、etPageContext方法来设置标签的页面上下文。方法来设置标签的页面上下文。 (2)public void setParent(Tag t) 如果标签嵌套使用如果标签嵌套使用setParent方法设置这个标签的父标签,如果没有上一级嵌套,设置为方法设置这个标签的父标签,如果没有上一级嵌套,设置为 null。 (3)public Tag getParent() 如果标签嵌套,该方法用来获得父标签,如果不是,就不调用该类方法。如果标签嵌套,该方法用来获得父标签,如果不是,就不调用该类方法。 (4)public int doStartTag() throws JspException 调用调用

8、doStartTag方法,方法,JSP容器遇到自定义标签的起始标志时执行,这个方法可以返回容器遇到自定义标签的起始标志时执行,这个方法可以返回 两个整数值 EVAL_BODY_INCLUDE 和和 SKIP_BODY,当返回,当返回EVAL_BODY_INCLUDE 时,就计算标签体,如果返回时,就计算标签体,如果返回 SKIP_BODY时,就不计算标签体。时,就不计算标签体。 (5) public int doEndTag() throws JspException 调用调用doEndTag方法,方法,JSP容器遇到自定义标签的结束标志时执行,这个方法可以返回容器遇到自定义标签的结束标志时执

9、行,这个方法可以返回 EVAL_PAGE 和和SKIP_PAGE,当返回,当返回 EVAL_PAGE 时,容器将在标签结束时继续计算时,容器将在标签结束时继续计算 JSP页面的其他部分,如果返回页面的其他部分,如果返回SKIP_PAGE,容器将在标签结束时停止计算,容器将在标签结束时停止计算JSP页面的页面的 其他部分。其他部分。 (6)public void release() 调用调用 release 方法释放标签处理程序占用的资源。方法释放标签处理程序占用的资源。 Tag接口常量接口常量 1.public static final int EVAL_BODY_INCLUDE 该常量作为该

10、常量作为doStartTag()方法的返回值,表示标签体要被执行,方法的返回值,表示标签体要被执行, 执行结果输出到当前的输出流中。执行结果输出到当前的输出流中。 2.public static final int SKIP_BODY 该常量作为该常量作为doStartTag()方法的返回值,表示忽略标签体。方法的返回值,表示忽略标签体。 3.public static final int EVAL_PAGE 该常量作为该常量作为doEndTag()方法的返回值,表示方法的返回值,表示JSP页面的余下部分页面的余下部分 将继续执行。将继续执行。 4.public static final in

11、t SKIP_PAGE 该常量作为该常量作为doEndTag()方法的返回值,表示忽略方法的返回值,表示忽略JSP页面的余下页面的余下 部分。部分。 package my.date; import java.io.*; import java.util.*; import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; public class DisplayDate extends TagSupport public DisplayDate() super();/调用父类的构造方法调用父类的构造方法 public int doS

12、tartTag() throws JspException JspWriter out = pageContext.getOut(); try out.print(new Date(); catch (IOException ioe) System.out.println(Failed to show date); return this.SKIP_BODY; 标签库描述文件(标签库描述文件(Tag Library Descriptor) 包含了自定义标签的描述信息。它把自定义标包含了自定义标签的描述信息。它把自定义标 签和对应的处理程序关联起来。一个标签库对签和对应的处理程序关联起来。一个标

13、签库对 应一个标签库描述文件,一个标签库描述文件应一个标签库描述文件,一个标签库描述文件 可以包含多个自定义标签的声明。可以包含多个自定义标签的声明。 1.2 1.2 date This taglib provides tag to show date. displayDate my.date.DisplayDate empty 三、在三、在web.xml文件中配置元素文件中配置元素 以下是在以下是在web.xml中加入对自定义标签库的引用中加入对自定义标签库的引用 date /WEB-INF/date.tld 四、在四、在JSP文件中引入标签库文件中引入标签库 Today is 以下是上例运

14、行的结果以下是上例运行的结果 package my.test; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.TagSupport; public class OutputTag extends TagSupport private String name = null;/对应于自定义标签的对应于自定义标签的name属性属性 public void setName(String name) = name; p

15、ublic int doEndTag() throws JspException try JspWriter out = pageContext.getOut(); out.print(Hello! + name); catch (Exception e) throw new JspException(e); return EVAL_PAGE; 1.0 1.2 test out my.test.OutputTag empty name false false date /WEB-INF/date.tld test /WEB-INF/test.tld Test Tag: 客户端客户端 Clien

16、t JSP服务器服务器 JSP-Server JSP页面页面 JSP-Page 标记库描述文件标记库描述文件 TLD 标记处理程序标记处理程序 TagClass JSP文件文件 web.xml文件文件 test /WEB-INF/test.tld test.tld文件文件 out my.test.OutputTag OutputTag.java文件文件 doStartTag()()/doEndTag()() 有了上面的概念作为基础,现在我给出两个简单有了上面的概念作为基础,现在我给出两个简单 的实例,一个是用传统的的实例,一个是用传统的JSP页面将内容显示,另页面将内容显示,另 一个是使用了自

17、定义标签的显示相同的页面内容,一个是使用了自定义标签的显示相同的页面内容, 这样好让我们对标签库有一个感性的了解,从中这样好让我们对标签库有一个感性的了解,从中 体会两者的区别和相同之处。体会两者的区别和相同之处。 传统的传统的JSP 注册用户注册用户 用户名用户名 密密码码 确认密码确认密码 地址地址 电话电话 package my.tag; import java.io.IOException; import javax.servlet.jsp.JspTagException; import javax.servlet.jsp.JspWriter; import javax.servlet

18、.jsp.tagext.TagSupport; public class UserRegTag extends TagSupport public UserRegTag() public int doStartTag() throws JspTagException try JspWriter out = pageContext.popBody(); out.println(); out.println(用户名); out.println(); out.println(密码); out.println(); out.println(确认密码); out.println(); out.print

19、ln(地址); out.println(); out.println(电话); out.println(); out.println(); catch (IOException e) e.printStackTrace(); return EVAL_BODY_INCLUDE; public int doEndTag() throws JspTagException return EVAL_PAGE; 使用了标签库的使用了标签库的JSP 注册用户注册用户 标签库使得标签库使得JSP的的web应用程序非常易于维护,原因有:应用程序非常易于维护,原因有: (1)标签应用简单,对任何人而言都很容易使用

20、、易于理解。)标签应用简单,对任何人而言都很容易使用、易于理解。 (2)所有的程序逻辑代码都集中放在的标签处理器和)所有的程序逻辑代码都集中放在的标签处理器和JavaBeans中。中。 这意味着在升级代码时,无需要对每个使用该代码的页面进行修改,只需这意味着在升级代码时,无需要对每个使用该代码的页面进行修改,只需 要修改集中的代码文件便可。要修改集中的代码文件便可。 (3)如果需要加入新的功能,也无需修改任何已经存在的页面,可以)如果需要加入新的功能,也无需修改任何已经存在的页面,可以 在标签中加入额外的属性,从而引进新的行为,而其它旧的属性不变,这在标签中加入额外的属性,从而引进新的行为,而

21、其它旧的属性不变,这 样所有旧的页面还可以正常工作。样所有旧的页面还可以正常工作。 例如有一个让所有文本变蓝的标签:例如有一个让所有文本变蓝的标签: My Text 但在后来项目中,又想让蓝色变暗。可以保留原有的标签,只要为其但在后来项目中,又想让蓝色变暗。可以保留原有的标签,只要为其 增加一个新的属性:增加一个新的属性:shade ,如下所示:,如下所示: My Text 所有旧的标签仍然可以产生蓝色的文本,但现在还可以使用同一标签所有旧的标签仍然可以产生蓝色的文本,但现在还可以使用同一标签 来产生变暗的蓝色文本了。来产生变暗的蓝色文本了。 (4)标签提升了代码的重用性。那些经过多次测试和使

22、用的代码肯定)标签提升了代码的重用性。那些经过多次测试和使用的代码肯定 具有更少的具有更少的bug。所以,使用定制标签的。所以,使用定制标签的JSP页面也同样具有更少的缺陷,页面也同样具有更少的缺陷, 维护起来自然方便多了。维护起来自然方便多了。 目前目前Web开发使用的标签主要来自三个方面,一是开发使用的标签主要来自三个方面,一是 自己定制;二是在网上找一些别人发布的标签库;三是自己定制;二是在网上找一些别人发布的标签库;三是 Java本省提供的一套标签库,那就是本省提供的一套标签库,那就是JSTL(Java Standard Tags Library)。从名称上看,)。从名称上看,JSTL是一是一 个个Java标准标签库,因此在这三个方面里,标准标签库,因此在这三个方面里,JSTL可以可以 说是稳定性最高的选择。说是稳定性最高的选择。 JSTL是一个不断完善的开放是一个不断完善的开放 源代码的源代码的JSP标签库,是由标

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论