`
qcyycom
  • 浏览: 189533 次
社区版块
存档分类
最新评论

Java程序员从笨鸟到菜鸟之(二十)jsp自定义标签

    博客分类:
  • java
阅读更多

 

一、基本概念

1、标签(Tag)

标签是一种XML元素,通过标签可以使JSP网页变得简洁并且易于维护,还可以方便地实现同一个JSP文件支持多种语言版本。由于标签是XML元素,所以它的名称和属性都是大小写敏感的。

2、标签库(Tag library)

由一系列功能相似、逻辑上互相联系的标签构成的集合称为标签库。

3、标签库描述文件(Tag Library Descriptor)

标签库描述文件是一个XML文件,这个文件提供了标签库中类和JSP中对标签引用的映射关系。它是一个配置文件,和web.xml是类似的。

4、标签处理类(Tag Handle Class)

标签处理类是一个Java类,这个类继承了TagSupport或者扩展了SimpleTag接口,通过这个类可以实现自定义JSP标签的具体功能。

二、自定义JSP标签的格式

1、为了使到JSP容器能够使用标签库中的自定义行为,必须满足以下两个条件:

<% @ taglib prefix=”someprefix” uri=”/sometaglib” %>

1)从一个指定的标签库中识别出代表这种自定义行为的标签;
2)找到实现这些自定义行为的具体类。

第一个必需条件-找出一个自定义行为属于那个标签库-是由标签指令的前缀(Taglib Directive's Prefix)属性完成,所以在同一个页面中使用相同前缀的元素都属于这个标签库。每个标签库都定义了一个默认的前缀,用在标签库的文档中或者页面中插入自定义标签。所以,你可以使用除了诸如jsp,jspx,java,servlet,sun,sunw(它们都是在JSP白皮书中指定的保留字)之类的前缀。  

uri属性满足了以上的第二个要求。为每个自定义行为找到对应的类。这个uri包含了一个字符串,容器用它来定位TLD文件。在TLD文件中可以找到标签库中所有标签处理类的名称。

2、当web应用程序启动时,容器从WEB-INF文件夹的目录结构的META-INF搜索所有以.tld结尾的文件。也就是说它们会定位所有的TLD文件。对于每个TLD文件,容器会先获取标签库的URI,然后为每个TLD文件和对应的URI创建映射关系。

JSP页面中,我们仅需通过使用带有URI属性值的标签库指令来和具体的标签库匹配。

三、自定义JSP标签的处理过程

1、在JSP中引入标签库

<% @ taglib prefix=”taglibprefix” uri=”tagliburi” %>

2、在JSP中使用标签库标签

3Web容器根据第二个步骤中的prefix,获得第一个步骤中声明的tagliburi属性值

4Web容器根据uri属性在web.xml找到对应的元素

5.从元素中获得对应的元素的值 

6Web容器根据元素的值从WEB-INF/目录下找到对应的.tld文件

7.从.tld文件中找到与tagname对应的元素 

8.凑元素中获得对应的元素的值 

9Web容器根据元素的值创建相应的tag handle class的实例 

10. Web容器调用这个实例的doStartTag/doEndTag方法完成相应的处理。

四、创建和使用一个Tag Library的基本步骤

1、创建标签的处理类(Tag Handler Class)

2、创建标签库描述文件(Tag Library Descrptor File)

3、在web.xml文件中配置元素 4.JSP文件中引人标签库

五、TagSupport类简介

1、处理标签的类必须扩展javax.servlet.jsp.TagSupport

2TagSupport类的主要属性:

A.parent属性:代表嵌套了当前标签的上层标签的处理类;

B.pageContex属性:代表Web应用中的javax.servlet.jsp.PageContext对象;

3JSP容器在调用doStartTag或者doEndTag方法前,会先调用setPageContextsetParent方法,设置pageContextparent。因此在标签处理类中可以直接访问pageContext变量;

4、在TagSupport的构造方法中不能访问pageContext成员变量,因为此时JSP容器还没有调用setPageContext方法对pageContext进行初始化。

六、TagSupport处理标签的方法

1TagSupport类提供了两个处理标签的方法:

public int doStartTag() throws JspException
public int doEndTag() throws JspException

2doStartTag:但JSP容器遇到自定义标签的起始标志,就会调用doStartTag()方法。

doStartTag()方法返回一个整数值,用来决定程序的后续流程。

A.Tag.SKIP_BODY:表示?>…之间的内容被忽略;

B.Tag.EVAL_BODY_INCLUDE:表示标签之间的内容被正常执行。

3doEndTag:但JSP容器遇到自定义标签的结束标志,就会调用doEndTag()方法。doEndTag()方法也返回一个整数值,用来决定程序后续流程。

A.Tag.SKIP_PAGE:表示立刻停止执行网页,网页上未处理的静态内容和JSP程序均被忽略任何已有的输出内容立刻返回到客户的浏览器上。

B.Tag_EVAL_PAGE:表示按照正常的流程继续执行JSP网页。

下面来看一个实例:

1、修改web.xml文件,增加自定义标签支持。

[html] view plaincopy
  1. <jsp-config>    
  2.   
  3.   <taglib>    
  4.   
  5.       <taglib-uri>/tld/helloworld</taglib-uri>    
  6.   
  7.       <taglib-location>/WEB-INF/tlds/helloworld.tld</taglib-location>    
  8.   
  9.   </taglib>    
  10.   
  11. </jsp-config>     


2、创建标签库TLD文件 tlds\helloworld.tld 。

[html] view plaincopy
  1. <?xml version="1.0" encoding="UTF-8"?>    
  2.   
  3. <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"    
  4.   
  5. "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">       
  6.   
  7. <taglib>    
  8.   
  9.    <tlib-version>1.0</tlib-version><!-- 标签库的版本 -->    
  10.   
  11.   <jsp-version>1.2</jsp-version><!-- 这个标签库要求的JSP规范版本 -->    
  12.   
  13.   <short-name>mytag</short-name><!-- JSP页面编写工具可以用来创建助记名的可选名字 -->    
  14.   
  15.    <tag>    
  16.   
  17.       <name>helloworld</name><!-- 唯一标签名 -->    
  18.   
  19.    <tag-class>com.yd.mytag.HelloWorldTag</tag-class><!-- 标签HelloWorldTag类的完全限定名 -->    
  20.   
  21.      <body-content>empty</body-content><!-- 正文内容类型 -->    
  22.   
  23.    </tag>    
  24.   
  25. </taglib>    


这里注意:web.xml和xxx.tld这两个XML文件的头信息的版本匹配很重要,否则会导致页面报错找不到标签 。

3、创建标签处理程序类 HelloWorldTag(重写doStartTag和doEndTag方法)。

[html] view plaincopy
  1. package com.yd.mytag;    
  2.     
  3.   
  4. import java.io.IOException;    
  5.   
  6. import javax.servlet.jsp.JspException;    
  7.   
  8. import javax.servlet.jsp.JspTagException;    
  9.   
  10. import javax.servlet.jsp.tagext.TagSupport;    
  11.   
  12. /**   
  13.   
  14.  * TagSupport与BodyTagSupport的区别:   
  15.   
  16.  * 主要看标签处理类是否要读取标签体的内容和改变标签体返回的内容,如果不需要就用TagSupport,否则就用BodyTagSupport   
  17.   
  18.  * 用TagSupport实现的标签,都可以用BodyTagSupport来实现,因为BodyTagSupport继承了TagSupport    
  19.  */    
  20.   
  21. public class HelloWorldTag extends TagSupport {    
  22.   
  23.     private static final long serialVersionUID = 3174234039143531070L;    
  24.   
  25.     @Override    
  26.   
  27.     public int doStartTag() throws JspException {//这个方法不用所以直接返回值    
  28.   
  29.         return EVAL_BODY_INCLUDE;    
  30.   
  31.     }    
  32.   
  33.     @Override    
  34.   
  35.     public int doEndTag() throws JspException {//重点在这个方法上    
  36.   
  37.        try {    
  38.   
  39.             pageContext.getOut().write("Hello World!");//标签的返回值      
  40.   
  41.         } catch (IOException ex) {    
  42.   
  43.            throw new JspTagException("错误");    
  44.   
  45.         }    
  46.   
  47.         return EVAL_PAGE;    
  48.   
  49.     }    
  50.   
  51. }    


补充: 

doStartTag()方法是遇到标签开始时会呼叫的方法,其合法的返回值是EVAL_BODY_INCLUDE与SKIP_BODY,前者表示将显示标签间的文字,后者表示不显示标签间的文字。

doEndTag()方法是在遇到标签结束时呼叫的方法,其合法的返回值是EVAL_PAGE与SKIP_PAGE,前者表示处理完标签后继续执行以下的JSP网页,后者是表示不处理接下来的JSP网页。

doAfterBody(),这个方法是在显示完标签间文字之后呼叫的,其返回值有EVAL_BODY_AGAIN与SKIP_BODY,前者会再显示一次标签间的文字,后者则继续执行标签处理的下一步。

EVAL_BODY_INCLUDE:把Body读入存在的输出流中,doStartTag()函数可用。

EVAL_PAGE:继续处理页面,doEndTag()函数可用。

SKIP_BODY:忽略对Body的处理,doStartTag()和doAfterBody()函数可用。

SKIP_PAGE:忽略对余下页面的处理,doEndTag()函数可用。

EVAL_BODY_BUFFERED:申请缓冲区,由setBodyContent()函数得到的BodyContent对象来处理tag的body,如果类实现了BodyTag,那么doStartTag()可用,否则非法。

更多信息请查看 java进阶网 http://www.javady.com

分享到:
评论

相关推荐

    java程序员-从笨鸟到菜鸟.pdf

    java程序员-从笨鸟到菜鸟.pdf

    JAVA程序员 从笨鸟到菜鸟.pdf

    曹胜欢在《JAVA程序员 从笨鸟到菜鸟.pdf》中分享了他个人学习Java的经历,从迷茫到逐渐成长的过程。他强调了自学的重要性,并鼓励初学者不要怕走弯路,同时希望自己的经验可以帮助到同样在学习Java的初学者。 2. ...

    [网盘]java程序员由菜鸟到笨鸟.pdf

    ### Java程序员成长之路——从菜鸟到笨鸟 #### 一、引言 《Java程序员由菜鸟到笨鸟》是一本由曹胜欢编写的书籍,旨在帮助初学者掌握Java编程的基础知识,并逐步进阶至更高级的应用场景。本书不仅适合初学者作为...

    java程序员从笨鸟到菜鸟

    ### Java程序员从笨鸟到菜鸟 #### 一、开发环境搭建与基本语法 ##### 开发环境搭建 在开始Java的学习之前,首先需要搭建一个合适的开发环境。这通常涉及到以下步骤: 1. **JDK(Java Development Kit)安装**:...

    Java程序员由菜鸟到笨鸟学习文档

    Java程序员的成长之路是一个充满挑战与探索的过程,从初学者到熟练掌握各项技能,需要系统性的学习和实践。"Java程序员由菜鸟到笨鸟学习文档"就是这样一个旨在帮助初入Java世界的学习者逐步进阶的资源。它覆盖了从...

    《Java程序员-从笨鸟到菜鸟》PDF下载

    资源名称:《Java程序员-从笨鸟到菜鸟》PDF 下载资源目录:作者简介:..........................................................................................................................................

    java程序员由菜鸟到笨鸟

    java程序员由菜鸟到笨鸟 一本值得java程序员看的书籍 给大家分享一下 喜欢的评个好评 谢谢

    [网盘]java程序员由菜鸟到笨鸟.pdf.2018_03_19

    根据提供的文件信息,“Java程序员由菜鸟到笨鸟”是一本旨在帮助初学者成长为合格Java开发者的书籍。本书作者为曹胜欢,发布日期为2018年3月19日。下面将从多个角度对本书涉及的重要知识点进行概述。 ### 一、Java...

    [网盘]java程序员由菜鸟到笨鸟.pdf.2018_03_17

    根据提供的文件信息,“Java程序员由菜鸟到笨鸟”是一本旨在帮助初学者成长为合格Java开发者的书籍。本书作者为曹胜欢,发布日期为2018年3月17日。以下是从该书的标题、描述以及部分可能包含的内容中提炼出的关键...

    黑马程序员-Java语言进阶-源码、教程笔记.zip

    day01_Object类、常用API day02_Collection、泛型 day03_List、Set、数据结构、Collections day04_Map,斗地主案例 day05_异常,线程 day06_线程、同步 day07_等待与唤醒案例、线程池、Lambda...Java基础小节练习题答案

    java游戏笨鸟

    《Java游戏:笨鸟》(也称为FlappyBird)是一款基于Java编程语言开发的简单游戏,旨在帮助初学者更好地理解和掌握Java编程基础。这款游戏的实现涉及了许多Java编程的关键概念和技术,下面将对这些知识点进行详细阐述...

Global site tag (gtag.js) - Google Analytics