[ JSP ] 리다이렉트(Redirect)와 포워딩(Foward)

duck-ach·2022년 10월 7일
1

JSP

목록 보기
5/14

Redirect와 Forword

Redirect

"내가 연락처 알려줄테니까 얘한테 다시 물어봐"

  • 명령 : response.sendRedirect("이동할URL");
  • 이동할 URL은 전체 URL 주소를 기술한다.

개념

  • 기존 Request를 유지하지 않는 이동 방식이다.
  • 서버가 클라이언트에게 재요청하라고 응답하는 것이므로 response를 이용해서 이동할 장소를 알려주는 방식이다.
  • 이동할 경로는 Context Path를 포함한 전체 경로로 작성해야한다.
  • 클라이언트가 직접 이동하는 방식이기 때문에 URL을 통해서 redirect 경로 확인이 가능하다.
  • DB가 변경되는 작업 이후에는 Redirect를 진행(INSERT, UPDATE, DELETE 이후에는 Redirect)

과정

  1. 사용자가 링크를 클릭 (클라이언트가 서버에 요청)
  2. 서버가 클라이언트에 Redirect 주소를 보낸다.
  3. 클라이언트는 서버에게 받은 새로운 주소로 재요청을 한다.
  4. 서버 응답

특징

  • URL이 바뀐다.
  • request와 response 객체가 새롭게 생성된다.
  • 시스템에 변화가 생기는 경우(생성, 수정, 삭제) 재요청을 방지하기 위해 사용한다.
  • redirect시 값을 전달하려면 GET방식으로 보내야 한다. 요청 객체가 새로 생성되기 때문에 값을 보내려면 URL 과 같이 보내야 하기 때문이다.
  • Spring에서는 RedirectAttribute를 사용하여 값을 보낼 수도 있다. 이 방법은 내부적으로 세션을 사용한다.

Forword

"내가 물어봐서 알려줄게"

  • 명령 :
    1. request.setAttribute("키 값", 데이터);
    1. request.setAttribute("키 값");
  • 데이터를 읽을 때 : request 객체의 setAttribute() 메서드로 데이터를 세팅하여 보낸다.
  • 데이터를 받을 때 : request 객체의 getAttribute() 메서드로 데이터를 읽어온다.
  • 이동할 URL은 전체 URL 주소를 기술한다.

개념

  • 기존 request를 유지하는 이동 방식
  • 클라이언트의 요청(request)을 서버 내 다른 곳으로 이동하는 서버 내부의 이동 방식 request.getRequestDispatcher(이동할경로).forward(request, response)
  • 이동할 경로는 ContextPath를 제외하고 서버 내부 경로만 작성해야 함
  • 서버 내부에서 이동하는 방식이기 때문에 클라이언트는 URL을 통해서 forward한 경로를 확인할 수 없음
  • DB 변경이 없는 작업이나 단순 이동의 경우 Forward를 진행(SELECT 이후에는 Forward)

과정

  1. 클라이언트가 서버에 요청
  2. 서버는 Web Container에 의해 다른 주소로 forward. 이때 객체 정보도 같이 전달한다.
  3. 서버는 새 주소에서 반환한 결과를 응답한다.

특징

  • URL이 바뀌지 않는다.
  • request와 response 객체를 유지한다.
  • 서버가 다른 페이지를 요청하는 것이므로 request로 보낸다.
  • 서버에서 페이지를 바꿔서 다시 보여준다.
  • 웹 컨테이너 내부에서만 이동이 가능하다.

주의

글쓰기나 회원가입과 같은 데이터가 변경되는 경우 forward를 사용하면 요청이 중복으로 발생할 수 있기 때문에 주의해야한다. (request, response 데이터가 계속 남아있기 때문)

Redirect 연습 1

이름과 나이를 Client로부터 전달받아 Redirect로 웹 페이지에 출력하기

기본적으로, Servlet1Servlet2가 있다고 가정하면 Redirect는 Servlet1을 통과한 후 파라미터를 소멸시키기 때문에 Servlet1에서 데이터를 받아서 Servlet2로 다시 넘겨주는 작업을 해야한다.

HTML

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	
	<!-- 
		파라미터를 전달하는 Redirect 처리하기
		prac02A -> Prac02B
	 -->
	<a href="/01_Servlet/Prac02A?name=오리&age=24">링크</a>
	
</body>
</html>

Servlet1

@WebServlet("/Prac02A")
public class Prac02A extends HttpServlet {
  
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
        // 요청
		request.setCharacterEncoding("UTF-8");
		
		String name = request.getParameter("name");
		String strAge = request.getParameter("age");
		
		int age = 0;
		if(strAge != null) {
			age = Integer.parseInt(strAge);
		}
		
        // 응답
        response.setContentType("text/html; charset=UTF-8");
		// 요청으로 받은 정보를 다시 Prac02B으로 보냄
		response.sendRedirect("/01_Servlet/Prac02B?name=" + URLEncoder.encode(name) + "&age=" + age);
		
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

Servlet2

@WebServlet("/Prac02B")
public class Prac02B extends HttpServlet {
   
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		// 요청
		request.setCharacterEncoding("UTF-8");
		
		String name = request.getParameter("name");
		String age = request.getParameter("age");
		
		// 응답
		response.setContentType("text/html; charset=UTF-8");
		
		PrintWriter out = response.getWriter();
		out.println("<h1>이름 : " + name + " 나이 : " + age + "살</h1>"); 
		
	}


	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		doGet(request, response);
	}

}

결과


를 누르면

Redirect 연습 2

편지를 받아서 파일로 만들어내면서 출력하기

Servlet1에서 편지를 받고, Servlet2에서는 파일을 생성했다는 alert창을 띄우자.

HTML

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	
	<!-- 
		편지 쓰기
		1. 파일명 : YYYY-MM-DD-작성자.txt
		2. 파일내용
			To. 찰리푸스
			사랑해요 찰리푸스
			아이러브유 찰리푸스
			From. 오리
		Prac03A : 파일생성
		PRac03B : 경고창(YYYY-MM-DD-작성자.txt 파일이 생성되었습니다.)
	 -->
	<form method="POST" action="/01_Servlet/Prac03A">
		<div>
			<input type="text" name="from" placeholder="보내는사람">
		</div>
		<div>
			<input type="text" name="to" placeholder="받는사람">
		</div>
		<div>
			<textarea rows="5" cols="40" name="content"></textarea>
		</div>
		<div>
			<button>편지쓰기</button>
		</div>
	</form>
</body>
</html>

Servlet1

@WebServlet("/Prac03A")
public class Prac03A extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 요청
				request.setCharacterEncoding("UTF-8");
				
				String from = request.getParameter("from");
				String to = request.getParameter("to");
				String content = request.getParameter("content");
				
				// 파일명 (날짜-작성자.txt)
				String filename = new Date(System.currentTimeMillis()) + "-" + from + ".txt";
				
				// 디렉터리생성 servletContext(이 프로그램의). realPath(진짜경로)
				// C:\GDJ\jspstudy\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\01_Servlet\storage\2022-10-07-히랭쓰.txt
				File dir = new File(request.getServletContext().getRealPath("storage"), filename);
				if(dir.exists() == false) {
					dir.mkdirs();
				}
				
				// 파일 객체
				File file = new File(dir, filename);
				
				// Writer 객체
				BufferedWriter bw = new BufferedWriter(new FileWriter(file));
				
				bw.write("To." + to + "\n");
				bw.write(content + "\n");
				bw.write("From. " + from);
				bw.close();
				
				// 이동(Redirect, Forward 둘다 상관없으나 신규생성하는걸 전달하므로 Redirect로 해보겠따)
				response.sendRedirect("/01_Servlet/Prac03B?filename=" + URLEncoder.encode(filename));
	}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

Servlet2

@WebServlet("/Prac03B")
public class Prac03B extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
   
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		// 요청
		request.setCharacterEncoding("UTF-8");
		String filename = request.getParameter("filename");
		
		// 응답
		response.setContentType("text/html; charset=UTF-8");
		
		PrintWriter out = response.getWriter();
		out.println("<script>");
		out.println("alert('" + filename + " 파일이 생성되었습니다.')");
		out.println("history.back()");  // 실행 후에 원래창으로 돌아오라는 뜻
		out.println("</script>");
		out.close();
		
				
		
	}
	// 생성된 파일은 서버가

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

결과

를 작성하면


라고 메세지가 뜨고,


이렇게 파일이 생성됐다.

profile
자몽 허니 블랙티와 아메리카노 사이 그 어딘가

0개의 댓글