Taglib原理和實現

來源:互聯網
上載者:User

Tag究竟是什嗎?如何?一個Tag?     一個tag就是一個普通的java類,它惟一特別之處是它必須繼承TagSupport或者BodyTagSupport類。這兩個類提供了一些方法,負責jsp頁面和你編寫的類之間的互動,例如輸入,輸出。而這兩個類是由jsp容器提供的,無須開發人員自己實現。換句話說,你只需把實現了商務邏輯的類繼承TagSupport或者BodyTagSupport,再做一些特別的工作,你的類就是一個Tag。並且它自己負責和jsp頁面的互動,不用你多操心。     “特別的工作”通常有以下幾個步驟:     1)提供屬性的set方法,此後這個屬性就可以在jsp版面設定。以jstl標籤為例 c:out value=""/,這個value就是jsp資料到tag之間的入口。所以tag裡面必須有一個setValue方法,具體的屬性可以不叫value。例如setValue(String data){this.data = data;}    這個“value”的名稱是在tld裡定義的。取什麼名字都可以,只需tag裡提供相應的set方法即可。     2)處理 doStartTag 或 doEndTag 。這兩個方法是 TagSupport提供的。 還是以c:out value=""/為例,當jsp解析這個標籤的時候,在“<”處觸發 doStartTag 事件,在“>”時觸發 doEndTag 事件。通常在 doStartTag 裡進行邏輯操作,在 doEndTag 裡控制輸出。    3)編寫tld檔案。    4)在jsp頁面匯入tld。這樣,你的jsp頁面就可以使用自己的tag了。     通常你會發現自己絕大多數活動都集中在 doStartTag 或 doEndTag 方法裡。確實如此,熟悉一些介面和類之後,寫taglib很容易。正如《jsp設計》的作者所言:裡面的邏輯稍微有點複雜,但畢竟沒有火箭上天那麼難。     一個簡單的例子:OutputTag

package diegoyun;import javax.servlet.jsp.JspException;import javax.servlet.jsp.JspWriter;import javax.servlet.jsp.tagext.TagSupport;/** * @author chenys */public class OutputTag extends TagSupport{ private String name=null; public void setName(String name) { this.name = name; } public int doStartTag() throws JspException{ try { JspWriter out = pageContext.getOut(); out.print("Hello! " + name); } catch (Exception e) { throw new JspException(e); } return EVAL_PAGE; }}
    簡要說明:    1 如何輸出到jsp頁面:調用JspWriter JspWriter out = pageContext.getOut();out.print......記住這個方法就可以了。    2 輸出後如何作處理,函數會返回幾個值之一。EVAL_PAGE 表示tag已處理完畢,返回jsp頁面。還有幾個值,例如 EVAL_BODY_AGAIN 和EVAL_BODY_INCLUDE等,後面我們會作討論。     編寫tld
<?xml version="1.0" encoding="ISO-8859-1" ?><!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"><taglib> <tlib-version>1.0</tlib-version> <jsp-version>1.2</jsp-version> <short-name>diego</short-name> <!--OutputTag--> <tag> <name>out</name> <tag-class>diegoyun.OutputTag</tag-class> <body-content>empty</body-content> <attribute> <name>name</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> </tag></taglib>
    在WEB-INF下建立tlds檔案夾,把這個檔案取名為diego.tld,放到tlds檔案夾下。路徑應該這樣:WEB-INF\tlds\diego.tld     關於tld的簡單說明:    short-name:taglib的名稱,也稱為首碼。比如“c:out value=""/” 裡的“c”    name:tag的名字。例如“c:out value=""/” 裡的"out”,我們的類也取名為out,由於有首碼作區分,不會混淆    tag-class:具體的tag類。帶包名    body-content:指tag之間的內容。例如c:out value="" ...... /c 起始和關閉標籤之間就是body-content。由於沒有處理body-content,所以上面設為empty    “attribute”裡的name:屬性名稱字。例如c:out value=""/裡的value。名字可任意取,只要類裡提供相應的set方法即可。    required:是否必填屬性。    rtexprvalue:是否支援運行時運算式取值。這是tag的強大功能。以後我們會討論。暫時設為false     編寫jsp頁面
<%@ page language="java"%><%@ taglib uri="/WEB-INF/tlds/diego.tld" prefix="diego"%><html><body>Test Tag:<diego:out name="diegoyun"/></body></html>
    我的編程環境是eclipse+tomcat.啟動伺服器,如果一切按照上面步驟的話,就能看到 Test Tag: Hello! diegoyun 字樣。最簡單的tag就這麼出來了。並不難,是不是?(T111)

相關文章

Cloud Intelligence Leading the Digital Future

Alibaba Cloud ACtivate Online Conference, Nov. 20th & 21st, 2019 (UTC+08)

Register Now >

11.11 Big Sale for Cloud

Get Unbeatable Offers with up to 90% Off,Oct.24-Nov.13 (UTC+8)

Get It Now >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。