連載
» 2003年05月23日 00時00分 UPDATE

基礎から学ぶサーブレット/JSP(5):JSPの基本「暗黙オブジェクト」を使う (1/3)

[山田祥寛,@IT]

暗黙オブジェクトをきわめる

 暗黙オブジェクトは、数あるJavaの機能の中でもWebページ構築に特化した機能(メソッド)ばかりを集約した極めて重要な要素です。暗黙オブジェクトは、JSPページ内のスクリプトレット式構文(Expression)内で「何ら事前の宣言を行うことなく」使用することが可能です(ただし、宣言部内では使用することができません)。

 暗黙オブジェクトをきわめることは、すなわち、JSPをきわめることであるといっても過言ではありません。JSP 1.2における暗黙オブジェクトには表1に示すとおり9つの種類がありますが、本稿ではその中でも特に重要な7つについて、2回に分けてご紹介することにします(*が付いたものについては本稿では割愛します)。

表1 JSP 1.2における暗黙オブジェクト
暗黙オブジェクト 概要
out コンテンツを出力する手段を提供
request リクエスト(要求)情報にアクセスする手段を提供
session セッション内で共有可能な情報を管理
application コンテナ単位に生成され、ユーザー間で共有可能な情報を管理
response レスポンス(応答)情報を制御する手段を提供
exception JSPページ内で発生した例外(エラー)情報を管理
config 初期化パラメータにアクセスする手段を提供
page * JSPページそのもの(JSPページ内で使用することはほとんどありません)
pageContext * 各暗黙オブジェクトにアクセスする手段を提供(JSPページ内で使用することはほとんどありません)

画面への出力を担う−outオブジェクト−

 outオブジェクトは、主にクライアントに対してコンテンツを出力するための手段を提供します。これまでにも、文字列を出力するためのprint、printlnメソッドなどが登場していますが、これらはいずれもoutオブジェクトに属する命令(メソッド)群にほかなりません。

 また、outオブジェクトにはバッファ処理を制御するためのメソッドも用意されています。バッファ処理とは、サーバ側で処理された内容をそのまま垂れ流すのではなく、いったん「バッファ」と呼ばれるサーバ側の領域にプール(蓄積)しておいたうえで、出力のサイズがある一定量を超えたタイミングでまとめて出力するしくみをいいます。バッファ処理を用いることで、出力処理にかかるオーバーヘッドは削減され、全体的な処理パフォーマンスを向上させることができます。

 バッファサイズやバッファサイズを超えたときのコンテナの挙動は、第4回「JSPの基本構文」でもご紹介した@pageディレクティブのbufferautoFlush属性によって制御することが可能です。

outオブジェクトを利用したサンプル

 「バッファ処理」は、高パフォーマンスなアプリケーションを実現するために極めて有効な機能の1つですが、注意すべき点もあります。というのも、「バッファ処理」を用いることで、むしろユーザーの体感速度は低下するというケースもあるからです。データベースの検索処理など、処理時間の長いプロセスが続く場合、処理結果がある一定量蓄積されるまで出力されないため、そのタイムラグがユーザーにとってはパフォーマンスが劣化したように感じられるのです。

 そこで、そのような局面では、途中でバッファの内容を強制的に出力することでユーザーの体感速度を調整することが可能です。

 以下のサンプルを見てみましょう。1秒置きに「…」の文字が出力されます。

out.jsp
<%@ page contentType="text/html;charset=Shift_JIS" autoFlush="true" %>
 <html>
 <head>
 <title>バッファの制御(outオブジェクト)</title>
 </head>
 <body>
 <%
 for(int i=0;i<=10;i++){
   Thread.sleep(1000);
   /* データベース処理など、処理時間の長い処理 */
   out.print("…");
   out.flush();
 }
 %>
 </body>
 </html>
r8out1.jpg
処理の経過が「…」で表される 処理の経過が「…」で表される

 ここでは、データベース検索などの重い処理は割愛して、ループごとにThread.sleepメソッドで1秒(=1000マイクロ秒)の休止期間を入れています。out.flushメソッドは、その時点でのバッファの内容を強制的に出力します。

 実際のアプリケーションでは、ループ内でデータベースの処理結果などをその都度出力させることで、すべての処理が完了するのを待つことなく、経過ベースでユーザーにコンテンツを提供できるため、体感速度としてはパフォーマンスが向上したように見せることができます。

 また、このサンプルを応用することで、疑似的なプログレスバー(進ちょくバー)をブラウザ上で表現することも可能でしょう。

outオブジェクトのそのほかのメソッド

 これまでに登場したprint、println、flushメソッドを含め、outオブジェクトに含まれる主なメソッドを、以下にまとめてみましょう。

 いったん生成されたコンテンツをクリアするclear、clearBufferメソッドや、処理を中断(完了)させるcloseメソッド、OS環境に応じて適した改行文字を出力するnewLineメソッドなどは、特に重要です。

表2 outオブジェクトの主なメソッド
メソッド 概要
clear() バッファのデータをクリア(出力済み、バッファ処理が無効の場合はエラー)
clearBuffer() バッファのデータをクリア(バッファの内容が出力済みでも使用可)
close() 出力を終了
flush() バッファの内容を強制的に出力
getBufferSize() 現在確保されているバッファのサイズ(バイト単位)
getRemaining() 未使用バッファのサイズ(バイト単位)
isAutoFlush() trueの場合、出力サイズがバッファを超えたタイミングで自動出力(falseの場合はエラー)
newLine() 改行文字を出力(Windows系OSでは「\n」、UNIX系OSでは「\n\r」)
print(str) 文字列strを出力
println(str) 文字列strを末尾に改行付きで出力
r8one_point.gif

outオブジェクトは、文字列の出力、バッファ処理の制御などクライアントへの出力処理全般をつかさどります。


       1|2|3 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。