欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

自定义标签

程序员文章站 2022-04-25 21:50:05
...
http://www.cnblogs.com/eflylab/archive/2007/01/17/623163.html
自定义标签之 多个标签的嵌套
在实际开发中,往往需要多个标签的嵌套以完成一个任务,这样标签就存在父子关系。类似于下面:
<mt:switch value="test">
    <mt:case value="test1">
            my    value is test1
    </mt:case>
    <mt:case value="test2">
            my value is  test2
    </mt:case>
</mt:switch>
在上面的标签中,<mt:switch>为父标签,<mt:case>为子标签,一个父标签可以嵌套多个子标签和HTML,Scriptlets等。
下面就来写一个这样的标签
ifTag.java
package eflylab;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
import java.util.Hashtable;
import java.io.Writer;
import java.io.IOException;

/**
*if Tag
*usage:<tag:if value=true>
*     
*      </tag:if>
*/
public class IfTag extends BodyTagSupport
{
    private boolean value;
    /**
     *设置属性的值。
     */
    public void setValue(boolean value)
    {
        this.value=value;
    }
   
    /**
     *doStartTag方法,如果value为true,那么
     *就计算tagbody的值,否则不计算body的值。
     */
    public int doStartTag() throws JspTagException
    {
        if(value)
        {
           System.out.println("value is true");
           return EVAL_BODY_INCLUDE;
         } 
         else
         {
           System.out.println("value is false");
            return SKIP_BODY;
         }
      }
        
    
    /**
     *覆盖doEndTag方法
     */
    public int doEndTag() throws JspTagException
    {
        try
        { 
             if(bodyContent != null) 
             {
                 bodyContent.writeOut(bodyContent.getEnclosingWriter());
             }
        }
        catch(java.io.IOException e)
        {
            throw new JspTagException("IO Error: " + e.getMessage()); 
        }  
        return EVAL_PAGE; 
    }
     
}

Value为IfTag的属性。当为真时,那么就计算IfTagBody;如果为假,就忽略

因为IfTag标签中要嵌套了一个子标签,这个子标签用于输出一些信息到客户端。
下面的是IfTag中嵌套的子标签。
OutTag.java
package eflylab;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
import java.util.Hashtable;
import java.io.Writer;
import java.io.IOException;

public class OutTag extends TagSupport
{
    private Object value;   
   
    /**
     *覆盖doStartTag方法
     */
   public void setValue(Object value)
   {
        this.value=value;
   }
  
    public int doStartTag() throws JspTagException {
        return EVAL_BODY_INCLUDE;
    }
   
    /**
     *覆盖doEndTag方法
     */
    public int doEndTag()throws JspTagException
    {

        try
        {
            System.out.println(value);
            pageContext.getOut().write(value.toString());
           
        }
        catch(IOException ex)
        {
            throw new JspTagException("Fatal error:hello tag conld not write to JSP out");
        }
        return EVAL_PAGE;
    }
     
}
OutTag就是一个简单的不带Body的标签,它主要向客户端输出一些信息。
下面是在标签描述文件中的声明,加入以下内容
     <tag>   
        <name>if</name>
    <tag-class>eflylab.IfTag</tag-class>
    <body-content>jsp</body-content>
        <attribute>
          <name>value</name>
          <required>true</required>
          <rtexprvalue>true</rtexprvalue>
      </attribute>
    </tag>
   <tag>   
        <name>out</name>
    <tag-class>eflylab.OutTag</tag-class>
    <body-content>jsp</body-content>
        <attribute>
          <name>value</name>
          <required>true</required>
          <rtexprvalue>true</rtexprvalue>
      </attribute>
     </tag>
测试代码:
<%@ taglib uri="/demotag" prefix="mt" %>
<html>
<head>
<title>vcorwork  tag</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<HR>
协作标签<br>
<%
boolean test=true;
String outValue="HelloWorld!";
%>
    <mt:if value="<%=test%>">
      <mt:out value="<%=outValue%>">
      这是mt:out>打印出的内容。
      </mt:out>
    </mt:if>

<HR> 

<mt:if value="false">
     <mt:out value="<%=outValue%>">
          这些内容会显示在客户端。
       </mt:out>
</mt:if>

<br>
</BODY> 
</HTML>
运行:
相关标签: jsp 自定义标签