서블릿에서 특정 사이트로 포워딩 하는 방식이 두 가지가 있다.
서블릿은 요청을 다른 곳으로 위임하는건데, 언뜻 들으면 무슨 말인지 이해가 안된다.
그럼 이걸 그림으로 보자.
처음 클라이언트가 개인정보를 입력하고 서버에 가입을 요청한다. 그러나, 서버는 이것을 요청할 때 직접 데이터베이스에 접근하지 않고, 스스로를 한번 더 요청, 응답의 형태를 가진다. 그렇게 응답을 받으면 받은 세션을 가지고 데이터베이스로 전달되고, 그 전달된 데이터베이스를 바탕으로 최종적으로 가져와야할 응답을 클라이언트에게 보내주게 된다.
결국 클라이언트는 회원가입 버튼 한번의 요청 / 완료 창 응답 하나만을 받게 되지만, 이 응답은 실질상으로 서버가 요층과 응답 두 번을 진행하면서 받은 응답이 되는 것이다. 이렇게 되면 서버가, 클라이언트가 한 요청을 DB로 보낸 것이 되므로 이런 것을 포워딩이라고 한다.
회원정보 수정도 비슷한 형태로 일어난다.
다음과 같이 클라이언트가 정보 수정을 요구하면 서버는 단지 응답 받을 때 유저를 확인만 할 뿐, 수정의 책임은 DB가 지게 된다. 이렇게 수정도 DB가 지게 된다.
따라서, 포워딩은 내가 가지고 있는 요청 세션을 그대로 가지고 이동해야한다.
jsp에서는 이렇게 세션을 가지고 이동할때 Requestdispatcher 이라는 방식을 이용한다.
-Requestdispatcher 방식
-DispatcherServlet.java
package com.cos.ch03;
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 DispatcherServlet
*/
@WebServlet("/dispatcher")
public class DispatcherServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public DispatcherServlet() {
super();
// TODO Auto-generated constructor stub
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
RequestDispatcher dispatcher=request.getRequestDispatcher("dispatcher.jsp");
request.setAttribute("request", "responseValue");
dispatcher.forward(request, response);
}
}
-dispatcher.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
request 속성 값 : <%=request.getAttribute("request") %>
</body>
</html>
서블릿에서 jsp를 요청해서 이동할 때, request.setAttribute("request", "responseValue");에서 요청 세션을 유지한 채 이동하게 되고, 이동된 세션을 jsp가 채워넣은 결과물이다.
그럼, 세션을 유지하지 않는 Redirect 방식을 보고, 결과를 비교해보자.
-Redirect 방식
-RedirectServlet.java
package com.cos.ch03;
import java.io.IOException;
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 RedirectServlet
*/
@WebServlet("/RedirectServlet")
public class RedirectServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public RedirectServlet() {
super();
// TODO Auto-generated constructor stub
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("request", "requestValue");
response.sendRedirect("redirect.jsp");
}
}
-redirect.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
request 속성 값 : <%=request.getAttribute("request") %>
</body>
</html>
다음과 같이 결과값이 세션에 유지되지 않은 채 빈 값을 띄우게 된다.
'JSP' 카테고리의 다른 글
Servlet 과 JSP를 이용한(모델2 형식) 블로그 만들기(1) - 기본 세팅하기 (0) | 2020.05.28 |
---|---|
1. JSP지시어 (0) | 2020.05.27 |
서블릿 기초, 한글 인코딩 하기 (0) | 2020.05.26 |
JSP의 기초 (0) | 2020.05.25 |
웹페이지 서버 요청 방식과 웹 기초 (0) | 2020.05.25 |