csmoon1010의 SW 블로그

JSP의 redirect & forward - (부스트코스) 본문

웹/백엔드

JSP의 redirect & forward - (부스트코스)

csmoon1010 2021. 3. 23. 15:39

1. redirect

  • HTTP프로토콜로 정해진 규칙
  • 정의 : 서버가 클라이언트의 요청에 대해 클라이언트의 특정 URL로 이동을 요청하는 것
  • 동작과정
    • 서버 : HTTP 상태코드 302로 클라이언트에게 응답 (헤더 내 Location 값에 이동할 URL 추가) 
    • 클라이언트 : 헤더(Location)에 포함된 URL로 서버에게 재요청 (브라우저의 주소창은 새 URL로 바뀜)
  • 사용 메소드 : HttpServletResponse 클래스의 sendRedirect() 메소드

※ 주의할 점 : redirect01.jsp 요청 때와 redirect02.jsp 요청 때의 Request, Response 객체는 다름

cf> HTTP 상태코드 : developer.mozilla.org/ko/docs/Web/HTTP/Status

cf> 참고할만한 글 : ideveloper2.dev/blog/2020-02-09--%EB%A6%AC%EB%8B%A4%EC%9D%B4%EB%A0%89%EC%85%98%EA%B3%BC-%EB%B6%80%ED%95%98%EA%B7%A0%ED%98%95/

 

 

 

2. forward

  • Servlet이나 JSP가 요청을 처리하다가, 추가적인 처리를 같은 웹 어플리케이션에 포함된 다른 서블릿이나 JSP에게 위임
  • 동작과정
    1. 웹 브라우저 : Servlet1에게 요청 전송
    2. Servlet1 : 요청을 처리한 후, 그 결과를 HttpServletRequest에 저장
    3. Servlet1 : 결과가 저장된 HttpServletRequest와 응답을 위한 HttpServletResponse를 같은 웹 어플리케이션 안에 있는 Servlet2에게 전송(forward)
    4. Servlet2 : Servlet1으로 부터 받은 HttpServletRequest와 HttpServletResponse를 이용하여 요청을 처리한 후 웹 브라우저에게 결과를 전송
  • redirect와의 차이점
    • 동일한 Request, Response 객체를 사용함
    • URL에는 변화가 없음

 

[예제]

  • FrontServlet : 주사위를 던져서 나온 값(1~6까지의 random 수)을 Request객체에 담아 Forward 
  • NextServlet : 전달받은 수만큼 hello를 출력
package examples;

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 {
		// TODO Auto-generated method stub
		int deviceValue = (int)(Math.random() * 6) + 1;
		request.setAttribute("dice", deviceValue);
		RequestDispatcher requestDispatcher = request.getRequestDispatcher("/next"); //같은 웹 어플리케이션 내에서
		requestDispatcher.forward(request, response);
	}
}

 

package examples;

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;

@WebServlet("/next")
public class NextServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

    public NextServlet() {
        super();
    }

	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.print("hello<br>");
		}
		
		out.println("</body>");
		out.println("</html>");
	}

}

※ 프로그램 로직 개발이 편리한 Servlet과 HTML 태그 출력이 편리한 JSP의 특성을 반영

→ Servlet에서 로직을 처리한 뒤 "forward"를 통해 JSP에서 결과값을 출력!

 

 

 

3. servlet & jsp의 연동 (forward)

  • Servlet : 프로그램 로직 수행에 유리 (IDE 등에서 좀 더 지원)
  • JSP : 결과를 출력하기에 Servlet보다 유리 (필요한 html문을 그냥 입력)

⇨ 프로그램 로직 수행은 Servlet에서, 결과 출력은 JSP에서!!

 

[예제]

  • LogicServlet : 1~100사이의 랜덤수 2개를 더하는 로직
  • result.jsp : 전달받은 값의 결과를 html로 출력

package examples;

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("/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 requestDispatcher = request.getRequestDispatcher("/result.jsp");
		requestDispatcher.forward(request, response);
	}

}

 

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
EL표기법으로 출력합니다.<br>
${v1} + ${v2} = ${result} <br><br>

스클립틀릿과 표현식을 이용해 출력합니다.<br>
<%
	int v1 = (Integer)request.getAttribute("v1");
	int v2 = (Integer)request.getAttribute("v2");
	int result = (Integer)request.getAttribute("result");
%>
<%=v1 %> + <%=v2 %> = <%=result %>
</body>
</html>
Comments