[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: