JSP 8章 ボディ部を操作するカスタムタグ
8.2. javax.servlet.jsp.tagext.BodyTagSupport
「IterationTag」インタフェースに対して「TagSupport」クラスがあるように、「BodyTag」インタフェースに対して「BodyTagSupport」クラスが提供されています。プログラマは「BodyTagSupport」クラスの必要なメソッドをオーバーライドする事により、目的とするカスタムタグのハンドラクラスを作成する事ができます。以下は1節のFileTagを「BodyTagSupport」クラスを用いるように変更したものです。
...
public class FileTag extends BodyTagSupport{
private File out=null;
public void setFile(String path){
out=new File(path);
}
public int doAfterBody() throws JspException{
try{
BufferedReader reader=new BufferedReader(bodyContent.getReader());
BufferedWriter writer=new BufferedWriter(new FileWriter(out));
String line;
while((line=reader.readLine())!=null){
writer.write(line,0,line.length());
writer.newLine();
}
writer.flush();
writer.close();
}catch(IOException e){
throw new JspException(e.getMessage());
}
return(SKIP_BODY);
}
}
実装しなければならないメソッドも減り、非常にシンプルなクラスとなります。以下に「BodyTag」で定義されたメソッドの、「BodyTagSupport」におけるデフォルトの動作を示します。
| doStartTag() | EVAL_BODY_BUFFEREDを返す。ボディ部の評価結果は、bodyContentに格納される。 |
| doInitBody() | 何もしない |
| doAfterBody() | SKIP_BODYを返す。bodyContentに対して何もしない。 |
| doEndTag() | EVAL_PAGEを返す。 |
「setPageContext」「setBodyContent」等については、これまでのサンプルとほぼ同じ処理を実行します。
「BodyTagSupport」は「TagSupport」のサブクラスですので、「TagSupport」で独自に定義されたメソッドについては、それと同じ処理を行います。「BodyTagSupport」で新たに定義されたメソッドについては以下の通りです。
| getPreviousOut() |
「BodyContent」の「getEnclosingWriter()」で得られる、1つ親関係にあるタグの「JspWriter」を返す。 |
(実習課題2)
実習課題1のタグハンドラクラスを、「BodyTagSupport」を使用するように変更しなさい。また以下の改良を行いなさい。
- 属性「separator」を追加し、この属性で指定された文字をデータの区切りとする事。この属性が指定されなかった場合、これまで通りタブ文字(\t)をデータの区切りとする。

