Going my way

いいなと思ったことをメモしていきます。

Javaサーブレット dispatchの方法と仕組み


Advertisements


ディスパッチとは、サーブレットから他のリソースにリクエストを転送すること。
javax.servlet.RequestDispathcerインターフェースを利用する。

ここでは、ForwardServletに向けたリクエストをForwardServletBに転送する処理のサンプルを記載する。

package dispatch;

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 ForwardServlet extends HttpServlet{
	public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
		
		//コンソールに出力
		System.out.println("Call ForwardServlet");
		
		//RequestDispatcherオブジェクトは画面の遷移先を定義するオブジェクト
		RequestDispatcher dispatcher = request.getRequestDispatcher("/ForwardServletB");
		dispatcher.forward(request,response);
	}
}

getRequestDispatcherのパスの指定は、[/]で始まる場合はWebアプリケーションのルート(コンテキストルート)からの相対パスである。
[/]で始まらない場合は、リクエストされたURLからの相対パスである。

RequestDispatcher dispatcher = request.getRequestDispatcher("/ForwardServletB");

今回はrequest.getRequestDispatcher("/ForwardServletB");と設定した。
それは、web.xmlに以下のように定義したからだ。

  <servlet>
     <servlet-name>ForwardServlet</servlet-name>
     <servlet-class>dispatch.ForwardServlet</servlet-class>
  </servlet>
  <servlet-mapping>
     <servlet-name>ForwardServlet</servlet-name>
     <url-pattern>/ForwardServlet</url-pattern>
  </servlet-mapping> 
  
    <servlet>
     <servlet-name>ForwardServletB</servlet-name>
     <servlet-class>dispatch.ForwardServletB</servlet-class>
  </servlet>
  <servlet-mapping>
     <servlet-name>ForwardServletB</servlet-name>
     <url-pattern>/ForwardServletB</url-pattern>
  </servlet-mapping> 
  

を見ると、
ForwardServletBのURLは、(コンテキストルート)/ForwardServletBに設定されている。


上記のサーブレット宛のリクエストを別のサーブレットに転送する。
転送先のサーブレットは以下のとおり。

package dispatch;

import java.io.IOException;

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

public class ForwardServletB extends HttpServlet{
	public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{
		System.out.println("Call ForwardServletB");
		response.setContentType("text/plain; charset=Windows-31J");
		response.getWriter().println("ForwardServletBのメッセージ");
	}
}


ForwardServletにHTTPリクエストすると、ブラウザには下記のように表示される
http://localhost:8080/basic/ForwardServlet

ForwardServletBのメッセージ