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객체는 제거되어서 속성값을 참조할수 없음.
세션으로 저장해서 출력