基于JSP 自定义标签使用实例介绍

  添加JSP自定义标签:

  先添加一个tld文件到WEB-INF文件夹中

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

  <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"

  version="2.0">

  <description>myTag</description>

  <display-name>JSTL core</display-name>

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

  <short-name>cnweb</short-name>

  <uri>http://www.cnweb.cn</uri>

  <tag><!-- 一个tag标签对应一个自定义tag标签类 -->

  <description>MyTag</description>

  <name>when</name>

  <tag-class>cn.example.when</tag-class>

  <body-content>scriptless</body-content>

  <attribute>

  <name>test</name>

  <required>true</required>

  <rtexprvalue>true</rtexprvalue>

  </attribute>

  </tag>

  </taglib>

  引用规则:

  <%@ taglib uri="http://www.cnweb.cn" prefix="cnweb"%>

  定义错误处理页面:

  <error-page>

  <exception-type>java.lang.Exception</exception-type>

  <location>/errors/error.jsp</location>

  </error-page>

  <error-page>

  <error-code>404</error-code>

  <location>/errors/error1.jsp</location>

  </error-page>

  自定义标签执行流程:

  SimpleTagSupport

  /* Jsp引擎遇到简单类,实例化该类;

  * 调用setJspContext,把页面pageContext传递给标签处理类;

  * 调用setParent把父标传递进去,如果没有,传递null

  * 调用setJspBody方法,把封装了标签体JspFragment传递给标签处理器类

  * 执行页面中的自定义标签,doTag()方法;-->执行完成,销毁对象

  */

  JspFragment jf = this.getJspBody();

  jf.invoke(this.getJspContext().getOut());//如果不显示则不进行处理

  --------------------------------------------------------------------

  public class tagShowOrNot extends TagSupport {

  public int doStartTag() throws JspException {

  return Tag.EVAL_BODY_INCLUDE;//显示body

  //return Tag.SKIP_BODY;//隐藏body

  //Tag.EVAL_PAGE;//显示page

  //Tag.SKIP_PAGE;//隐藏page

  }}

  TagSupport

  /*编写一个实现TagSupport的类;

  *在tld文件中对标签处理器类进行描述(tld文件的位置:WEB-INF下)

  *在jsp页面中导入和使用标签

  *

  *jsp执行过程中遇到自定义标签时,先实例化该类;

  *然后执行方法:setPageContext()-->setParent()-->doStartTag()

  *如果有标签体,一般会执行标签体;doEndTag()-->整个标签执行完后一般会执行:release()

  *

  *控制整个jsp页面是否执行;

  *控制jsp页面某一部分内容是否执行;

  *控制jsp页面内容重复执行;

  *修改jsp页面内容输出;

  */

  //该方法在执行标签体后,执行doEndTag()方法之前执行,直到该方法返回IterationTag.SKIP_BODY;

  public int doAfterBody() throws JspException {

  time--;

  System.out.println("重复" + time);

  if (time > 0) {

  return IterationTag.EVAL_BODY_AGAIN;

  } else

  return IterationTag.SKIP_BODY;

  }