jsp 定制标签(Custom Tag)

  怎样自己定制标签(Custom Tag)

  (整理的学习笔记)

  步骤1、创建一个Tag handler class(标记处理器类)

  package javax.servlet.jsp.tagext

  开发空Body的标签处理器类----->1)implements Tag 2)extends TagSupport

  空Body的标签处理器类需要覆盖方法:

  doStartTag()

  返回值:Tag.SKIP_BODY

  doEndTag()

  返回值:

  1)Tag.EVAL_PAGE:让标签下面的内容继续执行

  2)Tag.SKIP_PAGE:让标签下面的内容不执行

  开发带Body的标签处理器类----->1)implements BodyTag 2)extends BodyTagSupport

  带Body的标签处理器类需要覆盖方法

  doStartTag()

  返回值:

  BodyTag.SKIP_BODY:执行后直接调用doEndTag()方法

  BodyTag.EVAL_BODY_INCLUDE:执行后直接调用doAfterBody()方法

  BodyTag.EVAL_BODY_BUFFERED:

  doEndTag()

  返回值:

  BodyTag.EVAL_PAGE:标签下面的内容继续执行

  BodyTag.SKIP_PAGE:标签下面的内容不执行

  doAfterBody()

  返回值:

  BodyTag.SKIP_BODY:执行后调用doEngTag()方法

  BodyTag.EVAL_BODY_AGAIN:执行后调用doAfterBody()方法

  步骤2、创建一个tld文件(tag library descriptor)

  一个XML格式的文件,用于对标记进行描述

  通常放在WEB-INF目录下 (/WEB-INF/*.tld)

  abc.tld

  <?xml version="1.0" encoding="UTF-8" ?>

  <!DOCTYPE taglib

  PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"

  "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">

  <!-- template test -->

  <taglib>

  <tlib-version>1.0</tlib-version>

  <jsp-version>1.2</jsp-version>

  <short-name>tagSample</short-name>

  <uri>/tagSample</uri>

  <description>A blank tag library template.</description>

  <tag>

  <name>welcome</name>

  <tag-class>tagapp.HelloTag</tag-class>

  <body-content>empty</body-content>

  <display-name>my first tag</display-name>

  <small-icon> </small-icon>

  <large-icon> </large-icon>

  <description> </description>

  <attribute>

  <name>name</name>

  <required>true</required>

  <rtexprvalue>true</rtexprvalue>

  <type>java.lang.String</type>

  </attribute>

  </tag>

  </taglib>

  步骤3.创建一个JSP文件

  <%@taglib uri="[tld_url]" prefix=""%>

  <%@taglib uri="/WEB-INF/abc.tld" prefix="mike"%>

  ...

  <mike:welcome name=""/>

  uri的值可以是:

  A、/WEB-INF/mytag.tld -----> uri="/WEB-INF/mytag.tld"

  B、tld文件中 <uri>/tagSample</uri> ------> uri="/tagSample"

  C、利用web.xml文件映射tld文件与taglib-uri的值 -----> uri="/abc"

  <taglib>

  <taglib-uri>/abc</taglib-uri>

  <taglib-location>/WEB-INF/mytag.tld</taglib-location>

  </taglib>

  带Body的标签处理器类的方法的注释:

  doStartTag()

  return value: SKIP_BODY 空BODY标记

  EVAL_BODY_INCLUDE 带BODY标记,执行流程进入doAfterBody

  EVAL_BODY_BUFFERED 带BODY标记,执行流程进入setBodyContent

  doEndTag()

  return value: SKIP_PAGE 忽略标记后剩余的JSP内容

  EVAL_PAGE 继续执行标记后剩余的JSP内容

  doAfterBody()

  return value: SKIP_BODY 结束doAfterBody()方法,流程进入doEndTag()

  EVAL_BODY_AGAIN 继续执行doAfterBody()方法

  SimpleTagSupport

  较好的练习题:

  一、

  1、模仿jstl标签库开发下列标签:

  1)<sql:setDataSource>

  属性有:

  driver:必须的,可以用表达式

  url;必须的,可以用表达式

  user:必须的,可以用表达式

  password:必须的,可以用表达式

  2)<sql:query>

  属性有:

  dataSource:必须的,可以用表达式

  sql:必须的,可以用表达式

  3)<sql:update>

  属性有:

  dataSource:必须的,可以用表达式

  sql:必须的,可以用表达式

  2、开发类似于<c:forEach>的标签,可以遍历一个集合对象(可选,如不能完成,可直接利用jstl的标签来完成)