<%@ 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>
<h2>forward방식, sendRedirect방식 연습</h2>
<form method="post" action="<%=request.getContextPath()%>/responseTest01.do">
forward 연습 : <input type="text" name="username">
<input type="submit" value="확인">
</form>
<hr>
<form method="post" action="<%=request.getContextPath()%>/responseTest02.do">
redirect 연습 : <input type="text" name="username">
<input type="submit" value="확인">
</form>
</body>
</html>
두 방식에 대해 알아보고 테스트 까지 해보자!
1. forward 방식
==> 특정 서블릿이나 JSP에 대한 요청을 다른 서블릿이나 JSP로 넘겨준다.
(이 때 Request객체와 Response객체를 넘겨준다.) ==> 데이터를 공유할 수 있다.
==> URL주소는 처음 요청할 때의 주소값이 바뀌지 않는다.
==> 서버 내부에서만 접근이 가능하다.
package kr.or.ddit.reqNresp;
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("/responseTest01.do")
public class ResponseTest01 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 현재의 페이지에서 작성한 데이터를 이동되는 다른 페이지로 넘기려면
// Request객체의 setAttribute()메서드를 이요한다.
// 형식) request.setAttribute("key값", 데이터)
// ==> 'key값'은 문자열, '데이터'는 모든 종류의 자료형
request.setAttribute("tel", "010-1234-5678");
// forward방식으로 이동하기
// 형식) request.getRequestDispatcher("이동할 문서 URL");
// '이동할 문서 URL'은 전체 URL주소 중 ContextPath이후의 주소를 기술한다.
RequestDispatcher rd = request.getRequestDispatcher("/forwardTest.do");
rd.forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
request의 setAttribute()메서드를 이용하여 데이터를 셋팅할 수 있고
request의 getRequestDispatcher()를 이용하여 forward방식으로 이동할 수 있다.
forward방식은 이동할 때 request, response객체를 가지고 같이 이동하기에 데이터를 사용할 수 있다.
이동하여 받은 데이터를 정리해보자
package kr.or.ddit.reqNresp;
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("/forwardTest.do")
public class ForwardTest extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
// forward로 넘어오기 전 문서에서 사용하던 Request객체와 Response객체를 이곳에서
// 같이 사용할 수 있다.
String userName = request.getParameter("username");
// 이전 문서에서 setAttribute()메서드로 작성한 데이터는 getAttribute()메서드로
// 받을 수 있다.
// 형식) request.getAttribute("key값");
String tel = (String)request.getAttribute("tel"); ///오브젝트로 꺼내와서 형번환
//-------------------------------------------------------------------------
response.setCharacterEncoding("utf-8");
response.setContentType("text/html; charset=utf-8");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head><meta charset='utf-8'><title>forward방식연습</title></head>");
out.println("<body>");
out.println("<h2>Forward방식결과</h2>");
out.println("<table border='1'>");
out.println("<tr><td>이 름</td>");
out.println("<td>"+ userName + "</td></tr>");
out.println("<tr><td>전 화</td>");
out.println("<td>"+ tel + "</td></tr>");
out.println("</table>");
out.println("</body></html>");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
forward로 넘어오기 전 문서에서 사용하던 request, response객체에 있던 데이터는 이곳에서 getParameter로 받는다.
forward문서에서 setAttribute로 작성한 데이터는 getAttribute로 받을 수 있고 Object형으로 오기 때문에 필요한 자료형으로
형변환하여 사용하면 된다.
//------------------------------------------------------
out.println을 이용하여 html을 작성해서 화면에 내보낸다.
2. sendRedirect 방식
==> 다른 페이지로 페이지 이동을 한다.
==> 다른 페이지로 이동할 때 Request객체와 Response객체를 공유할 수 없다.
==> 이동하기 전 페이지에서 응답으로 브라우저에게 이동할 페이지의 'URL주소'를 전송하면
웹브라우저가 이 'URL주소'로 다시 요청하는 방식으로 이동한다.
(이 때 요청은 'GET방식'으로 요청하기 때문에 URL의 길이에 제한이 있다.)
package kr.or.ddit.reqNresp;
import java.io.IOException;
import java.net.URLEncoder;
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("/responseTest02.do")
public class ResponseTest02 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// redirect방식에서는 setAttribute()메서드를 이용해서 데이터를 보낼 수 없다.
//request.setAttribute("tel", "010-7777-8888");
request.setCharacterEncoding("utf-8");
String userName = request.getParameter("username");
// reditrect방식으로 이동하기
// ==> Response객체의 sendRedirect()메서드를 이용한다.
// 형식) response.sendRedirect("전체URL주소");
response.setCharacterEncoding("utf-8");
// 이동되는 주소로 데이터를 보내려면 GET방식으로 데이터를 구성해서 보낼 수 있다.
response.sendRedirect(request.getContextPath() +
"/redirectTest.do?username=" +
URLEncoder.encode(userName, "utf-8") + ///URLEncoder.encode(): 한글이 들어갈경우 인코딩
"&tel=010-7777-8888");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
redirect방식에서는 setAttribute()메서드를 이용해서 데이터를 보낼 수 없다.
response.sendRedirect("전체URL주소"); 를 이용해서 전송
이동되는 주소로 데이터를 보내고 싶다면 GET방식으로 데이터를 구성해서 보낼 수 있다.
package kr.or.ddit.reqNresp;
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("/redirectTest.do")
public class RedirectTest extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String userName = request.getParameter("username");
//String tel = (String)request.getAttribute("tel");
String tel = request.getParameter("tel");
//-------------------------------------------------------------------
response.setCharacterEncoding("utf-8");
response.setContentType("text/html; charset=utf-8");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head><meta charset='utf-8'><title>redirect방식연습</title></head>");
out.println("<body>");
out.println("<h2>Redirect방식결과</h2>");
out.println("<table border='1'>");
out.println("<tr><td>이 름</td>");
out.println("<td>"+ userName + "</td></tr>");
out.println("<tr><td>전 화</td>");
out.println("<td>"+ tel + "</td></tr>");
out.println("</table>");
out.println("</body></html>");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
forward와 redirect의 차이점?
------------------------------------ (1) ------------------------------------
forward는 처음 만든 객체를 두개의 문서가 같이 사용하지만
redirect에서 응답받은 객체는 다른 것을 받는다.
-----------------------------------------------------------------------------------
------------------------------------- (2) -------------------------------------
forward는 request.getRequestDispatcher("이동할 문서 URL");
==> ContextPath 이후의 주소 기술
redirect는 response.sendRedirect("전체 URL주소");
==> request.getContextPath() + "/redirectTest.do?username=" + ....
==> get방식의 주소 처럼....!
------------------------------------------------------------------------------------
'내가 보려고 정리하는 > JAVA' 카테고리의 다른 글
Network Test - TCP / UDP - TCP써보자! (0) | 2023.01.24 |
---|---|
Network Test - InetAddress (0) | 2023.01.24 |
Servlet-request / response 사용해보기 (0) | 2023.01.20 |
Log4j (0) | 2023.01.18 |
iBatis(2) (0) | 2023.01.16 |