목차
요청 재지정
클라이언트로부터의 요청에 대해 서버에 존재하는 다른 자원으로 요청을 위임하는 것을 요청 재지정이라고 합니다. 요청 재지정을 하는 방법은 다음의 세 가지가 있습니다.
메소드 제공 객체 | 메소드 | 기능 |
HttpServletResponse | sendRedirect(String location) | location에 설정된 자원으로 요청을 재지정한다. |
RequestDispatcher | forward(ServletRequest request, ServletResponse response) | RequestDispatcher 객체 생성시 path로 설정한 자원으로 요청을 재지정한다. |
include(ServletRequest request, ServletResponse response) | RequestDispatcher 객체 생성시 path로 설정한 자원으로 요청을 재지정하고, 처리된 결과를 현재 페이지에 포함한다. |
HttpServletResponse
sendRedirect(String location)
- HttpServletResponse 객체에서 제공하는 sendRedirect 메소드는 다른 웹 애플리케이션이나 다른 웹 서버의 자원으로 요청을 재지정할 수 있습니다.
- sendRedirect 메소드로 요청을 재지정하면, 컨테이너는 요청을 클라이언트나 브라우저로 전송하므로 메소드의 인자로 전달한 주소값이 클라이언트에게 새 요청으로서 보이게 됩니다. 따라서 리다이렉트된 주소로 표시됩니다.
- 리다이렉트된 자원으로 새로운 요청이 가는 것이기 때문에, 이전 요청과 응답 객체는 유지되지 않습니다. 따라서 데이터를 유지하고 싶으면 session에 데이터를 저장하거나 URL과 함께 데이터를 전달해야 합니다.
@WebServlet("/TestRedirect")
public class TestRedirect extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("request", "홍길동");
HttpSession session = request.getSession();
session.setAttribute("session", "이순신");
ServletContext ctx = getServletContext();
ctx.setAttribute("application", "유관순");
response.sendRedirect("TestRedirect2");
}
}
@WebServlet("/TestRedirect2")
public class TestRedirect2 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String v1 = (String) request.getAttribute("request");
HttpSession session = request.getSession();
String v2 = (String) session.getAttribute("session");
ServletContext ctx = getServletContext();
String v3 = (String) ctx.getAttribute("application");
response.setContentType("text/html; charset=utf-8");
PrintWriter out = response.getWriter();
out.print("<html>");
out.print("<body>");
out.print("<h1>TestRedirect2</h1>");
out.print(v1+"\t"+v2+"\t"+v3);
out.print("</body>");
out.print("</html>");
}
}
RequestDispatcher
forward(ServletRequest request, ServletResponse response)
- RequestDispatcher에서 제공하는 forward 메소드는 동일한 웹 서버, 동일한 웹 애플리케이션에 있는 자원으로만 요청을 재지정할 수 있습니다.
- forward 메소드로 요청을 재지정하면, 컨테이너가 모든 과정을 내부적으로 처리하기 때문에 클라이언트나 브라우저는 관여하지 않습니다. 따라서 포워드된 주소도 시각적으로 볼 수 없습니다.
- forward 메소드를 호출하며 요청 및 응답 객체를 전달하므로 새 자원에서 동일한 요청 객체를 사용할 수 있습니다. 즉, 이전 요청과 응답 객체를 유지할 수 있습니다.
- 요청 및 응답 객체를 다른 자원에 전달하고 수행 제어를 완전히 넘겨서 다른 자원의 수행 결과를 클라이언트로 응답하도록 합니다.
@WebServlet("/TestForward")
public class TestForward extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("request", "홍길동");
HttpSession session = request.getSession();
session.setAttribute("session", "이순신");
ServletContext ctx = getServletContext();
ctx.setAttribute("application", "유관순");
//request 객체 이용, RequestDispatcher 객체 생성하며 요청 위임할 path 설정
RequestDispatcher dis = request.getRequestDispatcher("TestForward2");
dis.forward(request, response);
}
}
@WebServlet("/TestForward2")
public class TestForward2 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String v1 = (String) request.getAttribute("request");
HttpSession session = request.getSession();
String v2 = (String) session.getAttribute("session");
ServletContext ctx = getServletContext();
String v3 = (String) ctx.getAttribute("application");
response.setContentType("text/html; charset=utf-8");
PrintWriter out = response.getWriter();
out.print("<html>");
out.print("<body>");
out.print("<h1>TestForward2</h1>");
out.print(v1+"\t"+v2+"\t"+v3);
out.print("</body>");
out.print("</html>");
}
}
include(ServletRequest request, ServletResponse response)
- RequestDispatcher에서 제공하는 include 메소드는 클라이언트의 요청으로 생성되는 요청 및 응답 객체를 다른 자원에 전달하고 수행한 다음, 그 결과를 클라이언트가 요청한 자원 내에 포함하여 클라이언트로 응답하는 기능의 메소드입니다.
- forward 메소드는 이동한 다음 클라이언트에 응답하는 반면, include 메소드는 실행이 끝나면 이전 페이지로 다시 돌아와 계속해서 실행된 후 클라이언트에 응답합니다. 즉, include 메소드는 다른 페이지를 현재 페이지에 포함하는 효과를 얻습니다.
@WebServlet("/TestInclude")
public class TestInclude extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("request", "홍길동");
HttpSession session = request.getSession();
session.setAttribute("session", "이순신");
ServletContext ctx = getServletContext();
ctx.setAttribute("application", "유관순");
response.setContentType("text/html; charset=utf-8");
PrintWriter out = response.getWriter();
out.print("<html>");
out.print("<body>");
out.print("<h1>TestInclude 상단</h1>");
RequestDispatcher dis = request.getRequestDispatcher("TestInclude2");
dis.include(request, response);
out.print("<h1>TestInclude 하단</h1>");
out.print("</body>");
out.print("</html>");
}
}
@WebServlet("/TestInclude2")
public class TestInclude2 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String v1 = (String) request.getAttribute("request");
HttpSession session = request.getSession();
String v2 = (String) session.getAttribute("session");
ServletContext ctx = getServletContext();
String v3 = (String) ctx.getAttribute("application");
response.setContentType("text/html; charset=utf-8");
PrintWriter out = response.getWriter();
out.print("<html>");
out.print("<body>");
out.print("<h1>TestInclude2</h1>");
out.print(v1+"\t"+v2+"\t"+v3);
out.print("</body>");
out.print("</html>");
}
}
참고
처음 해보는 Servlet&JSP 웹 프로그래밍 (오정임 지음, 루비페이퍼)
'WEB > Servlet, JSP' 카테고리의 다른 글
[JSP] JSP 기본 문법 - JSP 스크립팅 요소, 내장 객체 (0) | 2022.07.16 |
---|---|
[Servlet] 필터 (Filter) (0) | 2022.07.10 |
[Servlet] 상태 정보 유지 기술 (0) | 2022.07.10 |
[Servlet] 서블릿 파라미터 init-param, context-param 태그 (0) | 2022.07.10 |
[Servlet] 서블릿 기본 개념과 요청/응답 처리 (0) | 2022.07.09 |
댓글