JSPの<%! %>(宣言タグ)の使い方と注意点を徹底解説!初心者向けガイド
生徒
「先生、JSPで<%! %>っていうタグを見たんですけど、これは何に使うんですか?」
先生
「それはJSPの“宣言タグ”と呼ばれるもので、クラスレベルで使いたいメソッドや変数を定義するときに使うんですよ。」
生徒
「スクリプトレットの<% %>とは何が違うんですか?」
先生
「とても良い視点ですね。それでは、<%! %>タグの基本的な使い方から一緒に見ていきましょう!」
1. JSPにおける<%! %>(宣言タグ)とは?
JSP(JavaServer Pages)では、JavaコードをHTMLの中に埋め込んでWebアプリケーションを構築できます。その中でも<%! %>は「宣言タグ」と呼ばれ、JSPファイルがサーブレットに変換される際に、クラスレベルで記述されるコードになります。
つまり、メソッドの定義やインスタンス変数の宣言などを行うときに使用します。通常のスクリプトレット(<% %>)は_jspService()メソッド内に記述されるのに対し、宣言タグはその外に記述されます。
2. JSPの宣言タグ<%! %>の基本構文
基本的な構文は以下のようになります。HTMLとJavaコードが混在しますが、宣言タグはJSPファイルのどこに書いても問題ありません。
<%!
// ここにクラスレベルで宣言する内容を書く
private int counter = 0;
public int incrementCounter() {
return ++counter;
}
%>
このように、counterという変数とincrementCounter()というメソッドを宣言しています。
3. 宣言タグで定義したメソッドや変数の使い方
宣言タグで定義した内容は、JSPページ内の他の部分から呼び出すことができます。以下に具体的な例を示します。
<%!
private int counter = 0;
public int incrementCounter() {
return ++counter;
}
%>
<html>
<body>
<p>カウント:<%= incrementCounter() %></p>
</body>
</html>
このように、<%= %>の中でメソッドを呼び出すと、カウントアップされた数値が表示されます。
4. JSPの宣言タグとスクリプトレットタグの違い
JSPには大きく分けて3種類のスクリプト要素があります。
<% %>(スクリプトレット):_jspServiceメソッド内に記述されるコード<%= %>(式):値を出力する<%! %>(宣言):クラスレベルに記述されるメソッドや変数の宣言
例えば、<% int x = 10; %>はその都度処理される一時的な変数になりますが、<%! int x = 10; %>はインスタンス変数として保持されます。
5. 宣言タグの使い所と注意点
宣言タグは便利ですが、使い方を誤ると問題が発生する可能性があります。以下のポイントに注意しましょう。
- スレッドセーフでない:JSPはマルチスレッドで動作するため、宣言タグで共有変数を持つと競合が発生する恐れがあります。
- ビジネスロジックの分離が難しい:JSPにロジックを持たせすぎると保守性が低下します。
- JSPの設計方針に反する:近年はJSPにはロジックを書かず、JSTLやEL式を使うスタイルが主流です。
そのため、宣言タグを使うのは教育目的や試験的なサンプル程度にとどめるのが望ましいでしょう。
6. JSP宣言タグの実行結果サンプル
以下は実際の実行結果の例です。ページをリロードするたびにカウントが増えることがわかります。
カウント:1
カウント:2
カウント:3
7. JSPの宣言タグを使う場面とは?
現在では、JSPの中に直接Javaコードを書くより、ServletやController、JavaBeansなどにビジネスロジックを任せるMVCモデルが推奨されています。しかし、以下のような場面では宣言タグを使うこともあります。
- サンプルコードとして簡単なデモを見せる場合
- 学習用途でJSPの仕組みを確認したいとき
- Javaの基本構文やメソッド定義の流れを説明したいとき
8. JSPを安全に運用するための代替手段
JSPにロジックを書くスタイルは推奨されていません。代わりに次のような技術を活用しましょう。
- JSTL(JSP Standard Tag Library)を使ってループや条件分岐を記述
- EL式を使って値を出力
- サーブレットやSpring MVCで処理を行い、JSPは表示専用にする
これにより、セキュリティの確保、スレッドセーフ性の向上、保守性の改善につながります。
まとめ
JSPの宣言タグ<%! %>を振り返って理解を深めよう
ここまで、JSPにおける<%! %>宣言タグの基本的な役割や使い方、スクリプトレットとの違い、注意点、そして現在主流となっている設計思想との関係について詳しく学んできました。 宣言タグは、JSPが内部的にサーブレットへ変換される仕組みを理解するうえで非常に重要な要素です。通常の<% %>スクリプトレットがリクエストごとに実行される処理であるのに対し、 <%! %>で定義した変数やメソッドはクラスレベルで保持されるため、JSPのライフサイクルやマルチスレッド動作を意識しなければなりません。
特に初心者の方は、JSPの宣言タグを使うことで「なぜ値がリロード後も保持されるのか」「なぜ同時アクセスで予期しない動作が起こるのか」といった疑問を体験的に理解できます。 これはJSPが単なるHTMLテンプレートではなく、Javaのサーブレットとして動作していることを学ぶ大切なポイントです。 JSP宣言タグの理解は、サーブレット、JavaBeans、MVCモデル、さらにはSpring MVCなどのフレームワーク学習へとつながる基礎知識になります。
宣言タグを使ったサンプルプログラムの振り返り
記事中で紹介したサンプルでは、宣言タグを使ってカウンタ変数とメソッドを定義し、JSP内で呼び出す例を確認しました。 この構成により、JSP宣言タグで定義されたメンバーがインスタンス変数として共有されることが明確になります。 以下は、学習内容を整理するためのシンプルな構成例です。
<%!
private int count = 0;
public int addCount() {
return ++count;
}
%>
<div class="card p-3">
<p>現在のカウント:<%= addCount() %></p>
</div>
このようなコードは、学習目的としては非常にわかりやすい反面、実務でそのまま使うことは推奨されません。 なぜなら、複数ユーザーが同時にアクセスした場合、count変数が共有されてしまい、意図しない値になる可能性があるためです。 ここから「JSPにロジックを書きすぎない」「状態を持たせない」という設計上の考え方を自然に理解できるようになります。
現代のJSP開発との付き合い方
現在のWebアプリケーション開発では、JSPは主に画面表示を担当する役割として使われます。 条件分岐や繰り返し処理はJSTLやEL式で表現し、業務処理やデータ操作はサーブレットやコントローラ側に分離する設計が一般的です。 その中で、JSP宣言タグは「仕組みを理解するための教材」として位置付けるとよいでしょう。
JSPの<%! %>宣言タグを学ぶことで、Java Webアプリケーションの内部構造、スレッドセーフの考え方、 MVCモデルの重要性など、多くの基礎知識がつながって理解できるようになります。 単なる文法として覚えるのではなく、「なぜ推奨されないのか」「どんな問題が起こるのか」を意識することが、理解を深める近道です。
生徒
「最初は<%! %>って便利そうだと思ったんですけど、共有変数になるって聞いて少し怖くなりました。 でも、JSPの仕組みを理解するにはすごく大事なんですね。」
先生
「その気づきはとても良いですね。宣言タグは使うためというより、JSPがどう動いているかを理解するための学習材料なんです。」
生徒
「だから最近はJSTLやEL式を使うんですね。役割を分ける理由が少しずつわかってきました。」
先生
「その通りです。JSPは表示に集中させて、処理は別の層に任せる。その考え方を身につければ、JavaのWeb開発が一気に理解しやすくなりますよ。」
生徒
「宣言タグを通して、設計の大切さまで学べた気がします。次はJSTLもちゃんと勉強してみます。」