連載
» 2007年03月23日 00時00分 公開

JSPのインクルードがうまくいかない! なぜ?やり直し「JSPとTomcat」(11)(2/2 ページ)

[吉川和巳,有限会社スティルハウス]
前のページへ 1|2       

<%@ include>タグはディレクティブ

  ここまで説明した<jsp:include>タグは、JSPの標準アクションとして規定されているものです。

 一方、同タグと同様のインクルードを実現する手段として、ディレクティブである<%@ include>タグも用意されています。このタグは以下の要領で記述します。

<%@ include file="<URL>" %>

 ここでfile属性には、<jsp:include>タグの場合と同じく相対URLを記述します。

 では、先ほどのサンプル・コードと同様のインクルード処理を、今度は<%@ include>タグを使って実装してみましょう。インクルード対象のdate.jspページはそのまま利用し、インクルード元のtest.jspに以下の変更を加えます。

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

<html>
    <head>
        <title>JSPサンプル</title>
    </head>
    <body>
        こんにちは、今の日時は <%@ include file="date.jsp" %> です。
    </body>
</html>

 このように、<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にて、

<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種類のタグについて紹介しました。


前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。