jsp-定义带标签体的标签

来源:互联网 发布:淘宝网魅族 编辑:程序博客网 时间:2024/05/17 01:38
 jsp-定义带标签体的标签--loop
到目前为止,我们定义的都是不带标签体的自定义标签。要定义带标签体的类要继承BodyTagSupport类,BodyTagSupport扩展了TagSupport类,因此doStartTag和doEndTag方法和前面所讲的一样,除了这些方法外BodyTagSupport类还定义了两个重要方法,
1:doAfterBody-该方法每次处理完标签体都要执行。可以重载这个方法来处理自己的标签体,这个方法在结束时通常返回SKIP_BODY,指明没有标签体需要继续处理了,如果这个方法返回EVAL_BODY_TAG,则这个标签体被再次处理,并导致有一次doAfterBody的调用,这种处理将一直持续到doAfterBody返回SKIP_BODY
2:doInitBody--标签体初始化方法。
另外,BodyTagSupport定义了一个成员变量bodyContent,类型是BodyContent。BodyContent是JspWriter的一个子类,通过该类可以访问标签体,该类中存储了对标签体的处理结果,该类的主要方法如下
1:getEnclosingWriter--用来返回doStartTag和doEndTag方法使用的JspWriter对象。
2:getReader--将返回一个Reader可用来读取标签体
3:getString---会返回整个标签体包含的字符串
4:clearBody--清空存储的标签体处理结果

下面还是通过范例来掌握一下此类标签。
loopTag.java代码如下
package tag.test.date;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
import java.io.*;
public class loopTag extends BodyTagSupport{
 String userName;
 int count;
 public loopTag(){
  super();
 }
 public void setUserName(String userName){
  this.userName=userName;
 }
 public void setCount(int count){
  this.count=count;
 }
 public void doInitBody()throws JspTagException{
  System.out.println("doInitBody()");
 }
 public int doStartTag()throws JspTagException{
       System.out.println("doStartTag");
       if(count>0)
       {
        return EVAL_BODY_TAG;
       }
       else
       {
        return SKIP_BODY;
       }
 }
 public int doAfterBody()throws JspTagException{
  System.out.println("doAfterBody()");
  if(count-->=1)
  {
   try
   {
    JspWriter out=bodyContent.getEnclosingWriter();
    out.println(bodyContent.getString()+userName);
    out.println("<br>");
    bodyContent.clearBody();
   }
   catch(IOException e)
   {
    e.printStackTrace();
   }
   return(EVAL_BODY_TAG);
  }
  else
  {
   return (SKIP_BODY);
  }
 }
 public int doEndTag()throws JspTagException{
  System.out.println("doEndTag()");
  return EVAL_PAGE;
 }
}
编译好此文件后把所产生的类拷贝到C:/tomcat/webapps/ROOT/WEB-INF/classes/tag/test/date目录下,

然后编写.tld文件代码,代码如下
<?xml version="1.0" encoding="ISO-8859-1"?>
<taglib>
   <tlib-version>1.2</tlib-version>
   <jsp-version>1.2</jsp-version>
   <shor-name>mytag</shor-name>
   <description>the info test example</description>
   <tag>
     <name>loop</name>
     <tag-class>tag.test.date.loopTag</tag-class>
     <body-content>jsp</body-content>
       <attribute>
         <name>userName</name>
         <required>true</required>
         <rtexprvalue>true</rtexprvalue>
       </attribute>
        <attribute>
         <name>count</name>
         <required>true</required>
         <rtexprvalue>true</rtexprvalue>
       </attribute>
   </tag>
</taglib>
这里注意的是<body-content>jsp</body-content>中的内容必须为jsp

注意此文件存放的路径为C:/tomcat/webapps/ROOT/WEB-INF

在然后修改web.xml文件,也就是向web.xml中添加下面内容
    <taglib>
      <taglib-uri>/loop</taglib-uri>
      <taglib-location>/WEB-INF/loopTag.tld</taglib-location>
    </taglib>

最后就是编写loopTag.jsp文件了,代码如下
<%@ taglib uri="/loop" prefix="mytag" %>
<html>
  <head>
    <title>custom tag</title>
  </head>
  <body>
    <hr>
      <mytag:loop userName="hua" count="3">
        hello I'm
       </mytag:loop>
    </hr>
  </body>
</html>

注意:JSP代码中的<%@ taglib uri="/loop" prefix="mydate" %>uri值必须和web.xml中的<taglib-uri>/loop</taglib-uri>值一致。
做好上面的工作后,启动tomcat,在地址拦中输入http://localhost:8080/loopTag.jsp 后就会看到下面的结果
hello I'm hua
hello I'm hua
hello I'm hua
好通过上面的讲解你一定对JSP的带标签体自定义标签有了一定的了解,现在就自己动手来实验一下把。
如果有什么问题请联系QQ:154174583

你可以通过这个链接引用该篇文章:http://aspjavavbc.bokee.com/viewdiary.18893261.html

 
原创粉丝点击