redirect & forward - BE

Jaho·2021년 10월 10일

boost course

목록 보기
8/9

1) redirect

🔍 리다이렉트 (redirect)

  • 리다이렉트는 HTTP프로토콜로 정해진 규칙이다.
  • 서버는 클라이언트의 요청에 대해 특정 URL로 이동을 요청할 수 있다. 이를 리다이렉트라고 한다.
  • 서버는 클라이언트에게 HTTP 상태코드 302로 응답하는데 이때 헤더 내 Location 값에 이동할 URL 을 추가한다.
    클라이언트는 리다이렉션 응답을 받게 되면 헤더(Location)에 포함된 URL로 재요청을 보내게 된다. 이때 브라우저의 주소창은 URL로 바뀌게 된다.
  • 클라이언트는 서버로부터 받은 상태 값이 302이면 Location헤더값으로 재요청을 보내게 된다. 이때 브라우저의 주소창은 전송받은 URL로 바뀌게 된다.
  • 서블릿이나 JSP는 리다이렉트하기 위해 HttpServletResponse 클래스의 sendRedirect() 메소드를 사용한다.

✏ 실습코드

  • redirect01.jsp, redirect02.jsp 파일을 작성
  • 웹 브라우저가 redirect01.jsp을 요청
  • redirect01은 redirect02.jsp로 리다이렉팅하는 로직이 실행되도록 함
  • 결과 확인
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 PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
redirect된 페이지 입니다.
</body>
</html>

2) forward

🔍 forward

forward란?

  • 웹 브라우저에서 Servlet1에게 요청을 보냄
  • Servlet1은 요청을 처리한 후, 그 결과를 HttpServletRequest에 저장
  • Servlet1은 결과가 저장된 HttpServletRequest와 응답을 위한 HttpServletResponse 같은 웹 어플리케이션 안에 있는 Servlet2에게 전송(forward)
  • Servlet2Servlet1으로 부터 받은 HttpServletRequestHttpServletResponse를 이용하여 요청을 처리한 후 웹 브라우저에게 결과를 전송

👀 forward와 redirect의 차이점

  • redirect
    url변경된다.
    하나의 요청이 들어오면 클라이언트 측에서 재요청 하여 새로운 url로 바뀌게 된다.
  • forward
    url변경되지 않는다.
    하나의 요청이 들어와 요청을 처리한 후 응답을 내부객체로 옮긴 후 요청을 처리한 후 클라이언트에게 결과 값을 전송한다.

📎 실습코드

FrontServlet.java

   protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            
            int diceValue = (int)(Math.random() * 6) + 1; 
            request.setAttribute("dice", diceValue);
            
            RequestDispatcher requestDispatehcer = request.getRequestDispatcher("/next");
            requestDispatehcer.forward(request, response);
    }

}

NextSevlet.java

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

출력 예)
hello가 반복문을 통해 나온 숫자만큼 출력된다.

나온숫자 : 3
출력
hello
hello
hello

클라이언트가 요청을 하면 FrontServlet에서 랜덤되는 주사위의 숫자를 NextServlet에서 요청 처리 후 클리이언트에게 응답(결과 전송)


3) servlet & jsp연동

🔍 Servlet과 JSP연동

  • Servlet은 프로그램 로직이 수행되기에 유리하다. IDE 등에서 지원을 좀 더 잘해준다.
  • JSP결과를 출력하기에 Servlet보다 유리하다. 필요한 html문을 그냥 입력하면 됨.
  • 프로그램 로직 수행은 `Servlet에서, **결과 출력은 JSP`**에서 하는 것이 유리
  • ServletJSP의 장단점을 해결하기 위해서 Servlet에서 프로그램 로직이 수행되고, 그 결과를 JSP에게 포워딩하는 방법이 사용되게 되었다. 이를 ServletJSP연동이라고 한다.

📎 실습코드

LogicServlet.java

 protected void doGet(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);
    }

result.jsp

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
EL표기법으로 출력합니다.<br>
${v1} + ${v2} = ${result} <br><br>

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

<%=v1%> + <%=v2 %> = <%=result %>
</body>
</html>

EL표기법으로 간단하게 출력할 수 있다!
${v1} + ${v2} = ${result}


출력 예)
v1,v2는 랜덤한 숫자가 나오고 그 값을 result에 담아 jsp로 보내 jsp에서 출력

나온 숫자
v1 : 150
v2 : 200
result : 300

출력 :
150 + 200 = 300

--

profile
개발 옹알이 부터

0개의 댓글