<jsp:doBody>
説 明
タグファイルにおいて呼び出し元の JSP でこのタグで囲んだ Body 部分を評価し、JspWriter
でレスポンスとして出力するか変数に格納します。<jsp:invoke> の挙動と
似ていますが、あちらはフラグメントとして渡された属性を評価します。
<%@variable%> を使用することで Body 内の EL やカスタムタグに変数を渡す
ことが出来ます。
<jsp:doBody> はタグファイル内で繰り返し実行することが出来ます。
属 性
Body 部分を評価した結果を文字列として格納する変数名を指定します。
java.lang.String のインスタンスが格納されます。
varReader 属性と両方を指定することは出来ません。
Body 部分を評価した結果を入力ストリームとして格納する変数名。
java.io.Reader のインスタンスが格納されます。
コンテナによっては Body のサイズによってファイルなどにスワップアウトするよう 実装されている可能性があります。
使用例
タグファイル チュートリアル 参照。
Tomcat 5.5, 6.0 においてvarReader で大きな Body の取得を試みた
場合にどのような入力ストリームで返してくるかを調べます。まずは Body 内の評価結果を
入力ストリームで取得し、そのクラス名と入力データサイズを表示するタグファイルを作成。
<jsp:doBody varReader="in" />
<code>${in.class.name}</code>: <%
java.io.Reader in = (java.io.Reader)jspContext.findAttribute("in");
int length = 0;
char[] buffer = new char[1024];
while(true){
int len = in.read(buffer);
if(len < 0) break;
length += len;
}
out.write((length / 1024) + "kB");
%>
OutOfMemoryError が発生する手前の 8MB
の文字列を出力する (実際は一行で書いています)。
<sample:bodySize>
<c:forEach var="i" begin="0" end="${8 * 1024}">${1kB分の文字列}</c:forEach>
</sample:bodySize>
どうも最後まで StringReader で返してきました。Tomcat 5.5, 6.0 では大きな
Body でもスワップアウト等は行っていないようです。
java.io.StringReader: 8193kB