ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SendRedirect 와 RequestDispatcher
    카테고리 없음 2024. 7. 19. 14:20

    ▤ 목차

       

       

       

       

      클라이언트가 파일을 요청할때

      바로 해당파일을 보여주는 것이 아니라 특정 파일을 거쳐서 보여줘야하는 경우가 있다.

      클라이언트에서 a.jsp를 요청하는 경우, 서버는 a.jsp를 응답하는 것이 아닌 b.jsp를 보내는 것이 필요하다.

       

      현실적으로 클라이언트에서 로그인 버튼을 눌렀을때 원하는 페이지는 로그인 성공과 실패 유무이다.

      하지만 서버단에서 버튼을 누른 경우, 해당 주요 정보가 맞는지 확인하는 과정이 발생한다. 이후 결과에 따라

      로그인 성공, 실패 페이지를 전송한다.

       

      두개의 잘 비교하기 위해서는 URL을 잘 확인하자!!

       

      ✔ SendRedirect

      model1 방식에서 페이지를 요청할때 default 방식이다.

      redirect는 이름 그대로 다시 지시하는것이다.

      데이터가 단순 String과 같은 경우, 사용되는 방식이다.(즉, object 이동이 불가능하다.)

       

       

      get방식으로 해당 페이지를 재요청한다.

       

      ⌨ 방식

      1. client가 a.jsp 파일을 요청한다.
      2. server 가 a.jsp파일로 응답을 하는데, 그 안에 b.jsp요청이 들어가 있다.
      3. 그럼 클라이언트측에서 b.jsp 요청을 하게된다.
      4. 이후 server가 b.jsp를 응답해준다.

       

      https://ococ99.tistory.com/92

       

      • http 요청은 요청 시에 잠시 connection을 맺고 응답시에도 잠시 connection을 맺는다.
      • 이후 request객체는 한개만 생성된다.
      • String 값만 이동이 가능하다.
      • 첫 요청의 request와 redirect된 페이지의 request는 서로 다른 객체이고 redirect를 사용하면 이전 서블릿과의 값을 공유해서 사용할 수 없게 된다.
      • redirect시에 값을 유지하기 위해서는 쿠키와 세션을 이용해야한다.

       

       

      💻 코드로 보기

       

      🔹HTML 작성

       

      <!DOCTYPE html>
      <html>
      <head>
      <meta charset="UTF-8">
      <title>Insert title here</title>
      </head>
      <body>
      <h2>redirect 연습</h2>
      jsp 파일이 jsp파일을 호출하기로 결정!
      <a href="redirect.jsp?met=get">jsp 파일 호출</a>
      </body>
      </html>

       

       

       

      jsp 파일 호출을 누르면 


      🔹JSP 작성 ( redirect.jsp )

      <%@ page language="java" contentType="text/html; charset=UTF-8"
          pageEncoding="UTF-8"%>
      <%
      String data = request.getParameter("met"); //get방식으로 url을 통해 값 전달
      String msg = "delivery method : " + data;
      
      //redirect 방식
      response.sendRedirect("redirectMethod.jsp?met="+msg);
      %>

       

       

       

      코드에서도 보이다시피, jsp를 사용했지만 출력용 코드는 없다.

      지금 화면은 URL을 확인하기 위해 잠시 response.sendRedirect(); 부분을 주석처리했다.

       

      위에서 우리가 요청한데로 get 방식으로 넘어가는 것을 알 수 있다. 

       

       

      🔹JSP 작성 (redirectMethod.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>
      <h2>redirect 방식</h2>
      <%
      String str = request.getParameter("met");
      out.println("전송된 데이터 출력 : " + str);
      %>
      </body>
      </html>

       

       

       

       

       

      해당 데이터는 정상적으로 넘어왔다. 하지만 중요한 것은 값이 넘어온것보다 어떤 방식으로 데이터가 이동하는지이다.

      해당 흐름은 아래와 같다.

       

      redirect.html   -----[  met : get 전달  ]---->>   redirect.jsp

       

      redirect.html  <<----[  redirectMethod.jsp한테 가서 msg값 전달해줘  ]-----  redirect.jsp

       

      redirect.html  -----[  met:msg 전달  ]---->>  redirectMethod.jsp

       

      redirect.html  <<-----[  "전송된 데이터 출력 : " + str 출력해줘  ]---- redirectMethod.jsp

       

       

       

      👏 중요

      URL을 주목하자! 

       

       

      경로를 확인해보면 재요청한 폴더명이 들어와 있다.

      클라이언트를 통해 재요청을 했기때문이다.

       

       

       

       


       

       

       

      ✔ RequestDispatcher

      forward 방식이다.

      forwarding(포워딩) 한다고 표현한다.

      이 경우, servlet에서 jsp을 바로 불러 서버에게 응답을 하는 방식이다.

      String 외의 객체를 전달하고 싶은 경우, 사용한다.

       

      ⌨ 방식

      1. 클라이언트가 a.jsp를 요청한다
      2. 서버에서 해당 a.jsp를 받아 b.jsp로 전달한다
      3. 클라이언트는 b.jsp를 받는다.

       

      https://ococ99.tistory.com/91

       

       

      • String을 포함한 다른  객체 이동이 가능하다.
      • servlet이든 jsp(servlet의 service()안에 코드라고 생각하자.)는 request와 response를 넣어서 위임한다.
      • forward 방식은 해당 서블릿의 존재를 client가 알 필요가 없어 url 자체가 변경되지 않는다.
      • 서버로 전송한 데이터가 남아있는 상태로 재요청을 하게 되면 요청을 계속 반복하게 되어 DB에 insert하는 행위가 반복되어 DB에 요청이 증가할 수 있다.

       

       


      🔹HTML 작성

       

       

      <!DOCTYPE html>
      <html>
      <head>
      <meta charset="UTF-8">
      <title>requestDispatcher</title>
      </head>
      <body>
      <h2>requestDispatcher 방식(forward 방식)</h2>
      <br>
      
      String 뿐아니라<b> 객체도 이동이 가능</b>하다.
      
      <br><br>
      <a href="dispatcher.jsp?name=tom">jsp 파일 호출</a>
      </body>
      </html>

       

       

       

       

       

       

      🔹JSP 작성 ( dispatcher.jsp )

      <%@page import="java.util.ArrayList"%>
      <%@ page language="java" contentType="text/html; charset=UTF-8"
          pageEncoding="UTF-8"%>
      <%
      String data = request.getParameter("name");
      String msg = "hihi- " +data;
      
      //dispatcher 방식
      request.setAttribute("data", msg);
      
      request.getRequestDispatcher("dispatcherMethod.jsp").forward(request, response);
      
      %>

       

       

       

      여기까지는 Redirect방식과 같다. 다음 jsp 파일을 확인해보자.

       

       

      🔹JSP 작성 ( dispatcherMethod.jsp )

      <%@ page language="java" contentType="text/html; charset=UTF-8"
          pageEncoding="UTF-8"%>
      <%
      String name = (String)request.getAttribute("data");
      %>
      <!DOCTYPE html>
      <html>
      <head>
      <meta charset="UTF-8">
      <title>dispatcherMethod</title>
      </head>
      <body>
      <h2>forward 방식</h2>
      
      전송된 데이터 확인 : <%=name %>입니다.
      
      </body>
      </html>

       

       

       

       

      URL을 확인해보자.

      Redirect 방식때 url과는 다르다.

      dispatcher.jsp 파일에서 바로 dispatcherMethod.jsp로 값을 넘겨 client에서 출력되었다.

      dispatcherMethod파일의 이름이 남는 것이 아닌 dispatcher.jsp 파일이 흔적이 남았다는 것을 알 수 있다.

       

       

       

      👏 차이점

      String이 아닌 컬렉션과 같은 객체도 이동이 가능하다.

      해당 방식을 디스패쳐방식이라고 부르기보단 포워딩한다고 표현한다.

       

       


       

       

       

      ✔ 객체 이동


      🔹HTML 작성

      <!DOCTYPE html>
      <html>
      <head>
      <meta charset="UTF-8">
      <title>requestDispatcher</title>
      </head>
      <body>
      <h2>requestDispatcher 방식(forward 방식)</h2>
      <br>
      String 뿐아니라<b> 객체도 이동이 가능</b>하다. <br><br>
      <a href="dispatcher.jsp?">jsp 파일 호출</a>
      </body>
      </html>

       

       

       

       

       

      🔹JSP 작성 ( dispatcher.jsp )

       

      <%@page import="java.util.ArrayList"%>
      <%@ page language="java" contentType="text/html; charset=UTF-8"
          pageEncoding="UTF-8"%>
      <%
      
      ArrayList<String> list = new ArrayList<String>();
      list.add("bread");
      list.add("coffee");
      list.add("book");
      request.setAttribute("dayday", list);
      
      request.getRequestDispatcher("dispatcherMethod.jsp").forward(request, response);
      
      %>

       

       

       

      객체를 이곳에서 생성했다.

      때문에 받는 파라미터값이 따로 없다.

       

       

      🔹JSP 작성 ( dispatcherMethod.jsp )

       

      <%@page import="java.util.ArrayList"%>
      <%@ page language="java" contentType="text/html; charset=UTF-8"
          pageEncoding="UTF-8"%>
      <%
      String name = (String)request.getAttribute("data");
      %>
      <!DOCTYPE html>
      <html>
      <head>
      <meta charset="UTF-8">
      <title>dispatcherMethod</title>
      </head>
      <body>
      <h2>forward 방식</h2>
      <%
      ArrayList<String> dayList = (ArrayList<String>)request.getAttribute("dayday");
      for(String day : dayList){
      	out.println(day);
      }
      %>
      
      </body>
      </html>

       

       

       

       

      객체가 잘 넘어왔음을 확인했다.

      String 값에 한정되어 값을 전달하거나 단순히 페이지를 이동하는 경우,

      앞서 사용했던 redirect 방식을 사용하면 된다.

       

      하지만 객체가 넘어다니는 경우, jsp에서 jsp로 값을 넘길 수 있도록 포워딩을 해주면 된다.

       

       

       

      👏 액션태그 사용

      액션태그 중에 forward 라는 태그가 있다.

       

       

      getRequestDispatcher().forward();

      대신에 액션태그를 사용해도 동일한 결과를 출력한다.

       

       

       


       

       

       

      😊정리

       

      WEB-INF 폴더의 하위 파일은 클라이언트에서 바로 접근하지 못한다.

      css의 직접적인 참조 혹은 localhost와 같이 브라우저의 직접적인 참조가 불가능하다.

      즉, 다시 말해서 redirect 방식으로는 WEB-INF 폴더에 접근하지 못한다.

      controller를 통해서만 이동을 해야한다.

      위와같이 보안성이 높기때문에 보안을 원하는 프로젝트를 서버에 올리는 경우 해당 폴더에 위치시킬 수 있다.
      레거시 프로젝트인 jsp를 사용하는데 전용 서블릿이 필요하다. 이 서블릿이 프로젝트 내의 jsp를 참조하는 경우 사용한다.

       

    Designed by Tistory.