Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

coyojo10의 개발블로그!

JSP - forward, include 정리 본문

백엔드

JSP - forward, include 정리

coyojo 2022. 12. 10. 00:31

 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/>");

이 부분이 브라우저에 출력되는 것을 확인할 수 있다.

include 방식의 실행 결과는 forward 방식의 실행 결과와 차이가 있다,

 

 

 

 

 

'백엔드' 카테고리의 다른 글

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