ここまで説明した<jsp:include>タグは、JSPの標準アクションとして規定されているものです。
一方、同タグと同様のインクルードを実現する手段として、ディレクティブである<%@ include>タグも用意されています。このタグは以下の要領で記述します。
<%@ include file="<URL>" %> |
ここでfile属性には、<jsp:include>タグの場合と同じく相対URLを記述します。
では、先ほどのサンプル・コードと同様のインクルード処理を、今度は<%@ include>タグを使って実装してみましょう。インクルード対象のdate.jspページはそのまま利用し、インクルード元のtest.jspに以下の変更を加えます。
<%@ page contentType="text/html; charset=Shift_JIS" %> |
このように、<jsp:include>タグの代わりに<%@ include>タグを記述します。このように変更した後でWebブラウザからtest.jspページを開くと、先ほどと同様に日時がインクルードされる動作を確認できます。
これら2つのタグには、表面上は違いがありません。しかし実際には、「インクルード対象の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ファイルがあるとします。
ここで<jsp:include>タグを使い、インクルード元JSPページparent.jspにて、
<jsp:include page="a/child.jsp" /> |
と記述し、またサブディレクトリaにあるインクルード対象のJSPページchild.jspにて、
<jsp:include page="b/grandchild.jsp" /> |
と記述します。この場合、「b/grandchild.jsp」は、child.jspを起点とした相対URLです。よって結果は、「/a/b/grandchild.jsp」をインクルードすることになります。
これに対し、<%@ include>タグを使い、parent.jspにて、
<%@ include file="a/child.jsp" %> |
と記述し、またchild.jspにて、
<%@ include page="b/grandchild.jsp" %> |
と記述した場合、この「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.