Forwarding 하는 방식으로는 두 가지가 있으며,
이 두 클래스를 이용하여 jsp에서 요청받은것을 다른 컴포넌트로 요청을 위임 할 때 많이 사용.
RequestDispatcher 클래스의 경우 요청 받은 요청객체(request)를 위임하는 컴포넌트에 동일하게 전달 할 수 있다.
웹브라우저에서 사용자가 전달한 정보를 request.getParameter()로 받을 수 있었는데 이것을 다른 컴포넌트로 전달하면 그 컴포넌트에서 똑같이 속성을 받을 수 있다. 예제로 보자.
예제)
dispatcher.jsp)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%> <!DOCTYPE html> <html> <head> <meta charset="EUC-KR"> <title>Insert title here</title> </head> <body> <h1>RequestDispatcher Test Page</h1> <hr> id : <%= request.getAttribute("id") %><br> pw : <%= request.getAttribute("pw") %> <hr> <span>뿐만 아니라 반대로 jsp page 내에서도 Dispacher로 보낼 수 있다.</span> </body> </html> | cs |
DispatcherTest.java ) 서블릿
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | package com.jsplec.ex; 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; /** * Servlet implementation class DispatcherTest */ @WebServlet("/DispatcherTest") public class DispatcherTest extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public DispatcherTest() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub System.out.println("doGet"); actionDo(request, response); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub System.out.println("doPost"); actionDo(request, response); } private void actionDo(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub System.out.println("actionDo"); request.setAttribute("id", "admin"); request.setAttribute("pw", "1234"); RequestDispatcher dispatcher = request.getRequestDispatcher("/dispatcher.jsp"); dispatcher.forward(request, response); } } | cs |
RequestDispatcher 클래스와 동일하게 요청을 위임하는 클래스 이다.
RequestDispatcher 클래스와 차이점은 요청 받은 요청객체를 위임 받은 컴포넌트에 전달 하는 것이 아닌, 새로운 요청객체를 생성 한다.
이 두 request 객체가 다른 이유를 예제로 살펴보자.
ex )
redirect.jsp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%> <!DOCTYPE html> <html> <head> <meta charset="EUC-KR"> <title>Insert title here</title> </head> <body> <% request.setAttribute("id", "admin"); request.setAttribute("pw", "1234"); response.sendRedirect("HttpResponseTest"); %> </body> </html> | cs |
HttpResponseTest.java
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | package com.jsplec.ex; 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; /** * Servlet implementation class HttpResponseTest */ @WebServlet("/HttpResponseTest") public class HttpResponseTest extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public HttpResponseTest() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub System.out.println("doGet"); doAction(request, response); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub System.out.println("doGet"); doAction(request, response); } private void doAction(HttpServletRequest request, HttpServletResponse response) throws IOException { // TODO Auto-generated method stub System.out.println("doAction"); String id = (String)request.getAttribute("id"); String pw = (String)request.getAttribute("pw"); response.setContentType("text/html; charset=EUC-KR"); PrintWriter writer = response.getWriter(); writer.println("<html><head></head><body>"); writer.println("<h1>HttpResponseTest</h1><hr>"); writer.println("id : " + id + "<br/>"); writer.println("pw : " + pw ); writer.print("</body></html>"); } } | cs |
결과 )
결과처럼 request 객체로 부터 가져온 값이 null 표시된다.
이와 같은 이유는 request객체가 동일 객체가 아니기 때문이다.
브라우저에서 요청이 날라오면 서블릿에서 응답을 하고 다시 응답받은 브라우저는 다시 새로운 request로 요청하기 때문에 이 두 request는 다른 객체이다. 즉, 속성을 참조하여 사용할 수 없습니다. 이것은 중요한 점입니다.
MVC 패턴(Model1, Model2) (5) | 2018.10.29 |
---|---|
FrontController 패턴, Command 패턴 예제 (1) | 2018.10.28 |
url-pattern (디렉토리 패턴, 확장자 패턴) (0) | 2018.10.26 |
JSTL 개요 및 설치, Core 사용법 (0) | 2018.10.26 |
EL(Expression Language) 예제 (0) | 2018.10.25 |
댓글 영역