JSP リファレンス

<jsp:doBody>
xmlns:jsp="http://java.sun.com/JSP/Page"
JSP 2.0 以降

SYNOPSIS

<jsp:doBody
var="変数名"
varReader="変数名"
scope="page|request|session|application"
/>

説 明

タグファイルにおいて呼び出し元の JSP でこのタグで囲んだ Body 部分を評価し、JspWriter でレスポンスとして出力するか変数に格納します。<jsp:invoke> の挙動と 似ていますが、あちらはフラグメントとして渡された属性を評価します。

<%@variable%> を使用することで Body 内の EL やカスタムタグに変数を渡す ことが出来ます。

<jsp:doBody> はタグファイル内で繰り返し実行することが出来ます。

属 性

var="変数名"
optional

Body 部分を評価した結果を文字列として格納する変数名を指定します。 java.lang.String のインスタンスが格納されます。

varReader 属性と両方を指定することは出来ません。

varReader="変数名"
optional

Body 部分を評価した結果を入力ストリームとして格納する変数名。 java.io.Reader のインスタンスが格納されます。

コンテナによっては Body のサイズによってファイルなどにスワップアウトするよう 実装されている可能性があります。

scope="page|request|session|application"
optional

var または varReader で指定した評価結果の変数を格納するスコープです。 page, request, session, application のいずれかを指定します。

スコープに session を指定する場合、呼び出し側の JSP がセッションを開始していない 可能性があることに注意してください。セッションが開始されていない状況で session スコープへアクセスすると IllegalStateException が発生します。

使用例

タグファイル チュートリアル 参照。

Tomcat 5.5, 6.0 においてvarReader で大きな Body の取得を試みた 場合にどのような入力ストリームで返してくるかを調べます。まずは Body 内の評価結果を 入力ストリームで取得し、そのクラス名と入力データサイズを表示するタグファイルを作成。

JSP
<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 の文字列を出力する (実際は一行で書いています)。
JSP
<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
CVS 2008/03/09