내가 보려고 정리하는/JAVA

한 문서에서 다른 문서로 실행 문서를 이동시키기(forward, sendRedirect 방식)

보동이용용 2023. 1. 24. 11:58
반응형
<%@ 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>

forward방식, sendRedirect방식 연습

두 방식에 대해 알아보고 테스트 까지 해보자!

 


1. forward 방식

 

 

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을 작성해서 화면에 내보낸다.

 

Foward방식의 결과

 

 


2. sendRedirect 방식

redirect방식

==> 다른 페이지로 페이지 이동을 한다.

==> 다른 페이지로 이동할 때 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);
	}

}

 

Redirect 방식 결과

 


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