JAVA:IT TRICK

フォーワード(forward)

サーブレットのディスパッチにはフォワードとインクルードがありますが、ここではフォワードについて説明します。
  • このエントリーをはてなブックマークに追加
  • Clip to Evernote
  • IT TRICK RSS

サーブレットのディスパッチにはフォワードとインクルードがありますが、ここではフォワードについて説明します。

ディスパッチのフォワードはサーブレットからサーブレットまたはJSPに処理を委託することです。以下の図ではサーブレットAがリクエストを受け取り、処理後に処理をサーブレットBに委託しています。また、サーブレットBが処理後に処理をJSPに委託しています。最後にJSPの処理結果がレスポンスとして返されます。

以下はディスパッチのフォワードを使った実際のサンプルです。

ディスパッチフォワードのサンプル

このサンプルではSample48144Aがリクエストを受け取った後、ただ単に処理をSample48144Bに委託しています。そしてSample48144Bから簡単な文字列をレスポンスとして返しています。

Sample48144Aでのフォーワード処理では、HttpServletResponseクラスのgetRequestDispatcher()メソッドからRequestDispatcherクラスのインスタンスを取得しています。この時、getRequestDispatcher()メソッドの引数にフォワード先であるサーブレットBのURL(web.xmlで定義しているURL)を指定します。フォワード処理を実行するには、取得したRequestDispatcherクラスのforwardメソッドにリクエストとレスポンスのオブジェクトを渡して行います。

Sample48144A.java

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class Sample48144A extends HttpServlet {

	public void doGet(HttpServletRequest request,
			HttpServletResponse response)
	throws IOException, ServletException {

		RequestDispatcher dispatcher = request.getRequestDispatcher("/48144B");
		dispatcher.forward(request, response);

	}
}

Sample48144Bは以下のようにフォワードされると文字列「Hello Sample48144B」をレスポンスとして返します。

Sample48144B.java


import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class Sample48144B extends HttpServlet {

	public void doGet(HttpServletRequest request,
			HttpServletResponse response)
	throws IOException, ServletException {

		PrintWriter out = response.getWriter();

		out.println("Hello Sample48144B");

	}
}

このサンプルのためのweb.xml定義です。

web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app>

	<servlet>
		<servlet-name>48144A</servlet-name>
		<servlet-class>Sample48144A</servlet-class>
	</servlet>

	<servlet>
		<servlet-name>48144B</servlet-name>
		<servlet-class>Sample48144B</servlet-class>
	</servlet>

	<servlet-mapping>
		<servlet-name>48144A</servlet-name>
		<url-pattern>/48144A</url-pattern>
	</servlet-mapping>

	<servlet-mapping>
		<servlet-name>48144B</servlet-name>
		<url-pattern>/48144B</url-pattern>
	</servlet-mapping>

</web-app>

このサンプルを実行するとブラウザで「Hello Sample48144B」の文字が表示されるはずです。