自定义标签之 多个标签的嵌套

在实际开发中,往往需要多个标签的嵌套以完成一个任务,这样标签就存在父子关系。类似于下面:
None.gif < mt:switch  value ="test" >
None.gif    
< mt:case  value ="test1" >
None.gif            my    value is test1
None.gif    
</ mt:case >
None.gif    
< mt:case  value ="test2" >
None.gif            my value is  test2
None.gif    
</ mt:case >
None.gif
</ mt:switch >
在上面的标签中,<mt:switch>为父标签,<mt:case>为子标签,一个父标签可以嵌套多个子标签和HTML,Scriptlets等。
下面就来写一个这样的标签
ifTag.java
None.gif package  eflylab;
None.gif
import  javax.servlet.jsp. * ;
None.gif
import  javax.servlet.jsp.tagext. * ;
None.gif
import  java.util.Hashtable;
None.gif
import  java.io.Writer;
None.gif
import  java.io.IOException;
None.gif
ExpandedBlockStart.gifContractedBlock.gif
/** */ /**
InBlock.gif *if Tag
InBlock.gif *usage:<tag:if value=true>
InBlock.gif *      dot.gif
InBlock.gif *      </tag:if>
ExpandedBlockEnd.gif 
*/

None.gif
public   class  IfTag  extends  BodyTagSupport
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
private boolean value;
ExpandedSubBlockStart.gifContractedSubBlock.gif    
/** *//**
InBlock.gif     *设置属性的值。
ExpandedSubBlockEnd.gif     
*/

InBlock.gif    
public void setValue(boolean value)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
this.value=value;
ExpandedSubBlockEnd.gif    }

InBlock.gif    
ExpandedSubBlockStart.gifContractedSubBlock.gif    
/** *//**
InBlock.gif     *doStartTag方法,如果value为true,那么
InBlock.gif     *就计算tagbody的值,否则不计算body的值。
ExpandedSubBlockEnd.gif     
*/

InBlock.gif    
public int doStartTag() throws JspTagException
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
if(value)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif           System.out.println(
"value is true");
InBlock.gif           
return EVAL_BODY_INCLUDE; 
ExpandedSubBlockEnd.gif         }
  
InBlock.gif         
else
ExpandedSubBlockStart.gifContractedSubBlock.gif         
dot.gif
InBlock.gif           System.out.println(
"value is false");
InBlock.gif            
return SKIP_BODY; 
ExpandedSubBlockEnd.gif         }
 
ExpandedSubBlockEnd.gif      }

InBlock.gif         
InBlock.gif     
ExpandedSubBlockStart.gifContractedSubBlock.gif    
/** *//**
InBlock.gif     *覆盖doEndTag方法
ExpandedSubBlockEnd.gif     
*/

InBlock.gif    
public int doEndTag() throws JspTagException 
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
try 
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{  
InBlock.gif             
if(bodyContent != null)  
ExpandedSubBlockStart.gifContractedSubBlock.gif             
dot.gif{
InBlock.gif                 bodyContent.writeOut(bodyContent.getEnclosingWriter()); 
ExpandedSubBlockEnd.gif             }

ExpandedSubBlockEnd.gif        }
 
InBlock.gif        
catch(java.io.IOException e)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
throw new JspTagException("IO Error: " + e.getMessage());  
ExpandedSubBlockEnd.gif        }
   
InBlock.gif        
return EVAL_PAGE;  
ExpandedSubBlockEnd.gif    }

InBlock.gif      
ExpandedBlockEnd.gif}

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

因为IfTag标签中要嵌套了一个子标签,这个子标签用于输出一些信息到客户端。
下面的是IfTag中嵌套的子标签。
OutTag.java

None.gif package  eflylab;
None.gif
import  javax.servlet.jsp. * ;
None.gif
import  javax.servlet.jsp.tagext. * ;
None.gif
import  java.util.Hashtable;
None.gif
import  java.io.Writer;
None.gif
import  java.io.IOException;
None.gif
None.gif
public   class  OutTag  extends  TagSupport
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
private Object value;    
InBlock.gif    
ExpandedSubBlockStart.gifContractedSubBlock.gif    
/** *//**
InBlock.gif     *覆盖doStartTag方法
ExpandedSubBlockEnd.gif     
*/

InBlock.gif   
public void setValue(Object value)
ExpandedSubBlockStart.gifContractedSubBlock.gif   
dot.gif{
InBlock.gif        
this.value=value;
ExpandedSubBlockEnd.gif   }

InBlock.gif   
ExpandedSubBlockStart.gifContractedSubBlock.gif    
public int doStartTag() throws JspTagException dot.gif{
InBlock.gif        
return EVAL_BODY_INCLUDE;
ExpandedSubBlockEnd.gif    }

InBlock.gif    
ExpandedSubBlockStart.gifContractedSubBlock.gif    
/** *//**
InBlock.gif     *覆盖doEndTag方法
ExpandedSubBlockEnd.gif     
*/

InBlock.gif    
public int doEndTag()throws JspTagException
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif
InBlock.gif        
try
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            System.out.println(value);
InBlock.gif            pageContext.getOut().write(value.toString());
InBlock.gif            
ExpandedSubBlockEnd.gif        }

InBlock.gif        
catch(IOException ex)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
throw new JspTagException("Fatal error:hello tag conld not write to JSP out");
ExpandedSubBlockEnd.gif        }

InBlock.gif        
return EVAL_PAGE;
ExpandedSubBlockEnd.gif    }

InBlock.gif      
ExpandedBlockEnd.gif}
OutTag就是一个简单的不带Body的标签,它主要向客户端输出一些信息。
下面是在标签描述文件中的声明,加入以下内容
None.gif       < tag >     
None.gif        
< name > if </ name >
None.gif    
< tag-class > eflylab.IfTag </ tag-class >
None.gif    
< body-content > jsp </ body-content >
None.gif        
< attribute >
None.gif          
< name > value </ name >
None.gif          
< required > true </ required >
None.gif          
< rtexprvalue > true </ rtexprvalue >
None.gif      
</ attribute >
None.gif    
</ tag >
None.gif   
< tag >     
None.gif        
< name > out </ name >
None.gif    
< tag-class > eflylab.OutTag </ tag-class >
None.gif    
< body-content > jsp </ body-content >
None.gif        
< attribute >
None.gif          
< name > value </ name >
None.gif          
< required > true </ required >
None.gif          
< rtexprvalue > true </ rtexprvalue >
None.gif      
</ attribute >
None.gif     
</ tag >  
测试代码:
ExpandedBlockStart.gif ContractedBlock.gif <% dot.gif @ taglib uri="/demotag" prefix="mt"  %>
None.gif
< html >
None.gif
< head >
None.gif
< title > vcorwork  tag </ title >
None.gif
< meta  http-equiv ="Content-Type"  content ="text/html; charset=gb2312" >
None.gif
</ head >
None.gif
< body >
None.gif
< HR >
None.gif协作标签
< br >
ExpandedBlockStart.gifContractedBlock.gif 
<% dot.gif
InBlock.gif 
boolean test=true;
InBlock.gif 
String outValue="HelloWorld!";
ExpandedBlockEnd.gif 
%>
None.gif    
< mt:if  value ="<%=test%>" >
None.gif      
< mt:out  value ="<%=outValue%>" >
None.gif      这是mt:outdot.gif>打印出的内容。
None.gif      
</ mt:out >
None.gif    
</ mt:if >
None.gif
None.gif 
< HR >   
None.gif 
None.gif
< mt:if  value ="false" >
None.gif     
< mt:out  value ="<%=outValue%>" >
None.gif          这些内容会显示在客户端。
None.gif       
</ mt:out >
None.gif
</ mt:if >
None.gif
None.gif
< br >
None.gif 
</ BODY >   
None.gif
</ HTML >
运行:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值