posts - 93,  comments - 2,  trackbacks - 0

首先标签是一个java类,它是运行一个或两个接口的javabean,然后再配合标签描述文件(以.tld为扩展名),两者结合就可以作出自己的自定义标签库了。

自定义标签必须实现下面三个接口中的一个:Tag、IterationTag、BodyTag 

 

Tag接口中的返回常数意义:
EVAL_BODY_INCLUDE:告诉服务器正文的内容,并把这些内容送入输出流
SKIP_BODY:告诉服务器不要处理正文内容
EVAL_PAGE:让服务器继续执行页面
SKIP_PAGE:让服务器不要处理剩余的页面
EVAL_BODY_AGAIN:让服务器继续处理正文内容,只有doAfterBody方法可以返回
EVAL_BODY_BUFFERED:BodyTag接口的字段,在doStartTag()返回
EVAL_BODY_INCLUDE、SKIP_BODY一般由doStartTag()返回,而EVAL_PAPGE、SKIP_PAGE由doEndTag()返回。

 

一个扩展BodyTagSupport的自定义标记的生命周期如下:
1.创建标记
2.调用Setter方法
3.调用doStartTag()方法
4.调用setBodyContent()方法
5.调用InitBody()方法
6.处理标记的Body
7.doAfterBody();根据返回值,如果为EVAL_BODY_AGAIN,继续执行6,如果不是,执行8
8.调用doEndTag()方法
9.判断标记是否需要重用,如果要,执行4;否则执行release()方法。

 

标签类代码:

Java代码 复制代码 收藏代码
  1. package test.jsp.tags;    
  2.   
  3. import javax.servlet.jsp.tagext.BodyTagSupport;    
  4. import javax.servlet.jsp.tagext.BodyContent;    
  5. import javax.servlet.jsp.JspTagException;    
  6.   
  7. public class BodyTagExample extends BodyTagSupport    
  8. {    
  9.     private int counts;   
  10.   
  11.     public BodyTagExample()    
  12.     {   
  13.         super();   
  14.     }   
  15.     public void setCounts(int counts)   
  16.     {   
  17.         this.counts = counts;   
  18.     }   
  19.     public int doStartTag() throws JspTagException   
  20.     {   
  21.         System.out.println("doStartTag...");   
  22.         if (counts > 0)   
  23.         {   
  24.             return EVAL_BODY_TAG;   
  25.         }   
  26.         else  
  27.         {   
  28.             return SKIP_BODY;   
  29.         }   
  30.     }   
  31.     public void setBodyContent(BodyContent bodyContent)   
  32.     {   
  33.         System.out.println("setBodyContent...");   
  34.         this.bodyContent = bodyContent;   
  35.     }   
  36.     public void doInitBody() throws JspTagException   
  37.     {   
  38.         System.out.println("doInitBody....");   
  39.     }   
  40.     public int doAfterBody() throws JspTagException   
  41.     {   
  42.         System.out.println("do After body..." + counts);   
  43.         if (counts > 1)   
  44.         {   
  45.             counts--;   
  46.             return EVAL_BODY_TAG;   
  47.         }   
  48.         else  
  49.         {   
  50.             return SKIP_BODY;   
  51.         }   
  52.     }   
  53.     public int doEndTag() throws JspTagException   
  54.     {   
  55.         System.out.println("do end Tag...");   
  56.         try  
  57.         {   
  58.             if (bodyContent != null)   
  59.             {   
  60.                 bodyContent.writeOut(bodyContent.getEnclosingWriter());   
  61.             }   
  62.         }   
  63.         catch (java.io.IOException e)    
  64.         {    
  65.             throw new JspTagException("IO Error: " + e.getMessage());    
  66.         }    
  67.         return EVAL_PAGE;    
  68.     }    
  69. }   

tld描述文件源码:

 

Java代码 复制代码 收藏代码
  1. <?xml version="1.0" encoding="ISO-8859-1" ?>   
  2. <!DOCTYPE taglib   
  3. PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"  
  4. "   
  5. http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">   
  6. <taglib>   
  7. <tlibversion>1.0</tlibversion>   
  8. <jspversion>1.1</jspversion>   
  9. <shortname>Application Tag Library</shortname>   
  10. <uri>http://jakarta.apache.org/taglibs/struts-example-1.0</uri>   
  11. <info>tag loop</info>   
  12. <tag>   
  13. <name>loop</name>   
  14. <tagclass>test.jsp.tags.BodyTagExample</tagclass>   
  15. <bodycontent>JSP</bodycontent>   
  16. <attribute>   
  17. <name>counts</name>   
  18. <required>true</required>   
  19. <rtexprvalue>true</rtexprvalue>   
  20. </attribute>   
  21. </tag>   
  22. </taglib>  

 

其中:

tag中的name属性:定义了我们的tag名称,在后面会用到。
tag中的tagclass属性:指定了我们这个tag的实现类。
tage中的bodycontent属性:指定我们的页面内容是什么性质的。(注意:在jsp开发中这里必须写JSP)
tage中的attribute属性:定义了我们的这个tag可能有的属性。
attribute中的name属性:指定了属性的名称。它和我们类中定义的“int counts;”必须一样,并且在类中还必须包含一个setCounts(int counts)方法,否则这个属性就不能设置。
attribute中的required属性:表示这个属性是否是必须的。
attribute中的rtexprvalue属性:表示这个属性是否可以用JSP的程序段的结果输出。


tag写完自后要在web.xml中声明这个tag

web.xml代码如下:

 

Java代码 复制代码 收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>    
  2. <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">    
  3. <web-app>    
  4. <taglib>    
  5. <taglib-uri>demotag</taglib-uri>    
  6. <taglib-location>/WEB-INF/tld/mytag.tld</taglib-location>    
  7. </taglib>    
  8. </web-app>   

 

Jsp引用代码:

 

Java代码 复制代码 收藏代码
  1. <%@ page contentType="text/html; charset=GBK" language="java"%>    
  2. <%@ taglib uri="demotag" prefix="demo" %>    
  3. <html>    
  4. <body>    
  5. <br>    
  6. <demo:loop counts="5">    
  7. 现在时间是:<%=new java.util.Date().toString()%><br>    
  8. </demo:loop>    
  9. <br>    
  10. </body>    
  11. </html>   

posted on 2012-03-26 17:44 Terry Zou 阅读(177) 评论(0)  编辑  收藏 所属分类: struts2.1.6

只有注册用户登录后才能发表评论。


网站导航:
 
<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

常用链接

留言簿(2)

随笔分类

随笔档案

文章分类

文章档案

相册

收藏夹

Java

搜索

  •  

最新随笔

最新评论

阅读排行榜

评论排行榜