RequestDispatcher 클래스

      서블릿 포워드 기능
      1. 포워드 기능 : 하나의 서블릿에서 다른 서블릿이나 JSP와 연동하는 방법
      2. 포워드 용도 : -요청(request)에 대한 추가 작업을 다른 서블릿에게 수행하게 함.
       -요청(request)에 포함된 정보를 다른 서블릿이나 JSP와 공유함.
       -요청(request)에 정보를 포함시켜 다른 서블릿에 전달할수 있음.
       -모델2 개발시 서블릿에서 JSP로 데이터를 전달하는데 사용됨.

     3.서블릿의 포워드 방법
      1) dispatch 방법
      - 일반적으로 포워딩 기능을 지칭
      - RequestDispatcher클래스의 forward()메서드를 사용.

     

     dispatch를 이용한 포워딩 과정
       : dispatch방식은 클라이언트의 브라우저를 거치지 않고 서버에서 포워딩이 진행
       1) 클라이언트의 웹 브라우저에서 첫번째 서블릿에 요청함.
       2) 첫번째 서블릿(DispatchTest)은 RequestDispatcher를 이용해 두번째 서블릿(HelloServlet)으로 포워딩함.
       ==> 모델2나 스프링 프레임워크에서 포워딩 시 사용. 


    서블릿 포워드 기능 예제

    Chap18_Useful_Patterns

    service가 우선순위가 제일 높다.

     

    DispatchTest,java (Servlet)

    package kr.gov.requestdispatcher;
    
    import java.io.IOException;
    
    import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /*
     * 		* 서블릿 포워드 기능
     * 		1. 포워드 기능 : 하나의 서블릿에서 다른 서블릿이나 JSP와 연동하는 방법
     * 		2. 포워드 용도 : -요청(request)에 대한 추가 작업을 다른 서블릿에게 수행하게 함.
     * 						 -요청(request)에 포함된 정보를 다른 서블릿이나 JSP와 공유함.
     * 						 -요청(request)에 정보를 포함시켜 다른 서블릿에 전달할수 있음.
     * 						 -모델2 개발시 서블릿에서 JSP로 데이터를 전달하는데 사용됨.
     * 		3.서블릿의 포워드 방법
     * 			1)dispatch 방법
     * 						- 일반적으로 포워딩 기능을 지칭
     * 						- RequestDispatcher클래스의 forward()메서드를 사용.
     * 			2)redirect 방법
     * 						- HttpServletResponse 객체의 sendRediect() 메서드를 이용.
     * 						- 웹 브라우저에 재요청하는 방식
     */
    
    @WebServlet("/DispatchTest")
    public class DispatchTest extends HttpServlet {
    	private static final long serialVersionUID = 1L;
           
    
        public DispatchTest() {
        	
        }
    
    
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    	}
    
    
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    	}
    	
    	@Override
    		protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    			request.setCharacterEncoding("UTF-8");
    			
    			request.setAttribute("name", "gumi");	//name이라는 것에 gumi저장
    			request.setAttribute("id", "daegu");	
    			
    			// /hello라고 서블릿맵핑이 되어있는 곳에서도 request, response 객체가 사용됨.
    			RequestDispatcher dispatcher = request.getRequestDispatcher("/hello"); //path
    			dispatcher.forward(request, response);
    			
    		}
    
    }

     

    HelloServlet.java (Servlet)

    package kr.gov.requestdispatcher;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    
    @WebServlet("/hello")
    public class HelloServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    
    	
        public HelloServlet() {
    
        }
        
    	@Override
    	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		request.setCharacterEncoding("UTF-8");
    		response.setContentType("text/html; charset=UTF-8");
    		
    		PrintWriter out = response.getWriter();
    		out.println("<HTML><HEAD></HEAD><BODY>");
    		out.println("<H1>Hello</H1>");
    		out.println("<H1>Hello "+request.getAttribute("name")+" </H>");
    		out.println("<H1>Hello "+request.getAttribute("id")+" </H>");
    		
    		out.println("</BODY></HTML>");
    		out.close();
    	}
    
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	
    	}
    
    
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    	}
    	
    
    }

     

    DispatchTest,java (Servlet) 실행

     


    HttpServletResponse 클래스

    jsp는 servlet의 한번 맵핑한 것 - jsp는 서블릿으로 바뀜

     

    2번째 방법으로 redirect방법이다.

     

    redirect 방법
      - HttpServletResponse 객체의 sendRediect() 메서드를 이용.
      - 웹 브라우저에 재요청하는 방식

     

     redirect를 이용한 포워딩 
    : 서블릿의 요청이 클라이언트의 웹 브라우저를 다시 거쳐 요청되는 방식 
    1) 클라이언트의 웹 브라우저에서 첫번째 서블릿에 요청함. 
    2) 첫번째 서블릿은 sendRedirect() 메서드를 이용해 두번째 서블릿을 웹 브라우저를 통해서 요청 
    3) 웹 브라우저는 sendRedirect() 메서드가 지정한 두번째 서블릿을 다시 요청함.


    HttpServletResponse를 이용한 sendRedirect 예제

    redirectTest.jsp 세션 사용

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="UTF-8">
      <title>HttpServletResponse를 이용한 sendRedirect</title>
    </head>
    <body>
    	<%	/* HttpServletResponse을 통해서 위임을 하고는 있지만 sendRedirect() 방법은
    			새로운 request객체가 생성되므로 이전 요청이 들어온 request객체는 제거되어서 속성값을 참조할수 없음.*/
    		request.setAttribute("id", "gumi");
    		request.setAttribute("pw", "0217");
    		
    		pageContext.getSession().setAttribute("name", "daegu");
    		pageContext.getSession().setAttribute("season", "winter");
    		
    		response.sendRedirect("redirectResult.jsp"); 
    	%>
    </body>
    </html>

     

    redirectResult.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
        
    <!-- 
    	* redirect를 이용한 포워딩
    		: 서블릿의 요청이 클라이언트의 웹 브라우저를 다시 거쳐 요청되는 방식
    		1) 클라이언트의 웹 브라우저에서 첫번째 서블릿에 요청함.
    		2) 첫번째 서블릿은 sendRedirect() 메서드를 이용해 두번째 서블릿을 웹 브라우저를 통해서 요청
    		3) 웹 브라우저는 sendRedirect() 메서드가 지정한 두번째 서블릿을 다시 요청함.
     -->     
    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="UTF-8">
      <title>redirect 포워드 결과</title>
    </head>
    <body>
    	<%
    		String id = (String)request.getAttribute("id");
    		String pw = (String)request.getAttribute("pw");
    		
    		out.println("id : " +id+ "<br/>");
    		out.println("pw : " +pw+ "<br/>");
    		
    		//세션 사용
    		String name = (String)session.getAttribute("name");
    		String season = (String)session.getAttribute("season");
    		
    		out.println("name : " +name+ "<br/>");
    		out.println("season : " +season+ "<br/>");
    	%>
    </body>
    </html>

     

    redirectTest.jsp 실행결과 세션 미사용

    HttpServletResponse을 통해서 위임을 하고는 있지만 sendRedirect() 방법은
    새로운 request객체가 생성되므로 이전 요청이 들어온 request객체는 제거되어서 속성값을 참조할수 없음.

     

    세션으로 저장해서 출력

     

    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기
    loading