开发带Body的标签库

开发带Body的标签库

带有Body的Tag必须实现javax.servlet.jsp.tagext.BodyTag接口。
BodyTag的处理过程:
1.当容器创建一个新的标签实例后,通过setPageContext来设置标签的页面上下文。
2.使用setParent方法设置这个标签的上一级标签,如果没有上一级嵌套,设置为null。
3.设置标签的属性,这个属性在标签库描述文件中定义,如果没有定义属性,就不用调用此类方法。
4.调用doStartTag方法,这个方法可以返回EVAL_BODY_INCLUDE和SKIP_BODY,当返回EVAL_BODY_INCLUDE时,就计算标签的Body,如果返回SKIP_BODY,就不再计算标签的Body。
5.调用setBodyContent设置当前的BodyContent。
6.调用doInitBody,如果在计算BodyContent时需要进行一些初始化,就在这个方法中进行。
7.每次计算完BodyTag后调用doAfterBody,如果返回EVAL_BODY_TAG(新的为EVAL_BODY_AGAIN),就表示继续计算一次BodyTag,直到返回SKIP_BODY才继续执行第8步。
8.调用doEndTag方法,这个方法可以返回EVAL_PAGE或者SKIP_PAGE,当返回EVAL_PAGE时,容器将在标签结束时继续计算JSP页面其他的部分;如果返回SKIP_PAGE,容器将在标签结束时停止计算JSP页面其他的部分。
9.调用release()方法释放标签程序占用的任何资源。

下面是一个迭代器标签例子:
package com.rain.tag;

import Java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.tagext.BodyContent;
import javax.servlet.jsp.tagext.BodyTagSupport;

public class BodyTagExample extends BodyTagSupport {

 int counts;    //counts为迭代的次数
 
 public BodyTagExample(){
  super();
 }
 
 /*
  * 设置counts属性,这个方法由容器自动调用
  */
 public void setCounts(int c){
  this.counts=c;
 }
 
 @Override
 public int doAfterBody() throws JspException {
  // TODO Auto-generated method stub
  System.out.println("doAfterBody"+counts);
  if(counts>1){
   counts--;
   return EVAL_BODY_AGAIN;
  }else{
   return SKIP_BODY;
  }
 }

 @Override
 public int doEndTag() throws JspException {
  // TODO Auto-generated method stub
  System.out.println("doEndTag");
  try{
   if(bodyContent!=null){
    bodyContent.writeOut(bodyContent.getEnclosingWriter());
   }
  }catch(IOException e){
   throw new JspTagException("IO Error:"+e.getMessage());
  }
  return EVAL_PAGE;
 }

 @Override
 public void doInitBody() throws JspException {
  // TODO Auto-generated method stub
  System.out.println("doInitBody");
 }

 @Override
 public int doStartTag() throws JspException {
  // TODO Auto-generated method stub
  System.out.println("doStartTag");
  if(counts>0){
   return EVAL_BODY_AGAIN;
  }else{
   return SKIP_BODY;
  }
 }

 @Override
 public void setBodyContent(BodyContent arg0) {
  // TODO Auto-generated method stub
  System.out.println("setBodyContent");
  this.bodyContent=arg0;
 }
}

<?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>A tag library exercising SimpleTag handlers.</description>
        <tlib-version>1.0</tlib-version>
       
        <short-name>examples</short-name>
        <uri>/demotag</uri>
        <description>JSP应用开发</description>
        
          <tag>
          <name>loop</name>
          <tag-class>com.rain.tag.BodyTagExample</tag-class>
          <body-content>jsp</body-content>    Body-Content必须为JSP
          <attribute>
            <name>counts</name>                    定义中必须有setCounts(int counts)方法
            <required>true</required>               表示这个属性是必须的
            <rtexprvalue>true</rtexprvalue>       支持JSP表达式
          </attribute>
        </tag>
</taglib>

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
 <taglib>
   <taglib-uri>/demotag</taglib-uri>
   <taglib-location>/WEB-INF/mytag.tld</taglib-location>
 </taglib>
</web-app>

<%@ page language="Java" contentType="text/html; charset=UTF-8"%>
<%@ taglib uri="/demotag" prefix="bodytag" %>
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<bodytag:loop counts="5">
  现在时间是:<%=new Java.util.Date()%><br>
</bodytag:loop>
</body>
</html>

执行结果:
控制台打印出
doStartTag
setBodyContent
doInitBody
doAfterBody5
doAfterBody4
doAfterBody3
doAfterBody2
doAfterBody1
doEndTag
页面显示
现在时间是:Mon Jan 22 14:52:43 CST 2007
现在时间是:Mon Jan 22 14:52:43 CST 2007
现在时间是:Mon Jan 22 14:52:43 CST 2007
现在时间是:Mon Jan 22 14:52:43 CST 2007
现在时间是:Mon Jan 22 14:52:43 CST 2007

你可能感兴趣的:(开发带Body的标签库)