1. 리다이렉트 (redirect)
- 서버는 클라이언트의 요청에 대해 특정 URL로 이동을 요청할 수 있음
클라이언트 - > 서버 -> 클라이언트 -> URL 주소 바뀜 -> 서버 (Request, Response 객체가 다시 생성됨)
1. 서버는 클라이언트에게 HTTP 상태코드 302로 응답함. 이때 헤더 내 Location 값에 이동할 URL을 추가함 (redirect02.jsp)
2. 클라이언트는 리다이렉션 응답을 받게 되면 헤더(Location)에 포함된 URL로 재요청을 보냄. 이때 브라우저의 주소창은 새 URL로 바뀜
- Servlet이나 JSP는 리다이렉트 하기 위해 HttpServletResponse 클래스의 sendRedirect() 메소드를 사용함
# redirect01.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
response.sendRedirect("redirect02.jsp");
%>
# redirect02.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>리다이렉트 된 페이지</title>
</head>
<body>
This is redirected page!
</body>
</html>
2. 포워드 (forward)
- 클라이언트가 서버에게 요청을 보냄
- Servlet1이 요청을 다 처리하지 않고, 다른 Servlet2에게 작업을 넘겨줌
- Servlet2는 마저 요청을 처리한 후, 응답을 만들어 클라이언트에게 보내줌
URL 주소가 바뀌지 않음 (Request, Response 객체가 한 번 만들어짐)
# FrontServlet.java
import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/front")
public class FrontServlet extends HttpServlet {
public FrontServlet() {
super();
}
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int diceValue = (int)(Math.random() * 6) + 1;
request.setAttribute("dice", diceValue); // dice라는 이름으로 요청에 추가해서 넘겨줄 거임
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/next"); // 이 Servlet으로 넘겨줄 거임
requestDispatcher.forward(request, response); // 처음에 생성된 요청, 응답 객체를 포워드 해줌
}
}
# NextServlet.java
import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/next")
public class NextServlet extends HttpServlet {
public NextServlet() {
super();
}
@Override
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"); // Object 타입을 Integer로 형변환
out.println("dice: " + dice + "<br>");
for(int i = 0; i < dice; i++) {
out.println("hello<br>");
}
out.println("</body>");
out.println("</html>");
out.close();
}
}
URL은 처음에 요청한 /front 임
3. Servlet과 JSP 연동
- Servlet은 프로그램 로직을 수행하기에 유리
- JSP는 결과를 출력하기에 유리
- Servlet에서 프로그램 로직이 수행되고, 그 결과를 JSP에게 포워딩하는 방법이 사용됨
# LoginServlet.java
import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/logic")
public class LogicServlet extends HttpServlet {
public LogicServlet() {
super();
}
@Override
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 dispatcher = request.getRequestDispatcher("/result.jsp");
dispatcher.forward(request, response);
}
}
# result.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>LogicServlet에서 포워딩된 페이지</title>
</head>
<body>
${v1} + ${v2} = ${result} <%-- EL 표기법 --%>
<br>
<%
int v1 = (int)request.getAttribute("v1");
int v2 = (int)request.getAttribute("v2");
int result = (int)request.getAttribute("result");
%>
<%=v1%> + <%=v2%> = <%=result%>
</body>
</html>
'강의 노트 > 웹 프로그래밍(풀스택)' 카테고리의 다른 글
[boostcourse] 2.10. JDBC - BE (0) | 2023.06.20 |
---|---|
[boostcourse] 2.5. Scope - BE (0) | 2023.06.20 |
[boostcourse] 2.3. JSP - BE (0) | 2023.06.20 |
[boostcourse] 2.2. WEB UI 개발 - FE (0) | 2023.06.19 |
[boostcourse] 1.5. Servlet - BE (0) | 2023.06.16 |