処理を転送する際に、includeメソッドとforwardメソッドを使います。
違いは、転送後に処理が処理元に戻るかどうかというところになります。
- includeメソッドは転送先のプログラム実行後、処理が処理元に戻る
- forwardメソッドは転送先に処理が完全に移行する
- forwardメソッドを呼び出す前に値を出力するなどしてると例外がスローされちゃう
include,forwardに関連するメソッド
インターフェース |
method |
説明 |
ServletRequest |
getRequestDispatcher(String) |
引数にURLを指定し、そのURLに対するRequestDispatcherオブジェクトを生成。URLはコンテキストルートから/(スラッシュ)を含めて絶対パスで指定するか、呼び出すプログラムからの相対パスで指定。 |
ServletContext |
getRequestDispatcher(String) |
引数にURLを指定し、そのURLに対するRequestDispatcherオブジェクトを生成します。URLはコンテキストルートから/(スラッシュ)を含めて絶対パスで指定。呼び出すプログラムからの相対パスで指定することはでない。 |
ServletContext |
getNameDispatcher(String) |
引数にタグで指定したサーブレット名を指定し、そのサーブレット名に対するRequestDispatcherオブジェクトを生成。 |
転送元と転送先のデータ共有に関連するメソッド
戻り型 |
method |
説明 |
void |
include(ServletRequest,ServletResponse) |
転送先に指定されたプログラムを実行し、その結果を転送元に返す。 |
void |
forward(ServletRequest,ServletResponse) |
転送先に指定されたプログラムに処理を転送します。処理が転送元に戻ることはない。 |
- 転送元と転送先のHTTPメソッドは同じになる。
- 転送元のプログラムがPOSTメソッドで実行されてる場合は、同じくPOSTメソッドになる。
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Includehoge extends HttpServlet{
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException{
req.setAttribute("name","hogehogeunkodayo");
PrintWriter out = res.getWriter();
res.setContentType("text/html; charset=Windows-31J");
out.println("<html><head><title>include method test</title></head>");
out.println("<body>");
ServletContext sc = getServletContext();
RequestDispatcher rd = sc.getRequestDispatcher("/ExInclude2Servlet");
rd.include(req,res);
out.println("</body></html>");
}
}
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("this is a data of request scope : ");
out.println(req.getAttribute("name"));
}
}
- forwardの場合は、out.printlnの実行を転送先プログラムで実行しないと!
- あとは処理同じだねー。