[Web] Forward


  • Forward




1. web browser가 Servlet1에게 요청을 보냄
2. Servlet은 요청을 처리 후, 그 결과를 HttpServletRequest에 저장
3. Servlet1은 결과가 저장된 HttpServletRequest와 응답을 위한 HttpServletRequest와 응답을 위한 HttpServletResponse를 같은 웹 어플리케이션 안에 있는 Servlet2에게 전송(forward)
4. Servlet2는 Servlet1으로 부터 받은 HttpServletRequest와 HttpServletResponse를 이용하여 요청을 처리한 후 웹 브라우저에게 결과 전송

* redirect와는 다른 점을 유의 할 것
redirect는 클라이언트가 서버에 요청을 보내고 서버는 클라이언트에 새로 요청해야 할 url주소를 알려주면 클라이언트가 재요청을 보내는 작업이다. 즉 request, response 객체가 서로 2개씩 생기는 것

forward는 클라이언트가 서버에 요청했을 때 혼자 수행하는 것이 아니라 다른 서블릿(Servlet2)에 작업의 수행을 요청하고 그 response가 클라이언트에 다시 들어가는 것이다. 클라이언트는 자신이 요청한 작업을 몇개의 서블릿이 수행하는지 알 수 없다. 총 사용되는 request, response 객체는 하나 뿐이다.

forward가 발생할떄 Servlet1과 Servlet2가 공동으로 접근이 가능한 객체가 필요한데 그게바로 HttpServletRequest, HttpServletResponse 이다!


예제 : FrontServlet에서 랜덤 주사위 넘버를 생성하여 NextServlet으로 포워드하여 NetServlet은 주사위 수 만큼 'hello'를 출력한다

'Front Servlet'
1
2
3
4
5
6
7
8
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        int diceValue = (int)(Math.random()*6)+1;
        request.setAttribute("dice", diceValue);
        
        RequestDispatcher requestDispather = request.getRequestDispatcher("/next");
        requestDispather.forward(request, response);
    }
cs

'Next Servlet'

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    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.println("<br>hello");
        }
        out.println("</body>");
        out.println("</html>");
    }
cs


서블릿에서 포워드를 수행하기 위해서는 RequestDispatcher 객체와 request객체 안에 있는 getRequestDispatcher 메소드를 사용해야한다. 값을 넘겨주기 위해서는 request 객체에 setAttribute() 메소드에 넘겨주는 값을 인식할 이름 ( "dice")와 값을 인자로 준다. forward할 경로를 쓸 때 반드시 '/'로 시작해야하며 같은 웹 어플리케이션 내부에서만 가능하다. 서버에서 서버로 이동하는 작업이 아니기 때문이다.
값을 받아올 Next Servlet 에서는 request객체의 getAttribute 메서드의 인자를 아까 정해놓은 "dice"로 받아올 수 있다.


No comments:

Powered by Blogger.