変数の宣言

広告

スクリプトレットの中でJavaのコードとして変数を宣言することはできますが、この場合の変数はローカル変数となります。よってJSPページが呼び出されるたびに初期化が行われることになります。

それに対して初めてJSPページが呼び出されたときに初期化され、JSPページを動かしているTomcatが起動している間は有効となるような変数を宣言することができます。構文は次の通りです。

<%!
変数や定数の宣言
%>

スクリプトレット内で変数を宣言した場合との違いは、JSPページがサーブレットに変換された後のコードを見ていただければ分かりやすいかと思いますので簡単なサンプルを元に確認していきます。

count.jsp

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

<html><head><title>カウント</title></head>
<body>
<h1>カウント</h1>

<%!
int count = 0;
%>

<%
int localcount = 0;

count++;
localcount++;
%>

<p>
スクリプトレット内のカウントは<%= localcount %>です。
</p>

<p>
変数宣言で作成したカウントは<%= count %>です。
</p>

</body>
</html>

上記のサンプルでは変数の宣言を使って作成した変数「count」とスクリプトレット内で作成した変数「localcount」があります。共に変数を作成し初期化した後で「+1」ずつしてから画面に表示しています。

実際に「http://localhost/hello/count.jsp」にブラウザからアクセスすると次のように表示されます。

変数の宣言

ではJSPページがどのようにサーブレットに変換されたのかを見てみましょう。(変換されたサーブレットを確認する方法については『JSPからサーブレットへの変換』を参照して下さい)。

※下記は変換されたサーブレットの中の一部抜粋です。

package org.apache.jsp;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;

public final class count_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent {


int count = 0;

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

    try {

      out.write("\r\n");
      out.write("\r\n");
      out.write("<html><head><title>カウント</title></head>\r\n");
      out.write("<body>\r\n");
      out.write("<h1>カウント</h1>\r\n");
      out.write("\r\n");
      out.write("\r\n");
      out.write("\r\n");

int localcount = 0;

count++;
localcount++;

      out.write("\r\n");
      out.write("\r\n");
      out.write("<p>\r\n");
      out.write("スクリプトレット内のカウントは");
      out.print( localcount );
      out.write("です。\r\n");
      out.write("</p>\r\n");
      out.write("\r\n");
      out.write("<p>\r\n");
      out.write("変数宣言で作成したカウントは");
      out.print( count );
      out.write("です。\r\n");
      out.write("</p>\r\n");
      out.write("\r\n");
      out.write("</body>\r\n");
      out.write("</html>\r\n");
    } catch (Throwable t) {
    } finally {
    }
  }
}

この中で変数「count」と変数「localcount」が宣言されている位置について見てください。「count」はJSPページにリクエストがあった時に呼ばれる「_jspService」メソッドの外で宣言されています。その為、JSPページがTomcatにロードされた時に一度初期化は行われますがJSPページが呼び出されるたびに初期化されるということはありません。

それに対して「localcount」は「_jspService」メソッド内で宣言されています。その為、JSPページが呼び出されるたびに作成され初期化されます。

ではJSPページを一度呼び出した後で再読み込みなどを使って再度同じJSPページを呼び出してみてください。

変数の宣言

このように変数宣言で作成した変数は初期化は一度だけですので2回目以降に呼び出されると前の状態の変数の値を記憶しています。

※先ほどのサンプルのコンテキストファイルと配置場所を念のため記載しておきます。

<Context path="/hellojsp"
docBase="d:/jsp-sample/hello"/>
[D] -- jsp-sample
        |
        +-- hello
        |    |
             +-- (count.jsp)
             |

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。