暗黙オブジェクトとは

広告

JSPページ内のスクリプトレットで「out.println()」などと記述していました。この「out」は特に宣言がされていないオブジェクトであるにも関わらず最初から利用できるようになっています。こういった宣言無しで最初から利用できるオブジェクトが暗黙オブジェクトです。

まず暗黙オブジェクトにはどういったものがあるのかを確認してみます。

下記のような簡単なJSPページを用意します。そして実際に一度呼び出してみてJSPページをサーブレットに変換されたものを見てください。(※JSPからサーブレットへの変換については『JSPからサーブレットへの変換』を参照して下さい)。

<%@ page contentType="text/html;charset=Shift_JIS" %>

<html>
<head><title>テスト</title></head>
<body>
<h1>テスト</h1>
</body>
</html>

変換されたサーブレットの中には次のような記述があります。(関係する部分だけを抜粋しています)。

public void _jspService(HttpServletRequest request, HttpServletResponse response)
      throws java.io.IOException, ServletException {

  JspFactory _jspxFactory = null;
  PageContext pageContext = null;
  HttpSession session = null;
  ServletContext application = null;
  ServletConfig config = null;
  JspWriter out = null;
  Object page = this;
  JspWriter _jspx_out = null;
  PageContext _jspx_page_context = null;

  try {
    _jspxFactory = JspFactory.getDefaultFactory();
    response.setContentType("text/html;charset=Shift_JIS");
    pageContext = _jspxFactory.getPageContext(this, request, response,
            null, true, 8192, true);
    _jspx_page_context = pageContext;
    application = pageContext.getServletContext();
    config = pageContext.getServletConfig();
    session = pageContext.getSession();
    out = pageContext.getOut();
    _jspx_out = out;

    out.write("¥r¥n");
    out.write("¥r¥n");
    out.write("<html>¥r¥n");

    /*...*/

  } catch (Throwable t) {
  } finally {
  }
}

JSPページが呼び出されたときに実行される「_jspService」メソッドの引数として指定されている「request」及び「response」、そしてメソッド内で自動的に作成されている「pageContext」「session」「application」「config」「out」「page」が暗黙オブジェクトになります。

JSPページ内にスクリプトレットとしてJavaコードを記述するとそのまま「_jspService」メソッド内に記述が行われます。そして「_jspService」メソッドには先ほど暗黙オブジェクトが最初から定義されていますので、暗黙オブジェクト使ったJavaコードを書くことが出来ると言う仕組みです。

エラーページの暗黙オブジェクト

「page」ディレクティブの「isErrorPage」に対して「true」を設定した場合、そのJSPページはエラー表示用のページとなります。この時だけ利用できる暗黙オブジェクトがあります。(※pageディレクティブについては『pageディレクティブ』を参照して下さい)。

下記のような簡単なJSPページを用意します。そして実際に一度呼び出してみてJSPページをサーブレットに変換されたものを見てください。

<%@ page contentType="text/html;charset=Shift_JIS" %>
<%@ page isErrorPage="true" %>

<html>
<head><title>テスト</title></head>
<body>
<h1>テスト</h1>
</body>
</html>

すると先ほどと比較して「exception」と言うオブジェクトが増えています。

JspFactory _jspxFactory = null;
PageContext pageContext = null;
HttpSession session = null;
Throwable exception = org.apache.jasper.runtime.JspRuntimeLibrary.getThrowable(request);
if (exception != null) {
  response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
ServletContext application = null;
ServletConfig config = null;
JspWriter out = null;
Object page = this;
JspWriter _jspx_out = null;
PageContext _jspx_page_context = null;

この「exception」も暗黙オブジェクトの1つで、「isErrorPage」が「true」の場合にだけ利用できるオブジェクトです。エラー表示用のページ内で、発生した例外に関する情報を取り出すのに使うオブジェクトです。その為、「isErrorPage」が「true」の場合だけオブジェクトの定義が行われます。

暗黙オブジェクトの概略

それぞれの暗黙オブジェクトの簡単な利用方法は次の通りです。

オブジェクト名説明
requestクライアントからのリクエストを取得する
responseクライアントへのレスポンスを設定する
outJSPの実行結果をクライアントへの出力する
pageContextJSPのオブジェクトを管理する
sessionセッション情報を管理する
applicationアプリケーションデータを管理する
pageJSPページ自身を表す。「this」と同じ。
configJSPページのパラメータを設定する
exception例外発生時のエラー情報を取得する

次のページ以降で順に確認していきます。

( Written by Tatsuo Ikura )