Servlet/JSP 基礎編09 フォワード・インクルード

はじめに

この記事では「フォワードとインクルード」、次回は「リダイレクト」の二つについて解説します。なぜ、この二つを記事にするのかというと、実際のWebアプリケーションでは、サーブレットが使いやすいところ、JSPが使いやすいところで処理を回すのが普通であるからだ。そして、この処理を渡すのがフォワードやインクルードという技術である。

フォワードとインクルード

フォワードもインクルードも、他のJSPサーブレットに処理を渡すという機能であるが、この二つの違いが気になる人もいるのではないだろうか?
二つの大きな違いは、フォワードは完全に処理を最後まで他のJSPサーブレットに任せ、インクルードは、処理を任せる点は同じだが、最後の出力の処理を元の方でしなければならない。簡単に言うと、インクルードする側がレスポンスを出力するということである。
大して利点ではないと思えるが、複数のJSPサーブレットで処理するとき、複数から出力するよりも、最後に一つの場所から出力できるほうが制御できる。

フォワード」のプログラム

サーブレットからJSPフォワードするプログラムを作成する。
今までの記事では、二つは別々で紹介していたが、これからは二つ同時に使っていきたいと思う。一つ目はサーブレットからJSPフォワードをするので、ブラウザでサーブレットを開いたときに、JSP内の処理が画面に出れば、フォワード成功となる。

実際のサーブレットのプログラムは下記である。

public class Forward extends HttpServlet{

    public void doGet(HttpServletRequest request , HttpServletResponse response)
    throws ServletExceptionIOException{
        request.getRequestDispatcher("forward.jsp").forward(request,response);
    }
}

 これはサーブレットのプログラムである。「getRequestDispatcher」の引数には、サーブレットJSPファイルのパスを入れる。これで、「forward.jsp」へ遷移するオブジェクトを取得できた。そして、「forword」で、フォワードを送ることができる。

ここから先は、JSPの処理に移る。JSPプログラムは下記である。

<%@page contentType="text/html; charset=UTF-8" %>
<%@include file="../header.html" %>

<p>フォワード先のJSPファイルです</p>

<%@include  file="../footer.html" %>

 今回は、フォワードを確かめるだけなので、ブラウザに「フォワード先のJSPファイルです」という文を表示します。

実行した結果は以下のようになった。

 

フォワード先のJSPファイルです

 

サーブレットで開いたのだが、ちゃんとフォワードされて、JSPファイルの内容が表示されている。

「インクルード」のプログラム

次は、インクルードがどのようなプログラムで動くのか見てみたいと思う。

しかし、プログラムだけ見ても、あまりフォワードとの違いが分からないと思うので、雰囲気だけ味わっていただければと思う。

今回のプログラムでは、二つのJSPファイルにインクルードをし、その返答を呼び出し元のサーブレットで受け取り、画面に表示するというものにする。

まず、サーブレットは以下である。

public class Include extends HttpServlet{

    public void doGet(HttpServletRequest request , HttpServletResponse response)
     throws ServletException,IOException{
        response.setContentType("text/html; charset=UTF-8");
        PrintWriter out = response.getWriter();

        Page.header(out);
        request.getRequestDispatcher("include1.jsp").include(request,response);
        out.println("include1.jspから戻ってきました");
        request.getRequestDispatcher("include2.jsp").include(request,response);
        out.println("include2.jspから戻ってきました");
        Page.footer(out);
    }
}

 フォワードの時と、同じく、「getRequestDispatcher」を使い、インクルード先のファイルを指定する。そして、「include」でインクルードを行う。

インクルード先のファイルのプログラムは次のとおりである。

<%@page contentType="text/html; charset=UTF-8" %>
<p>include1.jspの内容<p>

 これはinclude1.jspである。

<%@page contentType="text/html; charset=UTF-8" %>
<p>include2.jspの内容<p>

 これはinclude2.jspである。

いつもは、ヘッダーと、フッターのファイルをincludeディレクティブで入れているのだが、出力をサーブレット側で行うので、JSPファイルにそれらのファイルを入れる必要はなく、出力したいものを書き込むだけでよい。

結果は下記の通りである。

 

include1.jspの内容

include1.jspから戻ってきました

include2.jspの内容

include2.jspから戻ってきました

 

JSPファイルの処理をしてから、サーブレットのファイルへ戻ってきていることが分かると思う。

ちなみに、「フォワード」のサーブレットに次のようなプログラムを書き加えた。

 public void doGet(HttpServletRequest request , HttpServletResponse response)
    throws ServletExceptionIOException{
        response.setContentType("text/html; charset=UTF-8");
        PrintWriter out = response.getWriter();
        request.getRequestDispatcher("forward.jsp").forward(request,response);
        out.println("forward.jspから戻ってきました");
    }

 先ほどと違うのは、printlnメソッドを加えた部分だ。

実行結果は、はじめと変わらなかった。

これで、「フォワード」と「インクルード」の違いがより理解できたと思う。

おわりに

今回は、画面遷移の「フォワード」と「インクルード」を紹介した。次回は「リダイレクト」について紹介する。「リダイレクト」と聞いたことがない人もいると思うが、経験した人はかなりいると思う。次回、お楽しみに!