首先標簽是一個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()方法。
標簽類代碼:
- package test.jsp.tags;
-
- import javax.servlet.jsp.tagext.BodyTagSupport;
- import javax.servlet.jsp.tagext.BodyContent;
- import javax.servlet.jsp.JspTagException;
-
- public class BodyTagExample extends BodyTagSupport
- {
- private int counts;
-
- public BodyTagExample()
- {
- super();
- }
- public void setCounts(int counts)
- {
- this.counts = counts;
- }
- public int doStartTag() throws JspTagException
- {
- System.out.println("doStartTag...");
- if (counts > 0)
- {
- return EVAL_BODY_TAG;
- }
- else
- {
- return SKIP_BODY;
- }
- }
- public void setBodyContent(BodyContent bodyContent)
- {
- System.out.println("setBodyContent...");
- this.bodyContent = bodyContent;
- }
- public void doInitBody() throws JspTagException
- {
- System.out.println("doInitBody....");
- }
- public int doAfterBody() throws JspTagException
- {
- System.out.println("do After body..." + counts);
- if (counts > 1)
- {
- counts--;
- return EVAL_BODY_TAG;
- }
- else
- {
- return SKIP_BODY;
- }
- }
- public int doEndTag() throws JspTagException
- {
- System.out.println("do end Tag...");
- try
- {
- if (bodyContent != null)
- {
- bodyContent.writeOut(bodyContent.getEnclosingWriter());
- }
- }
- catch (java.io.IOException e)
- {
- throw new JspTagException("IO Error: " + e.getMessage());
- }
- return EVAL_PAGE;
- }
- }
tld描述文件源碼:
- <?xml version="1.0" encoding="ISO-8859-1" ?>
- <!DOCTYPE taglib
- PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
- "
- http:
- <taglib>
- <tlibversion>1.0</tlibversion>
- <jspversion>1.1</jspversion>
- <shortname>Application Tag Library</shortname>
- <uri>http:
- <info>tag loop</info>
- <tag>
- <name>loop</name>
- <tagclass>test.jsp.tags.BodyTagExample</tagclass>
- <bodycontent>JSP</bodycontent>
- <attribute>
- <name>counts</name>
- <required>true</required>
- <rtexprvalue>true</rtexprvalue>
- </attribute>
- </tag>
- </taglib>
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
"
http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<taglib>
<tlibversion>1.0</tlibversion>
<jspversion>1.1</jspversion>
<shortname>Application Tag Library</shortname>
<uri>http://jakarta.apache.org/taglibs/struts-example-1.0</uri>
<info>tag loop</info>
<tag>
<name>loop</name>
<tagclass>test.jsp.tags.BodyTagExample</tagclass>
<bodycontent>JSP</bodycontent>
<attribute>
<name>counts</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</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代碼如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
- <web-app>
- <taglib>
- <taglib-uri>demotag</taglib-uri>
- <taglib-location>/WEB-INF/tld/mytag.tld</taglib-location>
- </taglib>
- </web-app>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<taglib>
<taglib-uri>demotag</taglib-uri>
<taglib-location>/WEB-INF/tld/mytag.tld</taglib-location>
</taglib>
</web-app>
Jsp引用代碼:
- <%@ page contentType="text/html; charset=GBK" language="java"%>
- <%@ taglib uri="demotag" prefix="demo" %>
- <html>
- <body>
- <br>
- <demo:loop counts="5">
- 現在時間是:<%=new java.util.Date().toString()%><br>
- </demo:loop>
- <br>
- </body>
- </html>
posted on 2012-03-26 17:44
Terry Zou 閱讀(209)
評論(0) 編輯 收藏 所屬分類:
struts2.1.6