JSP

Forwarding

김마리님 2020. 5. 27. 14:16

서블릿에서 특정 사이트로 포워딩 하는 방식이 두 가지가 있다.

서블릿은 요청을 다른 곳으로 위임하는건데, 언뜻 들으면 무슨 말인지 이해가 안된다.

그럼 이걸 그림으로 보자.

처음 클라이언트가 개인정보를 입력하고 서버에 가입을 요청한다. 그러나, 서버는 이것을 요청할 때 직접 데이터베이스에 접근하지 않고, 스스로를 한번 더 요청, 응답의 형태를 가진다. 그렇게 응답을 받으면 받은 세션을 가지고 데이터베이스로 전달되고, 그 전달된 데이터베이스를 바탕으로 최종적으로 가져와야할 응답을 클라이언트에게 보내주게 된다.

 

결국 클라이언트는 회원가입 버튼 한번의 요청 / 완료 창 응답 하나만을 받게 되지만, 이 응답은 실질상으로 서버가 요층과 응답 두 번을 진행하면서 받은 응답이 되는 것이다. 이렇게 되면 서버가, 클라이언트가 한 요청을 DB로 보낸 것이 되므로 이런 것을 포워딩이라고 한다.

 

회원정보 수정도 비슷한 형태로 일어난다.

다음과 같이 클라이언트가 정보 수정을 요구하면 서버는 단지 응답 받을 때 유저를 확인만 할 뿐, 수정의 책임은 DB가 지게 된다. 이렇게 수정도 DB가 지게 된다.

 

따라서, 포워딩은 내가 가지고 있는 요청 세션을 그대로 가지고 이동해야한다.

jsp에서는 이렇게 세션을 가지고 이동할때 Requestdispatcher 이라는 방식을 이용한다.

 

-Requestdispatcher 방식

 

-DispatcherServlet.java

package com.cos.ch03;

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 DispatcherServlet
 */
@WebServlet("/dispatcher")
public class DispatcherServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public DispatcherServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		RequestDispatcher dispatcher=request.getRequestDispatcher("dispatcher.jsp");
		request.setAttribute("request", "responseValue");
		dispatcher.forward(request, response);
	}

}

 

-dispatcher.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>
	request 속성 값 : <%=request.getAttribute("request") %>
</body>
</html>

서블릿에서 jsp를 요청해서 이동할 때, request.setAttribute("request", "responseValue");에서 요청 세션을 유지한 채 이동하게 되고, 이동된 세션을 jsp가 채워넣은 결과물이다.

 

 

그럼, 세션을 유지하지 않는 Redirect 방식을 보고, 결과를 비교해보자.

 

-Redirect 방식

 

-RedirectServlet.java

 

package com.cos.ch03;

import java.io.IOException;
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 RedirectServlet
 */
@WebServlet("/RedirectServlet")
public class RedirectServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public RedirectServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setAttribute("request", "requestValue");
		response.sendRedirect("redirect.jsp");
	}
}

 

-redirect.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>
	request 속성 값 : <%=request.getAttribute("request") %>
</body>
</html>

다음과 같이 결과값이 세션에 유지되지 않은 채 빈 값을 띄우게 된다.

 

반응형