[Servlet/JSP] 포워딩/리다이렉트 (0730)

왕감자·2024년 7월 31일

KB IT's Your Life

목록 보기
109/177

요청 포워딩

웹 개발 모델

[ 모델2 ]

  • 요청 처리 / 응답 처리 / 비지니스 로직 처리 - 모듈화

[ MVC ]

  • Model(VO), View(JSP), Controller(Servlet)

✅ MVC 패턴의 기본 메커니즘
✅ 서블릿-출력X / JSP-로직처리X, 출력만


* RequestDispatcher

🔸 RequestDispatcher 클래스

RequestDispatcher dis = request.getRequestDispatcher(target(jsp경로));
dis.forward(request, response);
⇨ 서블릿에서 사용하던 request, response를 그대로 jsp에 전달

  • Servlet에서 처리한 결과, 정보 : request에 담아서 전달
//RequestServlet
@WebServlet("/request")
public class RequestServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();

        //속성 설정
        request.setAttribute("username", "홍길동");
        request.setAttribute("useraddress", "서울");

        //forward
        RequestDispatcher dis = request.getRequestDispatcher("/response.jsp");
        dis.forward(request, response);
    }
}
<!--response.jsp-->
<body>
username: <%= request.getAttribute("username") %> <br>
useraddress: <%= request.getAttribute("useraddress")  %><br>
</body>


리다이렉트

✅ 응답 코드: 300번대


* HttpServletResponse

🔸 HttpServletResponse 클래스

response.sendRedirect(target(이동할페이지));

  • 첫번째 요청에 대해 응다하고 브라우저가 바로 redirect
  • 새로운 request가 사용됨 ⇨ Request scope가 다름

//RequestRedirectServlet
@WebServlet("/request_redirect")
public class RequestRedirectServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //속성 설정 -> 리다이렉트하면 아무 의미 없어지는 정보~
        request.setAttribute("username", "홍길동");
        request.setAttribute("useraddress", "서울");

        //리다이렉트
        response.sendRedirect("response_redirect");
    }
}
//ResponseRedirectServlet
@WebServlet("/response_redirect")
public class ResponseRedirectServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	//RequestRedirectServlet의 request와 다른 request....!~!~!~!
        String username = (String) request.getAttribute("username"); //null
        String useraddress = (String) request.getAttribute("useraddress"); //null

        //속성 설정
        request.setAttribute("username", username);
        request.setAttribute("useraddress", useraddress);

        //forward
        RequestDispatcher dis = request.getRequestDispatcher("/redirect_response.jsp");
        dis.forward(request, response);   
<!--redirect_response.jsp-->
<body>
username: <%=request.getAttribute("username")%> <br>
useraddress: <%=request.getAttribute("useraddress")%> <br>
</body>

http://localhost:8080/request_redirect


//RequestRedirectServlet
request.setAttribute("username", username);
request.setAttribute("useraddress", useraddress);

  • 이 정보를 최종 jsp에서 출력하려면?
    Session에 저장
//RequestRedirectServlet
@WebServlet("/request_redirect")
public class RequestRedirectServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //★속성을 최종 jsp에서 출력하려면 session에 저장
        HttpSession session = request.getSession();
        session.setAttribute("username", "홍길동");
        session.setAttribute("useraddress", "서울");

        //리다이렉트
        response.sendRedirect("response_redirect");
    }
}

//ResponseRedirectServlet
@WebServlet("/response_redirect")
public class ResponseRedirectServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //forward
        RequestDispatcher dis = request.getRequestDispatcher("/redirect_response.jsp");
        dis.forward(request, response);
    }
}
<body>
<%--★세션에서 가져온 정보--%>
username_ss: <%=session.getAttribute("username")%> <br>
useraddress_ss: <%=session.getAttribute("useraddress")%> <br>
</body>



  • GET 요청: Forward
  • POST 요청: Redirect (∵새로고침)

0개의 댓글