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

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

関連記事

JSP/Servletで必須入力チェックを実装する方法+サンプルプログラムや操作動画も紹介

<目次> (1) JSP/Servletで必須入力チェックを実装する方法  (1-1) 必須入力チェックの概要   (1-1-1) 全体の処理フロー   (1-1-2) 必須入力チェック部分の処理フロ …

no image

HTMLで<a>要素のリンクを中央寄せする方法

<目次> (1) HTMLで<a>要素のリンクを中央寄せする方法  (1-1) 構文  (1-2) サンプルプログラム  (1-3) サンプルプログラム実行結果 (1) HTMLで< …

Javaのアノテーションとは?種類や使い方についてご紹介

<目次> (1) Javaのアノテーションとは?自作の手順やフィールド値の取得方法もご紹介  (1-1) アノテーションとは?  (1-2) アノテーションの種類  (1-3) 自作アノテーションの作 …

JavaのMapの種類や特徴について(HashMap/LinkedHashMap/TreeMap)

<目次> (1) JavaのMapの種類や特徴について(HashMap/LinkedHashMap/TreeMap)  (1-1) Mapとは?  (1-2) Mapの種類や特徴   (1-2-1) …

Javaの継承やオーバーライドとは?特徴の解説とサンプルプログラムの紹介

(0)目次&概説 (1) 継承/Inherit  (1-1) 継承とは?  (1-2) 継承の特徴  (1-3) 継承のサンプルコード   (1-3-1) Carクラス   (1-3-2) Truck …

  • English (United States)
  • 日本語
Top