Developer/Spring eGov4.0 (Java11, Tomcat9)

Servlet 알아보기 3 ( 화면 간의 이동 처리 )

단님 2024. 11. 1. 18:02
728x90
서블릿 간의 이동

 

서버로 요청이 들어오면 , 서블릿을 확인한후 , 조건에 따라 다른 서블릿으로 이동할 수 있다.

서블릿을 확인한 후 조건에 따라 html 또는 JSP로 이동할 수 있다.

또는 복잡하게, 서블릿의 서블릿을 거쳐 html 또는 JSP 로 이동할 수있다.

servlet -> servlet
servlet <-> jsp , html
jsp -> jsp

서블릿에서 서블릿으로 넘어갈 때 , 2가지 방법이 있는데 ,

다이렉트로 넘어가는 방법이 있고 (forward 방식)

서블릿에서 웹브라우저에 다시 요청을 보내서 또다른 서블릿으로 넘어가는 방법이 있다(재요청처리 : redirect 방식)

 

forward 방식
  • 웹브라우져의 주소창이 안바뀜

현재의 요청에 대해 서버내에서 page만 이동함.

A 요청 → B출력 ⇒ 주소창이 변화 없음.

 

redirect 방식
  • 웹브라우져의 주소창이 바뀜

현재의 요청에 대해 응답 -> 재요청 -> 처리

A요청 → A출력 → B재요청 → B출력 ⇒ 주소창이 달라질 수 밖에 없음

 


 

forward 방식

 

 

servlet -> servlet 으로의 forward 방식

요청명과 다른페이지가 화면에 출력되는 것을 확인해보자.

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//1 . Forward 방식
		response.setContentType("text/html; charset=UTF-8");
		PrintWriter out = response.getWriter();
		
		out.print("<html><body>");
		out.print("<h2 style='color:blue;'>** Forward Test **</h2>");
		out.print("</body></html>");
		//=> 콘솔로 확인 
		System.out.println("** Forward&Redirect Test  : Forward**");
		
		//서블릿 -> 서블릿.
		String url = "hello";
		
		//RequestDispatcher dis = request.getRequestDispatcher(url);
		//dis.forward(request, response);
		request.getRequestDispatcher(url).forward(request, response);
	}//doGet
RequestDispatcher 클래스

클라이언트로부터 최초에 들어온 요청을 JSP/Servlet 내에서 원하는 자원으로 요청을 넘기는(보내는) 역할을 수행하거나,

특정 자원에 처리를 요청하고 처리 결과를 얻어오는 기능을 수행하는 클래스

forward()

대상 자원으로 요청을 넘기는 메서드.

 

RequestDispatcher dis = request.getRequestDispatcher(url);
dis.forward(request, response);

이런식으로 forward 하거나 , 

request.getRequestDispatcher(url).forward(request, response);

이런식으로 forward.

  • forward() 사용시 주의할 점

forward()는 제어를 넘기기 이전에 출력 버퍼를 비우기 때문에 a.jsp -> b.jsp로 호출시

a.jsp에서 어떤 내용을 버퍼에 출력했더라도 무시되며 제어가 넘어간 b.jsp의 출력 내용만

브라우저에게 전달되므로 주의하도록 한다.

 

출력 결과

/flow 라는 요청을 보냈으나 ,  url 을 통해 hello 에 해당하는 서블릿 요청으로 넘겼다.

* hello Servlet

@WebServlet("/hello")
public class Ex01_helloServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        response.setContentType("text/html; charset=UTF-8");
        
		PrintWriter out = response.getWriter();
        out.print("<html><body>");
        out.print("<h2 style='color:blue;'>** Hello Servlet **</h2>");
        out.print("<h3> => ContextPath : "+request.getContextPath()+"</h3>");
        out.print("<h3> => 여기는 doGet 메서드 입니다.</h3>");
        out.print("</body></html>");
	}
    
    ...

 

 

 

 

 

servlet -> jsp 으로의 forward 방식

/flow 라는 요청을 보냈으나 ,  url 을 통해 servletTestForm/form04_Select.jsp에 해당하는 jsp 요청으로 넘겼다.

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//1 . Forward 방식
		response.setContentType("text/html; charset=UTF-8");
		PrintWriter out = response.getWriter();
		
		out.print("<html><body>");
		out.print("<h2 style='color:blue;'>** Forward Test **</h2>");
		out.print("</body></html>");
		//=> 콘솔로 확인 
		System.out.println("** Forward&Redirect Test  : Forward**");
		
		//서블릿 -> jsp.
		String url = "servletTestForm/form04_Select.jsp";
		
		//RequestDispatcher dis = request.getRequestDispatcher(url);
		//dis.forward(request, response);
		request.getRequestDispatcher(url).forward(request, response);

	}//doGet

jsp 를 출력하기 위해서는 , webapp 하위의 경로로 명시해주면 된다.

 

출력 결과


 

Redirect 방식

 

servlet -> servlet 으로의 redirect 방식

 

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//2 . redirect 방식

		response.setContentType("text/html; charset=UTF-8");
		PrintWriter out = response.getWriter();
		
		out.print("<html><body>");
		out.print("<h2 style='color:blue;'>** Forward Test **</h2>");
		out.print("</body></html>");
		//=> 콘솔로 확인 
		System.out.println("** Forward&Redirect Test  : redirect **");
		
		//서블릿 -> 서블릿.
		String url = "hello";
		
		response.sendRedirect(url);
	}//doGet

 

결과

주소가 바뀐것을 확인할 수 있다.

 

 

 

servlet -> jsp 으로의 redirect 방식
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//2 . redirect 방식

		response.setContentType("text/html; charset=UTF-8");
		PrintWriter out = response.getWriter();
		
		out.print("<html><body>");
		out.print("<h2 style='color:blue;'>** Forward Test **</h2>");
		out.print("</body></html>");
		//=> 콘솔로 확인 
		System.out.println("** Forward&Redirect Test  : redirect **");
		
		//서블릿 -> jsp.
		String url = "servletTestForm/form04_Select.jsp";
		
		response.sendRedirect(url);
	}//doGet

 

결과

 

 

redirect 의 요청 방식

새로운 URL로 다시 요청을 보내기 때문에 두 번의 요청-응답 사이클이 발생한다.

새로운 URL로 이동하기 때문에, 브라우저의 주소 창에 새로운 URL이 표시된다.

 


한번 더 살펴보는
리디렉트 방식과 포워드 방식의 차이점

 

서블릿에서 sendRedirect는 클라이언트 측 리디렉션인 반면,

RequestDispatcher의 forward 메서드는 서버 측에서 직접 다른 자원으로 요청을 넘기는 방식이다.

이 두 가지는 목적과 용도가 다르기 때문에 상황에 맞게 사용해야한다.

  • sendRedirect: 클라이언트 측에서 완전히 새로운 요청을 보내야 하는 경우.
  • forward: 같은 요청/응답 내에서 다른 자원으로 이동해야 하는 경우.