웹 강좌 기록 9 - redirect, forward
1) redirect
2) forward
1. Redirect (리다이렉트)
(1) 정리: 서버가 클라이언트에게 302 상태코드와 URL을 Location 헤더에 주면서 해당 URL로 이동하라고 요청하는 것
(2) 특징
- HTTP 프로토콜로 정해진 규칙
- 클라이언트는 서버로 부터 받은 상태값이 302일 경우 Location 헤더 값에 있는 URL로 재요청
- 클라이언트 브라우저의 주소창은 해당 URL로 바뀜
- 서블릿이나 JSP는 redirect기능을 사용하기 위해 HttpServletResponse가 가진 sendRedirect() 메서드를 사용
response.sendRedirect("redirect02.jsp");
- 클라이언트가 2번 요청을 한다는 것이 중요!: 첫 번째 요청과 두 번째 자동 요청에 필요한 각각의 요청객체 + 응답객체는 서로 다름
(3) JSP에서 redirect 해보기
redirect01.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
response.sendRedirect("redirect02.jsp");
%>
redirect02.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
redirected page!
</body>
</html>
redirect01.jsp 요청 시 거의 바로 다음과 같은 화면이 나옴
2. Forward (포워드)
(1) 정리: WAS의 서블릿이나 JSP에서 요청을 받아 그 요청을 처리하다가, 추가적인 처리를 위해 해당 같은 웹 앱에 포함된 다른 서블릿 또는 JSP에 위임하여 그 서블릿이나 JSP가 추가 처리하여 클라이언트에게 응답하는 것
(2) 특징
- 클라이언트 브라우저의 URL이 바뀌지 않는다.
- 첫 서블릿에서 썼던 값을 다음 서블릿에서 사용할 수 있도록 request객체에 저장을 해서 두 서블릿이 공유한다.
request.setAttribute("dice", diceValue);
- 서블릿이나 JSP는 forward 기능을 사용하기 위해 RequestDispatcher 객체에다가 다음 서블릿의 경로를 설정해주고, RequestDispatcher 객체가 가진 forward함수 사용.
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/next");
requestDispatcher.forward(request, response);
(3) redirect와 forward의 차이점
redirect | forward | |
클라이언트에서 요청 횟수 | 2번 | 1번 |
클라이언트 브라우저에서 URL | 바뀌게 된다. | 바뀌지 않는다. |
요청 + 응답 객체 | 2 쌍 | 1 쌍만 만들어짐 |
(4) forward 실습
FrontServlet.java
package exam;
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);
// forward하기 위한!
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/next");
requestDispatcher.forward(request, response);
}
}
NextServlet.java
package exam;
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;
/**
* Servlet implementation class NextServlet
*/
@WebServlet("/next")
public class NextServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public NextServlet() {
super();
// TODO Auto-generated constructor stub
}
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<body>");
int dice = (Integer)request.getAttribute("dice");
out.println("dice: " + dice + "<br>");
for (int i = 0 ; i < dice; i++) {
out.println("DICE FOR " + dice + "TIMES!<br>");
}
out.println("</body>");
out.println("</html>");
}
}
3. Forward 사용하여 서블릿과 jsp 연동하기
강좌 이름: 3) servlet & jsp 연동
(1) 정리
servlet | jsp |
자바코드이기 때문에 로직 수행이 유리 | 결과 출력에 유리 |
서블릿에서 프로그램 로직을 수행하고, JSP에 forward 하여 결과를 출력하는 방식으로 서블릿과 JSP를 연동 |
(2) 실습 : 1~100 구간의 랜덤한 수를 두 개 구해서 그 합을 보여주는 웹 페이지 - 서블릿에서 랜덤 수 2개 구하고, 더한 다음 jsp에서 응답 결과를 보여주는 역할만!
(JSP에서는 자바코드를 줄이는게 좋아요. 디자인 부분쪽이 많이나오고 그냥 출력 용도로 쓰는게 좋아요)
LogicServlet.java
package exam;
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;
/**
* Servlet implementation class LogicServlet
*/
@WebServlet("/logic")
public class LogicServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public LogicServlet() {
super();
}
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int v1 = (int)(Math.random() * 100 ) + 1;
int v2 = (int)(Math.random() * 100 ) + 1;
int result = v1 + v2;
request.setAttribute("v1", v1);
request.setAttribute("v2", v2);
request.setAttribute("result", result);
RequestDispatcher rd = request.getRequestDispatcher("/result.jsp");
rd.forward(request, response);
}
}
result.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
int v1 = (int)request.getAttribute("v1");
int v2 = (int)request.getAttribute("v2");
int result = (int)request.getAttribute("result");
%>
<%= v1 %> + <%= v2 %> = <%= result %>
</body>
</html>