11.5.他のファイルをインクルードする
 11.5.1.ディレクティブによるインクルード
 11.5.2.アクションによるインクルード
 11.5.3.ディレクティブとアクションの違い
 


11.5.他のファイルをインクルードする

 11.5.1.ディレクティブによるインクルード
    JSPではJSPの中でJSPやhtmlを読み込んで、一つのページを複数のJSPで構成することができるようになっています。いままでの技術だとSSIのようなものです。したがって、複雑なページを出力するJSPは一つのJSPではなく複数のJSPになっていることが多いです。

 JSPには他のJSPやhtmlをインクルードする方法に二通りの方法があります。まずは、ディレクティブによるインクルードを紹介します。とりあえず、下の二つのJSPを入力してみてください。一つ目はインクルードされるほうで、二つ目がインクルードする方のJSPです。

ex11_5_1-i.jsp
<% out.println("これはインクルードされたJSPです。");%>

ex11_5_1.jsp
<html>
<head><title>ex11_5_1.jsp</title></head>
<body>
<p>他のファイルをインクルードする</p><BR>
<p>これはex11_5_1.jspの中の文章です。</p>
<%@ include file="ex11_5_1-i.jsp" %>
</body>
</html>

 なには、ともあれとりあえずは実行してどんな感じになるのか、実験してみましょう。今回はJSPが二個ありますが、「http://localhost:8080/ex/ex11_5_1.jsp」を開きます。すると、下のように「ex11_5_1.jsp」の内容と「ex11_5_1-i.jsp」の内容を含んだ画面が表示されるはずです。



 それでは、コードの説明をしていきます。
 まず「ex11_5_1-i.jsp」のほうはなんら問題ないと思います。これは「out.println()」を用いて文章を出力しているわけですね。
 次の「ex11_5_1.jsp」が今回の注目点です。まず5行目までは問題ないと思いますが。その次の6行目が重要です。これは<%@ %>を用いて「ex11_5_1-i.jsp」をインクルードしています。つまり、ここで「ex11_5_1-i.jsp」が実行されてその出力がこの部分に挿入されることになります。よって、出力結果は上のようになるわけです。

 11.5.2.アクションによるインクルード
    今度は二つ目のインクルードの紹介です。これもまた、とりあえずはコードを入力してみましょう。インクルードされるファイルは先ほどと同じ「ex_11_5_1-i.jsp」を使います。
ex11_5_2.jsp
<html>
<head><title>ex11_5_2.jsp</title></head>
<body>
<p>他のファイルをインクルードする</p><BR>
<p>これはex11_5_2.jspの中の文章です。</p>
<jsp:include page="ex11_5_1-i.jsp" flush="true" />
</body>
</html>

 これを実行してみると、やはり先ほどと同じように出力されます。


 それでは、コードの説明をします。
 このJSPで上の「ex11_5_1.jsp」と異なっているのは6行目だけですよね。今度は「<jsp:include page="<ファイル名>" flush="true">」というものを使いました。この「<JSP:」から始まるタグはアクションタグといいJSPに対して動的に処理を行わせる場合に使用します。また、詳しくは後で説明しますが、このようにアクションタグを用いても他のJSPやhtmlをインクルードすることができます。

 11.5.3.ディレクティブとアクションの違い
    さて、上で二通りのインクルードの方法を紹介しましたが、実はこの二つはまったく同じわけではありません。その違いはインクルードされるファイルがいつインクルードされるかという違いなのですが、やっぱりやってみないとぱっとしませんので、やってみましょう。

 先ほど入力した「ex11_5_1-i.jsp」を以下のように変更してみてください。
ex11_5_1-i.jsp
<% out.println("ファイルを変更しました。");%>

 そしたら、先ほどの「ex11_5_1.jsp」と「ex11_5_2.jsp」の二つのファイルを実行してみましょう。
<ex11_5_1.jspの実行結果>


<ex11_5_2.jspの実行結果>


 このように、上の「ex11_5_1.jsp」のほうは、インクルードファイルを変更したのにもかかわらず結果が反映されませんでした。しかしながら、「ex11_5_2.jsp」の方はちゃんと変更されましたよね?
 これはex11_5_1.jspのディレクティブではファイルはJSPがサーブレットにコンパイルされるときにインクルードされ、一つのサーブレットとして存在し、対するex11_5_2.jspのアクションの方では二つサーブレットとして存在しているものを、実行時にインクルードしているためです。
 このように、一見同じ動作をするように見えるものも、実は内部的にはだいぶ異なっています。ちなみに、ディレクティブでインクルードしたJSPに変更を反映させるためにはインクルード元(ex11_5_1.jsp)の更新日時を新しくしてやる必要があります。

 
   >>> 11.6.オリジナルのクラスを使うへ <<<


このドキュメントの間違い・誤字・脱字を発見された方は筆者までご連絡をいただけるとうれしいです。

また、私のわかる範囲でご質問にも答えようと思います。ご質問や疑問点がある方は気楽にメールをください。