Javaに関する様々な情報をご紹介します。

7include、forward

Javaに関する様々な情報をご紹介します。

include、forward

このページでは、処理を他のプログラムに転送するincludeメソッド、forwardメソッドについて解説します。

概要

includeメソッドとforwardメソッドの違いは転送後に、処理が転送元に戻ってくるかどうかです。includeメソッドは転送先のプログラムを実行した後、処理が転送元に戻ってきます。forwardメソッドは転送先に処理が完全に移行し、処理が転送元に戻ってくることはありません。そのため、forwardメソッドを呼び出す前に値を出力する処理が記載されている場合は、例外がスローされます。

includeメソッド、forwardメソッドともRequestDispatcherインタフェースに定義されています。RequestDispatcherインタフェースのオブジェクトを取得するメソッドとして以下の3つのメソッドが定義されています。これらのメソッドを使用して、RequestDispatcherインタフェースのオブジェクトを取得し、includeメソッド、forwardメソッドを呼び出します。

インタフェース メソッド 説明
Servlet
Request
getRequest
Dispatcher
(String)
引数にURLを指定し、そのURLに対するRequestDispatcherオブジェクトを生成します。URLはコンテキストルートから/(スラッシュ)を含めて絶対パスで指定するか、呼び出すプログラムからの相対パスで指定します。
Servlet
Context
getRequestDispatcher
(String)
引数にURLを指定し、そのURLに対するRequestDispatcherオブジェクトを生成します。URLはコンテキストルートから/(スラッシュ)を含めて絶対パスで指定します。呼び出すプログラムからの相対パスで指定することはできません。
Servlet
Context
getNamedDispatcher
(String)
引数に<servlet-name>タグで指定したサーブレット名を指定し、そのサーブレット名に対するRequestDispatcherオブジェクトを生成します。

転送元と、転送先のデータ共有はrequestスコープを持つデータで行えます。includeメソッド、forwardメソッドとも引数にServletRequestインタフェースとServletResponseインタフェースを持っています。

戻り型 メソッド 説明
void include(
ServletRequest,
ServletResponse)
転送先に指定されたプログラムを実行し、その結果を転送元に返します。
void forward(
ServletRequest,
ServletResponse)
転送先に指定されたプログラムに処理を転送します。処理が転送元に戻ることはありません。

転送元と転送先のHTTPメソッドは同じになります。転送元のプログラムがPOSTメソッドで実行されている場合は、転送先のプログラムもPOSTメソッドになります。

includeメソッドの使用例

includeメソッドの使用例について解説します。includeメソッドで指定した転送先プログラムの実行結果を転送元で表示するプログラムです。

【ExIncludeServlet.java】includeメソッドを使用し、転送先プログラム(ExInclude2Servlet)を呼び出すプログラムです。

package pack;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class ExIncludeServlet extends HttpServlet {
    public void doGet(HttpServletRequest req, HttpServletResponse res)
            throws ServletException, IOException {
        //(1)requestスコープを持つ、データnameを登録します。
        req.setAttribute("name", "java");

        PrintWriter out = res.getWriter();
        out.println("<HTML>");
        out.println("<BODY>");

        //(2)ServletContextオブジェクトを取得します。
        ServletContext sc = getServletContext();
        //(3)RequestDispatcherオブジェクトを取得します。
        RequestDispatcher rd = sc.getRequestDispatcher("/ExInclude2Servlet");
        //(4)includeメソッドで、処理をExInclude2Servletに転送します。
        rd.include(req, res);

        out.println("</BODY>");
        out.println("</HTML>");
    }
}

【ExInclude2Servlet.java】ncludeメソッドにより呼び出されるプログラムです。

package pack;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class ExInclude2Servlet extends HttpServlet {
    public void doGet(HttpServletRequest req, HttpServletResponse res)
            throws ServletException, IOException {
        PrintWriter out = res.getWriter();
        out.println("name : ");
        //(1)転送元プログラムで登録したrequestスコープのデータを
        //   転送先で取得します。
        out.println(req.getAttribute("name"));
    }
}

【実行結果】Servletプログラムの実行方法に関しては、Javaの道:Tomcat(プログラム配置・実行)を参照してください。

Javaの道_include、forward_1

forwardメソッドの使用例

forwardメソッドの使用例について解説します。forwardメソッドで指定したプログラムに処理を転送します。処理が転送元に戻ることはありません。

【ExForwardServlet.java】forwardメソッドを使用し、転送先プログラム(ExForward2Servlet)に処理を転送するプログラムです。

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class ExForwardServlet extends HttpServlet {
    public void doGet(HttpServletRequest req, HttpServletResponse res)
            throws ServletException, IOException {
    //(1)requestスコープを持つ、データnameを登録します。
    req.setAttribute("name", "java");

    //(2)ServletContextオブジェクトを取得します。
    ServletContext sc = getServletContext();
    //(3)RequestDispatcherオブジェクトを取得します。
    RequestDispatcher rd = sc.getRequestDispatcher("/ExForward2Servlet");
    //(4)forwardメソッドで、処理をExForward2Servletに転送します。
    rd.forward(req, res);

    }
}

【ExForward2Servlet.java】forwardメソッドにより呼び出されるプログラムです。

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class ExForward2Servlet extends HttpServlet {
    public void doGet(HttpServletRequest req, HttpServletResponse res)
            throws ServletException, IOException {
    
        PrintWriter out = res.getWriter();
        out.println("<HTML>");
        out.println("<BODY>");
        
        out.println("name : ");
        //(1)転送元プログラムで登録したrequestスコープのデータを
        //   転送先で取得します。
        out.println(req.getAttribute("name"));
        
        out.println("</BODY>");
        out.println("</HTML>");
    }
}

【実行結果】Servletプログラムの実行方法に関しては、Javaの道:Tomcat(プログラム配置・実行)を参照してください。

Javaの道_include、forward_2

7include、forward