JSPで変数を定義する方法まとめ!スコープと宣言場所の違いに注意
生徒
「先生、JSPで変数を定義するにはどうすればいいんですか?」
先生
「JSPでは、Javaのように変数を宣言できますが、場所やスコープによって動きが変わってきますよ。」
生徒
「スコープっていうのは、変数がどこまで使えるかってことですか?」
先生
「そのとおりです。では、JSPでの変数の定義方法とスコープの違いを具体的に見ていきましょう!」
1. JSPで変数を定義する基本の書き方
JSPではJavaのコードを埋め込んで変数を定義できます。変数の定義には<% %>や<%! %>などの特殊なタグを使います。
- スクリプトレット:
<% %>の中で変数を定義すると、その処理はリクエストごとに実行されます。 - 宣言タグ:
<%! %>を使うと、JSPのサーブレットクラスのメンバ変数やメソッドを定義できます。
2. スクリプトレット内での変数定義
最もよく使われるのが<% %>の中での定義です。この方法で定義した変数は、そのリクエスト処理中でのみ使用可能です。
<%
String name = "山田太郎";
%>
<p>こんにちは、<%= name %>さん!</p>
このように、<%= name %>と記述することで、変数の内容をHTMLに出力することができます。
3. 宣言タグを使った変数定義と違い
<%! %>を使うと、クラスレベルの変数を定義できます。これは、サーバー内で共有されるため、複数リクエストで同じ変数を使うような場面で利用されます。
<%!
int accessCount = 0;
%>
<%
accessCount++;
%>
<p>アクセス回数:<%= accessCount %></p>
このように書くと、アクセスするたびにaccessCountが増えていきます。ただし、マルチスレッド環境では注意が必要です。
4. JSPの変数スコープの種類
JSPでは変数のスコープによって、どこまでその変数が参照できるかが決まります。以下の4つが代表的なスコープです。
- pageスコープ:そのページ内でのみ有効
- requestスコープ:同一リクエスト内で有効
- sessionスコープ:同一セッション内で有効
- applicationスコープ:アプリケーション全体で共有
スコープはsetAttributeやgetAttributeメソッドと組み合わせて使います。
5. requestスコープでの変数の受け渡し
Servletや他のJSPから値を渡すときには、requestスコープを使うことが多いです。以下のように記述します。
request.setAttribute("username", "田中花子");
<p>ようこそ、<%= request.getAttribute("username") %>さん!</p>
このように、Servletで設定した変数をJSPで受け取って表示することができます。
6. sessionスコープの使い方と注意点
sessionスコープでは、ログイン情報やユーザーごとの設定など、ユーザー単位でデータを保持できます。
session.setAttribute("userId", "abc123");
<p>ユーザーID:<%= session.getAttribute("userId") %></p>
ただし、セッションの使いすぎはサーバーのメモリ負担になるため、必要なデータだけにしましょう。
7. applicationスコープで全体共有の変数を定義
applicationスコープはWebアプリケーション全体で共通のデータを扱いたいときに使います。たとえば、全体の利用者数など。
application.setAttribute("totalAccess", 100);
<p>現在のアクセス合計:<%= application.getAttribute("totalAccess") %></p>
このように定義した変数は、全ユーザーからアクセス可能になります。ただし、書き換えには同期処理が必要なケースもあるため注意です。
8. 変数のスコープと宣言場所の違いを整理しよう
JSPで変数を定義する際には、次の3つの観点で理解するとわかりやすくなります。
- どこで定義するか(
<% %>・<%! %>) - どこまで有効か(スコープ)
- どのように共有されるか(page/request/session/application)
宣言場所とスコープが混同されやすいので、それぞれの役割と適切な使い分けを意識することが大切です。
9. JSPの変数定義に関するよくある間違い
初心者がやりがちなミスをいくつか紹介しておきます。
HTMLとJavaコードの混在による構文エラー
JSPではHTMLとJavaを混ぜて書くため、セミコロンの忘れや<% %>の閉じ忘れなどに注意が必要です。
スコープの誤用
変数のスコープを誤って設定すると、値が取得できなかったり、意図しない結果になることがあります。
宣言タグの使いすぎ
<%! %>で変数を定義しすぎると、状態がサーバーに残り続け、スレッドセーフでなくなるリスクがあります。
10. JSTLやEL式を使った代替方法
最近のJSP開発では、<% %>などのスクリプトレットを避け、JSTL(JSP Standard Tag Library)やEL式(Expression Language)を使うのが一般的です。
EL式を使えば、より見やすく、保守性の高いコードが書けます。
<p>ようこそ、${sessionScope.username} さん!</p>
このように、変数の扱いをスッキリと記述できるのが特徴です。