카테고리 없음

웹 강좌 기록 9 - redirect, forward

wakeandweep 2019. 10. 23. 01:15
728x90

1) redirect

2) forward

 

1. Redirect (리다이렉트)

(1) 정리: 서버가 클라이언트에게 302 상태코드URLLocation 헤더에 주면서 해당 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>