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> |