大可制作:QQ群:31564239(asp|jsp|php|mysql)

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>