JSPのインクルードがうまくいかない! なぜ?:やり直し「JSPとTomcat」(11)(2/2 ページ)
Javaを途中までかじったが挫折した。やはりJavaプログラマにスキルチェンジしたい! という読者のために、Tomcatの最新バージョンを使いながらJSPを基礎から解説していく(編集部)
<%@ include>タグはディレクティブ
ここまで説明した<jsp:include>タグは、JSPの標準アクションとして規定されているものです。
一方、同タグと同様のインクルードを実現する手段として、ディレクティブである<%@ include>タグも用意されています。このタグは以下の要領で記述します。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
ここでfile属性には、<jsp:include>タグの場合と同じく相対URLを記述します。
では、先ほどのサンプル・コードと同様のインクルード処理を、今度は<%@ include>タグを使って実装してみましょう。インクルード対象のdate.jspページはそのまま利用し、インクルード元のtest.jspに以下の変更を加えます。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
このように、<jsp:include>タグの代わりに<%@ include>タグを記述します。このように変更した後でWebブラウザからtest.jspページを開くと、先ほどと同様に日時がインクルードされる動作を確認できます。
2つのインクルード手段は何が違うのか?
これら2つのタグには、表面上は違いがありません。しかし実際には、「インクルード対象のJSPページをいつインクルードするか」が異なります。
- <jsp:include>タグ――Webブラウザからインクルード元JSPページへのリクエストを受信するたびに、インクルード対象のJSPページを呼び出し、その出力結果をインクルードする
- <%@ include>タグ――Webブラウザからインクルード元JSPページへの初回リクエストを受信した際に、インクルード対象のJSPページをインクルードし、JSPページからサーブレットへの変換を行う
ご存じのとおり、JSPページはWebブラウザからの初回アクセス時にサーブレットへ変換されます。実は、<%@ include>タグによるインクルードは、この変換時にのみ実行されるインクルードです。いい換えれば、同タグは「2つのJSPページを1つのJSPページに組み合わせる」という働きをします。
これに対し、<jsp:include>タグは、あくまで「2つのJSPページの出力結果を組み合わせる」という処理になります。
振る舞いの違いに注意すると、次のような疑問が生じます。「<%@ include>タグでは、インクルード対象のJSPページが後から変更されても、反映されないのではないか?」
実際のところ、古いバージョンのTomcatでは、そうした現象が発生していました。しかし現在のTomcatでは、そうした現象は発生しません。これは、JSP 2.0仕様において「インクルード対象JSPページの変更をWebコンテナが検出し、自動的に反映する機能を実装してもよい」と規定されたためです。
よって現在では、<%@ include>タグと<jsp:include>タグの違いは少なくなっています。
使い分ける際の注意事項
ただし注意すべき点は、「インクルード対象JSPページ内の相対URL」の扱いです。例えば、以下の3ファイルがあるとします。
- /parent.jsp
- /a/child.jsp
- /a/b/grandchild.jsp
ここで<jsp:include>タグを使い、インクルード元JSPページparent.jspにて、
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
と記述し、またサブディレクトリaにあるインクルード対象のJSPページchild.jspにて、
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
と記述します。この場合、「b/grandchild.jsp」は、child.jspを起点とした相対URLです。よって結果は、「/a/b/grandchild.jsp」をインクルードすることになります。
これに対し、<%@ include>タグを使い、parent.jspにて、
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
と記述し、またchild.jspにて、
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
と記述した場合、この「b/grandchild.jsp」という相対URLの意味が異なるものになります。
上述したとおり、<%@ include>タグは「2つのJSPページを1つのJSPページに組み合わせる」働きを持つため、相対URL「b/grandchild.jsp」の起点は、インクルード元JSPページであるparent.jspとなるのです。よって、同URLは「/b/grandchild.jsp」を表し、「/a/b/grandchild.jsp」を正しくインクルードできません。
こうした両者の微妙な違いを理解しておくことで、実際の開発において無駄なデバッグ時間を費やすことを避けられるでしょう。
以上、今回はJSPページのインクルードを実現する2種類のタグについて紹介しました。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- 第1回 サーブレット/JSPの役割を理解する
- 第2回 サーブレット/JSPをほかの言語と比較する
- 第3回 サーブレット/JSPの開発環境を作る
- 第4回 JSPの基本構文を理解する
- 第5回 JSPの基本「暗黙オブジェクト」を使う
- 第6回 JSPの基本「暗黙オブジェクト」をさらに極める
- 第7回 Javaのクラスライブラリを攻略「基本クラス編」
- 第8回 Javaのクラスライブラリを攻略「ユーティリティ編」
- 第9回 Javaでファイルや画像を扱う
- 第10回 クラスライブラリを攻略「データベース編」
- 第11回 JSPとサーブレットの違いを明らかにする
- 第12回 JavaBeansのルールを知る
- 第13回 JavaBeansをサーブレット/JSPから利用する
- 第1回 JSPの特徴を理解する
- 第2回 JSPの実行環境を整える
- 第3回 JSPプログラミングの基本を覚える
- 第4回 Webプログラミングの前提知識をおさえる
- 第5回 インクルードによるコードの再利用で効率化をはかる
- 第6回 クラスやBeanの作成とJSPとの連携
- 第7回 JSPでセッションを扱うための基礎知識
- 第8回 JSPプログラムからクッキーを扱う
- 第9回 JSPから別のファイルにアクセスする
- 第10回 JSPからデータベースに接続する
- 第11回 データベースを活用したアプリケーション