WebServer/JSP&Servlet

[Servlet] 요청 위임

gangintheremark 2023. 8. 16. 10:50
728x90

클라이언트의 요청을 받은 서블릿에서 다른 컴포넌트(서블릿, JSP, html)로 요청을 위임할 수 있다. 직접 요청 받은 서블릿에서 모든 작업을 처리하지 않고 위임한 컴포넌트에서 특정 작업을 처리하여 모듈화가 가능하다.

위임 방식

  • HttpServletRequest 객체를 이용한 forward 방법
  • HttpServletResponse 객체를 이용한 redirect 방법

포워드 방식 (forward)

맨 처음 요청 받은 서블릿에서 생성된 HttpServletRequest 객체를 재사용하여 위임하는 방법으로 포워드(forward)라고 한다. 하나의 HttpServeltRequest 객체를 사용하기 때문에 request가 확장되어 포워드가 되었을 때 URL 변경이 안된다.

request.getRequestDispatcher("target").forward(request, response);

RequestDispatcher 클래스는 요청 받은 요청객체(request)를 위임하는 컴포넌트에 동일하게 전달하는 역할을 한다.

 

테스트

package com.servlet;

/* 요청처리 서블릿 */
@WebServlet("/main")
public class MainServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

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

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

        // 포워드 (forward) 
        request.getRequestDispatcher("response").forward(request, response);
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        doGet(request, response);
    }
}
package com.servlet;

/* 응답처리 서블릿 */
@WebServlet("/response")
public class ResponseServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        String username = (String) request.getAttribute("username");
        String useraddress = (String) request.getAttribute("useraddress");

        response.setContentType("text/html;charset=utf-8");        
        PrintWriter out = response.getWriter();         
        out.print("<html><body>");         
        out.print("<body>");                  
        out.print("이름 : " + username + "<br>");                           
        out.print("주소 : " + useraddress + "<br>");                           
        out.print("</body></html>");
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}


리다이렉트 방식 (Redirect)

포워드 방식과는 다르게 맨 처음 요청 받은 서블릿에서 생성된 HttpServletRequest객체가 아닌 새로운 HttpServletRequest객체를 생성하여 위임하는 방식으로 리다이렉트(redirect)라고 한다. 서로 다른 HttpServletRequest 객체를 사용하기 때문에 리다이렉트 되었을 때, 응답 컴포넌트로 URL이 변경된다.

response.sendRedirect("target");

 

테스트

package com.servlet;

/* 요청처리 서블릿 */
@WebServlet("/main2")
public class MainServlet2 extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

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

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

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

리다이렉트(redirect)방식은 주로 메인 홈페이지로 이동할 때 주로 사용한다.

728x90