includeとforwardで処理を転送してみる

処理を転送する際に、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メソッドになる。
// sample code
// 転送元(include)
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{
		
		// requestスコープを持つデータnameを登録
		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>");
	}

}


// 転送先
// dataはincludeに戻るよ
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();
	    //   転送元プログラムで登録したrequestスコープのデータを
	    //   転送先で取得します。
	    out.println("this is a data of request scope : ");
	    out.println(req.getAttribute("name"));
	  }
}
  • forwardの場合は、out.printlnの実行を転送先プログラムで実行しないと!
  • あとは処理同じだねー。