Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

Java JSP/Servlet

JSPにおけるincludeディレクティブとjsp:includeアクションの違い

投稿日:2021年5月15日 更新日:

<目次>

(1) JSPにおけるincludeディレクティブとjsp:includeアクションの違い
 (1-1) includeディレクティブ
 (1-2) jsp:includeアクション
 (1-3) 参考:コンパイルされたファイルの確認方法

(1) JSPにおけるincludeディレクティブとjsp:includeアクションの違い

あるページに別のページを組み込む際に、includeディレクティブによる記述や、jsp:includeアクションによる記述と2通りの方法があり、いずれも見た目の結果は同じに見えるのですが内部的な処理は異なっており、当記事ではこの両者の違いについてご紹介していきます。

(図111)見た目は同じに見える

今回は例として、「A1.jsp」という名前の「本体画面」に「B2.jsp」という「ヘッダー部品(画面)」を取り込むケースを用いて説明します。
(図112)

(1-1) includeディレクティブ

●概要

こちらは「静的」なincludeです。「静的」というのは、jspの「コンパイル時」にincludeディレクティブで指定されたソースコードを合体(取り込み)して、合わせた状態でコンパイルする方式です。jspがコンパイルされた断面の状態で、画面に表示される事になります。

(図121)includeディレクティブのイメージ

A1.jspとB2.jspを合体してコンパイルした結果がクライアントから照会されます。

●内部的な処理

内部的には「A1.jsp」と「B2.jsp」が合体された状態でコンパイルされ、その際に「pageContext.getOut()」メソッドの返却結果である「JspWriter」のインスタンスに、jspの結果をどんどん書き込んでいきます。実際にコンパイルされたファイルをご紹介します。
 
次のコンパイル結果例のように、まずは「pageContext.getOut();」で「JspWriter」型のインスタンスを取得し、そこにwriteメソッドでJSPの内容がどんどん追記されています。

(コンパイル結果例)

      ~中略~
      out = pageContext.getOut();
      _jspx_out = out;

      ~中略~
      out.write("<body>\n");
      out.write("<div>(1)includeディレクティブでHeader.jspを導入</div>\n");
      out.write("\n");
      out.write("\n");
      out.write("<!DOCTYPE html>\n");
      out.write("<html>\n");
      out.write("<head>\n");
      out.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n");
      out.write("</head>\n");
      out.write("<body>\n");
      out.write("<mark>\n");
      out.write("################# ヘッダー開始 #################<br />\n");
      out.write("<mark>ここはヘッダーです。</mark><br />\n");
      out.write("################# ヘッダー終了 ###################<br />\n");
      out.write("</mark>\n");
      out.write("</body>\n");
      out.write("</html>");
      out.write("\n");
      out.write("<br />\n");

 

(図122)includeディレクティブによる取り込み結果例

上記のような方式であるが故に、余りやらないかも知れませんが、例えば同じjspファイルを2回以上ページにincludeした場合、コンパイルエラー等になる事があります(例:<% int i=0; %>を2回includeしたら同一名前の変数を複数回定義されている事になり、エラーになります。
 

(1-2) jsp:includeアクション

こちらは「動的」なincludeです。

「動的」というのは、include対象のページに対して「リクエスト」を送り、それに対する結果である「レスポンス」を、呼び出し元の画面の<jsp:include>の箇所にその結果を取り込みます。
 
(図131)
 
加えて、「リクエスト」なので通常のリクエスト(例:画面から<form>タグでユーザ入力パラメータを渡すなど)と同様にパラメータを渡す事が出来ます。
 
常にリアルタイムでリクエストを送るため、静的なincludeに比べて最新の結果を取得できる事がメリットの反面、更にinclude画面への追加リクエストが発生するため、その分だけ性能面で静的なincludeよりも劣るケースがあります。
 
(コンパイル結果例)
out.write("<div>(2)jsp:includeアクションでHeader.jspを導入</div>\n");
org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "ITxxxx_Header.jsp", out, false);

 

(図132)

目次にもどる

(1-3) 参考:コンパイルされたファイルの確認方法

Eclipseを使用している場合のコンパイルされたjspの確認方法については、下記の記事をご参考下さい。

 

Adsense審査用広告コード


Adsense審査用広告コード


-Java, JSP/Servlet

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

TwitterAPIのJavaでの使い方をご紹介~【入門編】Twitter4j導入~ハッシュタグでツイート検索するまで~

<目次> (1) TwitterAPIのJavaでの使い方をご紹介  (1-1) STEP0:前提条件  (1-2) STEP1:ライブラリ(jar)のダウンロード  (1-3) STEP2:アプリケ …

Javaのアーキテクチャ概要やプログラムのコンパイルから実行までの流れ

(0)目次&概説 (1) 記事の目的  (1-1) 目的 (2) Javaのアーキテクチャ概要・概観  (2-1) プログラムのコンパイル~実行の流れ  (2-2) Javaアーキテクチャの特徴    …

TwitterのAPIライブラリでリツイートした人の一覧を取得する方法

<目次> (1) TwitterのAPIライブラリでリツイートした人の一覧を取得する方法  (1-1) 構文  (1-2) サンプルプログラム (1) TwitterのAPIライブラリでリツイートした …

Javaのswitch-case文の構文や使い方を紹介+UFOキャッチャーの座標移動プログラムも紹介

<目次> (1) Javaのswitch-case文の構文や使い方を紹介  (1-1) switch-caseの構文  (1-2) else-if文との比較 (2) サンプルプログラムの紹介  (2- …

JSP/Servletで画面毎のアクセスカウンターを作成してみた(パート2:ソース解説編)

(1) 仕様について (2) ソースコード  (2-1) AccessCounter2.java   (2-1-1) サンプルPG   (2-1-2) サンプルPG解説  (2-2) DbConnec …

  • English (United States)
  • 日本語
Top