티스토리 뷰

1) redirect

- 서버가 클라이언트로 요청을 받은 후, 클라이언트에게 특정 URL로 이동하라고 요청할 수 있음

- 서버 -> 클라이언트: HTTP 상태코드 302, 이동할 URL을 헤더에 담아 전송

- 클라이언트: 서버로부터 받은 상태값이 302이면, 헤더값을 보고 해당 Location으로 이동 (즉 해당 페이지를 자동 요청)

- response 객체의 sendRedirect() 메서드를 이용하면 됨

- 크롬 개발자 도구의 Network 탭으로 가보면 302 응답코드를 확인할 수 있다

- 리다이렉트 대상 페이지를 다시 요청할 때는 또 새로운 request, response 객체가 생성된다

 

<%

response.sendRedirect("redirect02.jsp");

%>

 

2) forward

Client ->(request) -> Servlet 1 -> (forward) -> Servlet 2 -> (response) -> Client

- 요청을 해서 서블릿을 불렀는데 그 서블릿이 또 다른 서블릿을 불러서 처리를 분담하는 것

- 서버 내부적으로는 서블릿 2개가 쓰이지만 클라이언트 입장에선 1개의 요청, 1개의 응답

- 각 서블릿은 지역변수를 사용하므로, 서블릿 1이 뭔가 처리하고 나온 결과를 서블릿 2로 보내주기 위해 request 객체 안에 그 내용을 담아서 보내줌. response 객체도 같이 보내줌.

 

첫번째 서블릿:

> request.setAttribute("값이름", 값);

> RequestDispatcher reqDispatcher = request.getRequestDispatcher("포워딩할 URL");

> reqDispatcher.forward(request, response); 

두번째 서블릿:

> request.getAttribute("값이름");

 

(예제)

Front_Servlet.java의 service 메서드:

 

int dice_value = (int)(Math.random()*6) + 1;
request.setAttribute("dice", dice_value); // request 객체에 dice라는 이름으로 값을 저장
RequestDispatcher req_dis = request.getRequestDispatcher("/next"); 
req_dis.forward(request, response);

 

Next_Servlet.java의 service 메서드:

 

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"); // Object 타입으로 오기 때문에 형변환을 해줬다
out.println("dice : " + dice);
for(int i = 0; i < dice; i++) {
   out.print("<br>hello");
}
out.println("</body>");
out.println("</html>");

- 실행하면 next가 아니라 front servlet의 URL에서 저 결과가 나오는 것을 확인할 수 있음. 언뜻 보면 next에 출력하는 로직이 있으니 URL이 next로 이동했을 것 같지만, 클라이언트 입장에선 front한테 요청을 보냈다.

이것이 redirect와의 결정적인 차이.

 

3) forward를 이용한 서블릿과 JSP의 연동

- 서블릿은 프로그램 로직을 수행하기에 적합하고, JSP는 HTML 등 결과를 출력할 때 더 편리하다

- 그러므로 서블릿에서 로직을 수행하고, 그 결과를 JSP로 포워딩하는 방법이 많이 사용됨

- 방법은 2) 에서 했던 거랑 똑같음. 다만 JSP에서 받을 때 스크립트릿 영역 안에서 결과값을 받는다는 점 정도.

 

request.getRequestDispatcher("/result.jsp");

req_dispatcher.forward(request, response);

 

->

 

<%

int value1 = (int)request.getAttribute("value1");

int value2 = (int)request.getAttribute("value2");

int result = (int)request.getAttribute("result");

%>

<%=v1%> + <%=v2 %> = <%=result %>

 

+ EL 표기법: JSP에서 자바코드를 줄이기 위해 도입된 축약 표기법. 비슷한걸로 JSTL이라는 것도 있다.

${value1 } + ${value2 } = ${result}

 

getAttribute() 를 쓰지 않아도 알아서 값을 꺼내온다.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함