From Gossip@caterpillar

JSP/Servlet: BodyTagSupport 類別

 

 


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程式碼的標籤。

首先設計標籤處理類別如下:

  • PreCodeTag.java
package onlyfun.caterpillar; 

import java.io.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;

public class PreCodeTag extends BodyTagSupport {
public int doAfterBody() {
try {
BodyContent body = getBodyContent();
String code = body.getString();
JspWriter out = body.getEnclosingWriter();

code = code.replaceAll("<%", "&lt;%");
code = code.replaceAll(" ", "&nbsp;");
code = code.replaceAll("\r\n", "<br>\r\n");

out.println("<table border=1>");
out.println("\t<td bgcolor=yellow>");
out.println(code);
out.println("\t</td>");
out.println("</table>");
}
catch(Exception e) {}

return SKIP_BODY;
}
}

您可以使用getBodyContent()取得在setBodyContent()時設定的BodyContent物件,這樣就可以取得本體文字,另外 為了要能在標籤處理過程中先寫入資訊至response中,我們使用getEnclosingWriter()方法取得 JspWriter物件;這個標籤處理類別將<%、空白與換行符號分別換成&lt%;、&nbsp;與<br>等適用 於網頁內容的HTML碼與標籤,並使用一個簡單的表格來顯示標籤本體間處理過後的文字;接下來在tld檔中加入標籤庫定義:
  • preCode.tld
...
<tag>
<description>Preserve JSP Code</description>
<name>precode</name>
<tag-class>onlyfun.caterpillar.PreCodeTag</tag-class>
<body-content>tagdependent</body-content>
</tag>
...

注意<body-content>之間設定的是tagdependent,這表示對本體文字不先作任何的處理,直接傳入標籤處理類別,由標籤 處理類別自行處理本體文字,之後同樣的,您可以在web.xml中加入tld檔與uri對應的內容,以方便管理標籤庫,然後可以在JSP網頁中這麼使用:
  • test.jsp
<%@taglib prefix="caterpillar" 
uri="http://caterpillar.onlyfun.net/"%>
<html>
<body>

<caterpillar:precode>
<%
out.println("Hello! World!");
%>
</caterpillar:precode>

</body>
</html>

執行的結果如下:
<html>
 <body>
 
<table border=1>
    <td bgcolor=yellow><br>
 &lt;%<br>
 &nbsp;&nbsp;&nbsp;&nbsp;out.println("Hello!&World!");<br>
 %><br>
    </td>
</table>
 
</body>
</html>