package com.study;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class SetDataServlet extends HttpServlet {
public void doGet(HttpServletRequest _request, HttpServletResponse _response)
throws IOException, ServletException {
String data1 = _request.getParameter("data1");
String data2 = _request.getParameter("data2");
String data3 = _request.getParameter("data3");
// 폼에서 넘어온 데이터 확인
System.out.println("data1: " + data1);
System.out.println("data2: " + data2);
System.out.println("data3: " + data3);
// request 객체에 저장
_request.setAttribute("data_request", data1);
// session 객체에 저장
HttpSession session = _request.getSession();
session.setAttribute("data_session", data2);
// application 객체에 저장
ServletContext application = this.getServletContext();
application.setAttribute("data_application", data3);
// 페이지 이동 (sendRedirect)
_response.sendRedirect("viewData.jsp");
}
}
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%
String data1 = request.getParameter("data1");
String data2 = request.getParameter("data2");
String data3 = request.getParameter("data3");
String data_request = (String)request.getAttribute("data_request");
String data_session = (String)session.getAttribute("data_session");
String data_application = (String)application.getAttribute("data_application");
%>
<!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=EUC-KR">
<title>넘어온 데이터</title>
</head>
<body>
data1 : <%= data1 %><br/>
data2 : <%= data2 %><br/>
data3 : <%= data3 %><br/><br/>
data_request : <%= data_request %><br/>
data_session : <%= data_session %><br/>
data_application : <%= data_application %><br/>
</body>
</html>
....
<servlet>
<servlet-name>SetData</servlet-name>
<servlet-class>com.study.SetDataServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SetData</servlet-name>
<url-pattern>/settingData.do</url-pattern>
</servlet-mapping>
....
<!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=EUC-KR">
<title>데이터 넘기기</title>
</head>
<body>
<form name="myForm" action="/SetDataTest/settingData.do">
data1: <input type="text" name="data1"/><br/>
data2: <input type="text" name="data2"/><br/>
data3: <input type="text" name="data3"/><br/>
<input type="submit" value="전송"/>
</form>
</body>
</html>
결과를 확인해보자.
sendDirect를 사용하여 페이지 이동 시 다음과 같이 request 객체에서 뽑아낸 데이터는 값이 없다.

sendDirect는 request 버퍼를 비우고 페이지를 이동하기 때문이다.
session과 application의 데이터 영역은 그대로 유지되었다.
RequestDispatcher의 forward를 사용하면 request 버퍼를 그대로 유지하면서 페이지 이동이 가능하다.
SetDataServlet.java 의 페이지 이동 부분을 다음과 같이 수정한다.
// 페이지 이동 (forward)
RequestDispatcher dispatcher = application.getRequestDispatcher("/viewData.jsp");
dispatcher.forward(_request, _response);
다음과 같이 request 객체에서 뽑은 데이터도 그대로 유지되고 있다.
