|
BodyTagSupport類別繼承自TagSupport類別,除了Tag與IterationTag之外,還實作了BodyTag介面, BodyTag介面中有兩個方法:doInitBody()與setBodyContent()。在BodyTagSupport類別中, doStartTag()預設是傳回EVAL_BODY_BUFFERED,
然後執行setBodyContent()與doInitBody()方法,
setBodyContent()會設定BodyContent物件,它包括了一些標籤本體文字資訊,及在處理標籤過程中寫出資料至response的物
件,在這之後會進入doAfterBody()方法,您可以傳回EVAL_BODY_AGAIN或是SKIP_BODY,如果傳回前者,則照以上的流程再執行一次。 BodyTagSupport類別在doStartTag()傳回EVAL_BODY_BUFFERED後,可以取得本體文字相關資訊,也因而您繼承了 BodyTagSupport之後,可以撰寫具處理本體文字能力的標籤處理類別,下面舉一個簡單的例子,設計一個可以處理簡單JSP程式碼的標籤。 首先設計標籤處理類別如下:
package onlyfun.caterpillar; 您可以使用getBodyContent()取得在setBodyContent()時設定的BodyContent物件,這樣就可以取得本體文字,另外 為了要能在標籤處理過程中先寫入資訊至response中,我們使用getEnclosingWriter()方法取得 JspWriter物件;這個標籤處理類別將<%、空白與換行符號分別換成<%;、 與<br>等適用 於網頁內容的HTML碼與標籤,並使用一個簡單的表格來顯示標籤本體間處理過後的文字;接下來在tld檔中加入標籤庫定義:
... 注意<body-content>之間設定的是tagdependent,這表示對本體文字不先作任何的處理,直接傳入標籤處理類別,由標籤 處理類別自行處理本體文字,之後同樣的,您可以在web.xml中加入tld檔與uri對應的內容,以方便管理標籤庫,然後可以在JSP網頁中這麼使用:
<%@taglib prefix="caterpillar" 執行的結果如下: <html> <body> <table border=1> <td bgcolor=yellow><br> <%<br> out.println("Hello!&World!");<br> %><br> </td> </table> </body> </html> |