coyojo10의 개발블로그!
JSP - forward, include 정리 본문
forward
1) 문법
RequestDispatcher의 forward메소드를 이용
RequestDispatcher rd = request.getRequestDispatcher("요청재지정할 application path");
rd.forward(request객체,response객체)
2) 개요
최초 요청된 서블릿이 실행되고 응답하지 않은 상태에서
새로운 web application을 요청
한 번의 요청으로 모든 application이 실행된다.
package basic;
import java.io.IOException;
import java.io.PrintWriter;
import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import kr.multicampus.erp.user.EmpDTO;
@WebServlet(name = "forward", urlPatterns = {"/forward.do"})
public class ForwardTestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//요청과 응답에 한글을 셋팅
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=UTF-8");
//브라우저에 응답을 출력하기 위해서 객체생성
PrintWriter out = resp.getWriter();
//콘솔에 출력 = > 이것을 출력하면서 "/forward.do" 서블릿 거쳐 갔다는 것을 알수있다.
System.out.println("forward연습 - Forward 서블릿 실행");
// 브라우저에 출력 - 근데 forward는 client뷰 단으로 response를 보내지 않고 result.jsp를 호출하여
//result.jsp에서 client뷰 단으로 response를 보내므로 아래의 out.print("<h1>요청재지정연습 - forward</h1>");는 출력이 안됨!!
out.print("<h1>요청재지정연습 - forward</h1>");
//1. 데이터공유
EmpDTO dto = new EmpDTO("002","RM","bts_rm","1234","서울","");
req.setAttribute("mydata", dto);
//2. 요청재지정
//RequestDispatcher객체 생성 !!!
RequestDispatcher rd =req.getRequestDispatcher("/practice/result.jsp");
rd.forward(req, resp);
// sendRedirect는 request로 서블릿을 실행후 response를 받으면서 다시 처음 request를 보낸 client view 단에서
//다시 result.jsp 뷰를 요청하므로 context명인 "/serverweb 부터 줘야하지만
//RequestDispatcher의 forward 방식은 request에 대해서 서블릿이 바로 client뷰단으로 response하지않고
// 서블릿에서 result.jsp 뷰를 불러주는것이므로 이미 서블릿이 /serverweb까지 인식한 상태이므로 serverweb은 또 쓰지 않는다!!!
// 그러므로 "/serverweb~~부터 경로를 주게되면
//실제 요청된 페이지가 "/serverweb/serverweb/practice/result.jsp"가 되므로 오류가 발생!!! \
}
}
위의 코드 RequestDispatcher rd = req.getRequestDispatcher("/practice/result.jsp"); 를 보면
sendRedirect는 request로 서블릿을 실행후 response를 받으면서
다시 처음 request를 보낸 client view 단에서
다시 result.jsp 뷰를 요청하므로 내가 만든 프로젝트의 context명인 "/serverweb 부터 줘야하지만
forward 방식은 request에 대해서 Servlet이 바로 client view단으로 response하지않고
servlet에서 result.jsp 뷰를 불러주는것이므로
이미 서블릿이 /serverweb까지 인식한 상태이므로 serverweb은 또 쓰지 않는다!!!
그러므로 "/serverweb~~부터 경로를 주게되면
실제 요청된 페이지가 "/serverweb/serverweb/practice/result.jsp"가 되므로 오류가 발생!!!

forward는 client뷰 단으로 부터 request를 받은 servlet이 response를 보내지 않고
result.jsp를 호출하여 result.jsp에서 client뷰 단으로 response를 보내므로
out.print("<h1>요청재지정연습 - forward</h1>");는 출력이 안됨!!
반면에,
include 방식의 servlet을 보면
package basic;
import java.io.IOException;
import java.io.PrintWriter;
import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import kr.multicampus.erp.user.EmpDTO;
@WebServlet(name = "include",urlPatterns = {"/include.do"})
public class IncludeTestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//요청과 응답에 한글 셋팅
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=UTF-8");
// 브라우저에 출력하기 위해 객체 생성
PrintWriter out = resp.getWriter();
//콘솔에 출력 = > "/include.do" 서블릿을 거쳤다는 것을 알기위해
System.out.println("include연습 - include 서블릿 실습");
//브라우저에 출력
out.print("<hr/>");
out.print("<h1>요청재지정연습 - include</h1>");
out.print("<hr/>");
//1. 데이터 공유
EmpDTO dto = new EmpDTO("002","RM","bts_rm","1234","서울","");
req.setAttribute("mydata", dto);
//2. 요청재지정
RequestDispatcher rd = req.getRequestDispatcher("/practice/result.jsp");
rd.include(req, resp);
//include방식은 client view단 -> servlet -> 결과 view에서 다시 서블릿으로 간 후 서블릿이 client view단에 response한다!
}
}
include 방식은 요청재지정할때 루트를 보면
client view단 ---> servlet단 -----> 결과 view단에서 --->다시 서블릿으로 간 후
다시 서블릿이 --> client view단에 response한다!
그러므로 아까의 forward방식과는 다르게
Servlet코드에 적어준 브라우저 출력부분인
//브라우저에 출력
out.print("<hr/>");
out.print("<h1>요청재지정연습 - include</h1>");
out.print("<hr/>");
이 부분이 브라우저에 출력되는 것을 확인할 수 있다.

'백엔드' 카테고리의 다른 글
FileOutputStream - 이미지 경로를 받아와 내 컴퓨터에 저장하기 (0) | 2022.12.17 |
---|---|
JSP - 요청재지정 정리! (0) | 2022.12.10 |
JSP 정리 (0) | 2022.12.06 |
servlet 정리 멤버변수와 지역변수 (0) | 2022.12.03 |
Servlet 정리 2 (0) | 2022.11.30 |