티스토리 뷰

Language/Java

redirect와 forward

Seogineer 2020. 12. 19. 19:43

redirect

  • 서버는 클라이언트의 요청에 대해 특정 URL로 이동을 요청하는 것.
  • 웹브라우저 -> 서버 -> 302코드, location값 -> 웹브라우저 -> location값으로 재요청 -> 웹브라우저
  • 브라우저의 주소창은 새 URL로 바뀐다.
    예) 게시글 작성 버튼 클릭시 서버에 글 작성 요청 후 글 목록으로 이동하는 경우

소스코드

redirect01.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%
    response.sendRedirect("redirect02.jsp");
%>

redirect02.jsp

<%@ 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>
    redirect된 페이지 입니다.
</body>
</html>

결과

forward

  1. 웹브라우저에서 Servlet1에게 요청
  2. Servlet1은 요청을 처리한 후, 그 결과를 HttpServletRequest에 저장
  3. Servlet1은 결과가 저장된 HttpServletRequest와 응답을 위한 HttpServletResponse를 같은 웹 어플리케이션 안에 있는 Servlet2에게 전송(forward)
  4. Servlet2는 Servlet1으로 부터 받은 HttpServletRequest와 HttpServletResponse를 이용하여 요청을 처리한 후 웹브라우저에게 결과를 전송(URL이 바뀌지 않는다.)
    예) WAS의 Servlet이나 JSP가 요청을 받은 후 그 요청을 처리하다가, 추가적인 처리를 같은 웹 어플리케이션에 포함된 다른 Servlet이나 JSP에게 위임하는 경우 forward를 사용함.

소스코드

FrontServlet.java

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 {
        int diceValue = (int)(Math.random() * 6) + 1;
        request.setAttribute("dice", diceValue);

        RequestDispatcher requestDispatcher = request.getRequestDispatcher("/next");
        requestDispatcher.forward(request, response);
    }

}

NextServlet.java

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

    @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");
        out.println("dice : " + dice + "<br>");
        for(int i = 0; i < dice; i++) {
            out.print("hello<br>");
        }

        out.println("</body>");
        out.println("</html>"); 
    }
}

결과

servlet과 jsp 연동

  • servlet은 자바 소스를 사용하기에 적합하다.
  • jsp는 HTML을 사용하기에 적합하다.
  • forward를 이용해서 각각의 장점을 이용할 수 있다.

LogicServlet.java

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

}

result.jsp

<%@ 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>
<%
    int v1 = (int)request.getAttribute("v1");
    int v2 = (int)request.getAttribute("v2");
    int result = (int)request.getAttribute("result");
%>
<%=v1 %> + <%=v2 %> = <%=result %>
</body>
</html>

결과

참조

https://www.boostcourse.org/web316/lecture/19878
https://www.boostcourse.org/web316/lecture/16705
https://www.boostcourse.org/web316/lecture/16706

'Language > Java' 카테고리의 다른 글

JDBC 설정  (0) 2020.12.21
Maven 환경설정  (0) 2020.12.21
JSP(JavaServer Pages)  (0) 2020.12.17
Servlet 생명주기  (0) 2020.12.09
접근제어자(Access Modifiers)  (0) 2020.12.09
댓글
Total
Today
Yesterday
링크
Apple 2023 맥북 프로 14 M3, 스페이스 그레이, M3 8코어, 10코어 GPU, 512GB, 8GB, 한글