自定义标签之HelloWorld

标签扩展是一个JAVA类,它是运行一个或者二个接口的JAVABEAN。在JSP规范内标签具有比JAVABEAN更丰富的运行时协议,因为
1:初始化可以包含属性,没有这些属性标签就不能运行 ,而JAVABEAN的构造 函数 参数 为空
2:设置和获取属性不会涉及到所有的类,在BEAN中只有少量的逻辑控制。
3:JSP页面中的BEAN没有 默认设置上下文,也就是说,BEAN没有一个父类的或者页面上下文对象的默认概念。
JSP所有的标签都实现了javax.servlet.jsp.tagext.JspTag接口。这个接口是一个标记接口,它有二个子接口:
1:一个是SimpleTag,它是JSP2.0新增加的接口,代表了简单的标签。
2:第二个是Tag接口,它是经典的,必须实现的接口,它有一个直接子接口就是IterationTag
IterationTag用于开发出抚今追昔的标签,它有一个简单的实现类为TagSupport。在开发时,我们只要从TagSupport扩展就可以开发出抚今追昔标签了。IterationTag还有一个子接口,就是BodyTag,这种标签允许带有Body。BodyTag也有一个实现类,就是BodyTagSupport,在开发BodyTag时,往往直接从它继承就可以了。当然了,我们在开发自己的标签时除了继承原有的类外,也可以直实现Tag接口。

HelloWorld标签开发
传统的标签必须实现javax.servlet.jsp.tagext.Tag接口,在这个接口中,主要定义的是和标签声明周期相关的方法,比如doStartTag() ,doEndTag() 等。在Tag中,可以通过pageContext对象访问JSP页面 的上下文。下面结合标签的生命周期讨论下标签的处理过程。JSP1.2标签的生命周期如下
1:当容器创建一个新的标签实例后,通过setPageContext设置标签的页面上下文。
2:使用setParent方法设置这个标签的上一级标签。如果没有上一级嵌套,设置为空。
3:设置标签的属性。这个属性在标签库描述文件中定义。如果没有定义属性就不调用此类方法。
4:调用 doStartTag方法,这个方法可以返回EVAL_BODY_INCLUDE和SKIP_BODY。当返回EVAL_BODY_INCLUDE时,就计算标签的BODY,如果返回SKIP_BODY,就不计算标签的BODY。
5:调用doEndTag方法,这个方法可以返回EVAL_PAGE或者SKIP_PAGE。当返回EVAL_PAGE时,容器将在标签结束时继续计算JSP页面的其他部分;如果返回SKIP_PAGE,容器将在标签结束时停止计算JSP页面的其他部分。
6:调用release方法释放标签程序占用的任何资源。
在开发标签时,可以有两种选择,一种是直接实现原始接口,另一种是从TagSupport类继承。下面我使用二种不同的方式来写一个HelloWorld标签程序

一:实现Tag接口
1:开发实现类

None.gif package  eflylab;
None.gif
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
import  java.util.Date;       
None.gif
ExpandedBlockStart.gifContractedBlock.gif
/** */ /**
InBlock.gif *演示怎么实现Tag接口的方式来开发标签程序
ExpandedBlockEnd.gif 
*/

None.gif
public   class  HelloTag_Interface  implements  javax.servlet.jsp.tagext.Tag
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif     
private PageContext pageContext;
InBlock.gif     
private Tag parent;
InBlock.gif     
public HelloTag_Interface()
ExpandedSubBlockStart.gifContractedSubBlock.gif     
dot.gif{  
InBlock.gif       
super();
ExpandedSubBlockEnd.gif     }

InBlock.gif     
ExpandedSubBlockStart.gifContractedSubBlock.gif    
/** *//**
InBlock.gif      *设置标签的页面的上下文
ExpandedSubBlockEnd.gif      
*/

InBlock.gif     
public void setPageContext(final javax.servlet.jsp.PageContext pageContext) 
ExpandedSubBlockStart.gifContractedSubBlock.gif     
dot.gif
InBlock.gif           
this.pageContext=pageContext;  
ExpandedSubBlockEnd.gif     }

InBlock.gif     
ExpandedSubBlockStart.gifContractedSubBlock.gif    
/** *//**
InBlock.gif      *设置上一级标签
ExpandedSubBlockEnd.gif      
*/

InBlock.gif     
public void setParent(final javax.servlet.jsp.tagext.Tag parent) 
ExpandedSubBlockStart.gifContractedSubBlock.gif     
dot.gif{   
InBlock.gif          
this.parent=parent;   
ExpandedSubBlockEnd.gif     }

InBlock.gif     
ExpandedSubBlockStart.gifContractedSubBlock.gif     
/** *//**
InBlock.gif      *开始标签时的操作
ExpandedSubBlockEnd.gif      
*/

InBlock.gif     
public int doStartTag() throws javax.servlet.jsp.JspTagException  
ExpandedSubBlockStart.gifContractedSubBlock.gif     
dot.gif{   
InBlock.gif          
return SKIP_BODY;  //返回SKIP_BODY,表示不计算标签体
ExpandedSubBlockEnd.gif
     }

InBlock.gif     
ExpandedSubBlockStart.gifContractedSubBlock.gif     
/** *//**
InBlock.gif      *结束标签时的操作
ExpandedSubBlockEnd.gif      
*/

InBlock.gif     
public int doEndTag() throws javax.servlet.jsp.JspTagException  
ExpandedSubBlockStart.gifContractedSubBlock.gif     
dot.gif{
InBlock.gif           
try
ExpandedSubBlockStart.gifContractedSubBlock.gif           
dot.gif{   
InBlock.gif                pageContext.getOut().write(
"Hello World!你好,世界!");
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     
ExpandedSubBlockStart.gifContractedSubBlock.gif     
/** *//**
InBlock.gif      *release用于释放标签程序占用的资源,比如使用了数据库,那么应该关闭这个连接。
ExpandedSubBlockEnd.gif      
*/

ExpandedSubBlockStart.gifContractedSubBlock.gif     
public void release() dot.gif{}    
InBlock.gif    
InBlock.gif    
InBlock.gif     
public javax.servlet.jsp.tagext.Tag getParent()   
ExpandedSubBlockStart.gifContractedSubBlock.gif     
dot.gif{    
InBlock.gif        
return parent;
ExpandedSubBlockEnd.gif     }

ExpandedBlockEnd.gif}

None.gif
2:编写标签库描述(mytag.tld)
  在WEB-INF\tlds 下新建一个mytag.tld文件
None.gif ?xml version="1.0" encoding="GBK" ?>
None.gif
None.gif
< taglib  xmlns ="http://java.sun.com/xml/ns/j2ee"
None.gif    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
None.gif    xsi:schemaLocation
="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"
None.gif    version
="2.0" >
None.gif    
< description > A tag library exercising SimpleTag handlers. </ description >
None.gif    
< tlib-version > 1.0 </ tlib-version >
None.gif
None.gif  
< short-name > examples </ short-name >
None.gif  
< uri > /demotag </ uri >
None.gif  
< description >
None.gif    A simple tab library for the examples
None.gif  
</ description >
None.gif
None.gif  
None.gif
None.gif 
< tag >
None.gif    
< description > Outputs Hello, World,从实现Tag接口起开发 </ description >
None.gif        
< name > hello_int </ name >
None.gif    
< tag-class > eflylab.HelloTag_Interface </ tag-class >
None.gif    
< body-content > empty </ body-content >
None.gif    
</ tag >
None.gif  
None.gif
</ taglib >
3:在web.xml中配置自定义标签
None.gif <? xml version="1.0" encoding="UTF-8" ?>
None.gif
< web-app  version ="2.4"  
None.gif    xmlns
="http://java.sun.com/xml/ns/j2ee"  
None.gif    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"  
None.gif    xsi:schemaLocation
="http://java.sun.com/xml/ns/j2ee 
None.gif     web-app_2_4.xsd"
>
None.gif  
<!--  要正确在MyEclipse生成的web.xml中使用 tag 元素,必须将上面一行
None.gif      http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd 改为
None.gif       web-app_2_4.xsd
-->
None.gif  
< taglib >
None.gif    
< taglib-uri > /demotag </ taglib-uri >
None.gif    
< taglib-location > /WEB-INF/tlds/mytag.tld </ taglib-location >
None.gif  
</ taglib >
None.gif
</ web-app >
4:使用的JSP页面
ExpandedBlockStart.gif ContractedBlock.gif <% dot.gif @ taglib uri="/demotag" prefix="hello"  %>
ExpandedBlockStart.gifContractedBlock.gif
<% dot.gif @ page contentType="text/html; charset=gb2312" language="java"  %>
None.gif
< html >
None.gif
< head >
None.gif
< title > first cumstomed tag </ title >
None.gif
< meta  http-equiv ="Content-Type"  content ="text/html; charset=gb2312" >
None.gif
</ head >
None.gif
None.gif
< body >
None.gif
< p > 以下的内容从Taglib中显示: </ p >
None.gif
< p >< i >< hello:hello_int /></ i ></ p >
None.gif
</ body >
None.gif
</ html >

运行:
以实现Tag接口开发,我们看到我们的实现类中实现了Tag接口中的所有方法,我们比较关心的是doStartTag和doEndTag方法。

二:从TagSupport继承
上面的是从Tag接口开始编写标签库,现在还是以HelloWorld为例,看一下如何从TagSupport类继承
None.gif package  eflylab;
None.gif
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
import  java.util.Date;       
None.gif
ExpandedBlockStart.gifContractedBlock.gif
/** */ /**
InBlock.gif *演示从TagSupport继承来开发标签
ExpandedBlockEnd.gif 
*/

None.gif
public   class  HelloTag  extends  TagSupport
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
ExpandedSubBlockStart.gifContractedSubBlock.gif    
/** *//**
InBlock.gif     *覆盖doStartTag方法
ExpandedSubBlockEnd.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        String dateString 
=new Date().toString();
InBlock.gif        
try
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            pageContext.getOut().write(
"Hello World hellking.<br>现在的时间是:"+dateString);
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    }

ExpandedBlockEnd.gif}

None.gif 

在上面代码中,由于从TagSupport继承,因为前面说过,TagSupport是Tag接口的子接口ItrationTag接口的实现类,所以我们可以只覆盖两个方法就开发出了标签 ,这种比较简单,
由于可以在一个TLD文件中定义多个标签,所以我们还是用上面的mytag.tld文件定义这个标签
None.gif <? xml version="1.0" encoding="GBK"  ?>
None.gif
None.gif
< taglib  xmlns ="http://java.sun.com/xml/ns/j2ee"
None.gif    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
None.gif    xsi:schemaLocation
="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"
None.gif    version
="2.0" >
None.gif    
< description > A tag library exercising SimpleTag handlers. </ description >
None.gif    
< tlib-version > 1.0 </ tlib-version >
None.gif      
< short-name > examples </ short-name >
None.gif      
< uri > /demotag </ uri >
None.gif      
< description >
None.gif        A simple tab library for the examples
None.gif      
</ description >
None.gif
None.gif  
None.gif
None.gif 
< tag >
None.gif    
< description > Outputs Hello, World,从实现Tag接口起开发 </ description >
None.gif        
< name > hello_int </ name >
None.gif    
< tag-class > eflylab.HelloTag_Interface </ tag-class >
None.gif    
< body-content > empty </ body-content >
None.gif
</ tag >
None.gif    
None.gif  
< tag >
None.gif    
< name > hello </ name >
None.gif    
< tag-class > eflylab.HelloTag </ tag-class >
None.gif    
< body-content > empty </ body-content >
None.gif    
< description >
None.gif    Simple hello world examples.
None.gif    Takes no attribute,and simply generates HTML
None.gif    
</ description >
None.gif  
</ tag >
None.gif
</ taglib >
None.gif
测试页面
ExpandedBlockStart.gif ContractedBlock.gif <% dot.gif @ taglib uri="/demotag" prefix="hello"  %>
ExpandedBlockStart.gifContractedBlock.gif
<% dot.gif @ page contentType="text/html; charset=gb2312" language="java"  %>
None.gif
< html >
None.gif
< head >
None.gif
< title > first cumstomed tag </ title >
None.gif
< meta  http-equiv ="Content-Type"  content ="text/html; charset=gb2312" >
None.gif
</ head >
None.gif
None.gif
< body >
None.gif
None.gif
< p > 以下的内容从Taglib中显示: </ p >
None.gif
< p >< i >< hello:hello /></ i ></ p >
None.gif
</ body >
None.gif
</ html >
None.gif
运行
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值