forward


Review

  • クライアントがサーバに要求を送信すると、WASは要求オブジェクトと応答オブジェクトを生成する.
  • リクエストがアクセスして応答する前に、リクエスト、応答オブジェクトは維持された状態にある.
  • forward vs redirect


    forward
  • forwardは、リクエスト、応答オブジェクトを作成します.一度頼む
  • 転送後urlは変更されません.
  • redirect
  • redirect 01のリクエストの後、redirect 02のリクエストは新しいので、2回のリクエスト、レスポンスオブジェクトが作成されます.2度頼む

    forward

  • Webブラウザがサーブレット1に要求
  • を送信する.
  • サーブレット1は要求を処理し、結果をHttpサーブレットRequestに保存する
    (サーブレット1の領域変数はサーブレット2では使用できないため、サーブレット1とサーブレット2の両方にアクセス可能なものが必要であるため、結果を要求オブジェクトHttpサーブレットRequestに格納する)
  • サーブレット1は、結果が保存するHttpサーブレットRequestと応答するHttpサーブレットResponseとを同じWebアプリケーションのサーブレット2(転送)
  • に送信する.
  • サーブレット2は、サーブレット1から受信HttpサーブレットRequestおよびHttpサーブレットResponseを使用して要求を処理し、結果をWebブラウザ
  • に送信する.

    実習

    // FrontServlet.java
    package examples;
    
    import java.io.IOException;
    
    import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    @WebServlet("/front")
    public class FrontServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    	
        public FrontServlet() {
            super();
        }
    
    	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		int diceValue = (int)(Math.random() * 6) + 1;
    		request.setAttribute("dice", diceValue);
    		
    		RequestDispatcher requestDispatcher = request.getRequestDispatcher("/next");
    		requestDispatcher.forward(request, response);
    	}
    }
    // NextServlet.java
    package examples;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    @WebServlet("/next")
    public class NextServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    
        public NextServlet() {
            super();
        }
    
    	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		response.setContentType("text/html");
            PrintWriter out = response.getWriter();
            out.println("<html>");
            out.println("<head><title>form</title></head>");
            out.println("<body>");
    
            int dice = (Integer)request.getAttribute("dice");
            out.println("dice : " + dice);
            for(int i = 0; i < dice; i++) {
                out.print("<br>hello");
            }
            out.println("</body>");
            out.println("</html>");
    	}
    }

    結果

  • リダイレクトとは異なり、forwardはurlが変わらないことを見ることができる.