티스토리 뷰
포워드
- 하나의 서블릿에서 다른 서블릿이나 JSP와 연동하는 방법을 포워드(forward)라고 한다.
- 포워드 기능이 사용되는 용도는 여러 가지이며 요약하면 다음과 같다.
- 요청에 대한 추가 작업을 다른 서블릿에게 수행하게 함
- 요청에 포함된 정보를 다른 서블릿이나 JSP와 공유할 수 있음
- 요청에 정보를 포함시켜 다른 서블릿에 전달할 수 있음
- 모델2 개발 시 서블릿에서 JSP로 데이터를 전달하는 데 사용
- 한마디로 포워드 기능은 서블릿에서 다른 서블릿이나 JSP로 요청을 전달하는 역할을 하며, 이 요청을 전달할 때 추가 데이터를 포함시켜 전달할 수도 있다.
- 모델2 개발방식으로 웹 애플리케이션을 개발할 경우 서블릿에서 JSP로데이터를 전달할 때 주로 사용된다.
여러 가지 포워드 방법
- 서블릿에서 사용되는 포워드 방법에는 네 가지가 있다.
1. redirect 방법
- HttpServletResponse 객체의 sendRedirect() 메서드를 이용.
- 웹 브라우저에 재요청하는 방식
- 형식 : sendRedirect("포워드할 서블릿 또는 JSP");
2. Refresh 방법
- HttpServletResponse 객체의 addHeader() 메서드를 이용
- 웹 브라우저에 재요청하는 방식
- 형식 : response.addHeader("Refresh", 경과시간(초); url=요청할 서블릿 또는 JSP");
3. location 방법
- 자바스크립트 location 객체의 href 속성을 이용
- 자바스크립트에서 재요청하는 방식
- 형식 : location.href='요청할 서블릿 또는 JSP';
4. dispatch 방법
- 일반적으로 포워딩 기능을 지칭
- 서블릿이 직접 요청하는 방법
- RequestDispatcher 클래스의 forward() 메서드를 이용
- 형식 : RequestDispatcher dis = request.getRequestDsipatcher("포워드할 서블릿 또는 JSP");
dis.forward(request, response);
- redirect, refresh, location 방법은 서블릿이 웹 브라우저를 거쳐 다른 서블릿이나 JSP에게 요청하는 방법이다.
- dispatch 방법은 서블릿에서 클라이언트를 거치지 않고 바로 다른 서블릿에게 요청하는 방법이다.
redirect 포워딩
- redirect 방법은 서블릿의 요청이 클라이어트의 웹 브라우저를 다시 거쳐 요청되는 방식이다.
- 클라이언트의 웹 브라우저에서 첫 번째 서블릿에 요청한다.
- 첫 번째 서블릿은 sendRedirect() 메서드를 이용해 두 번째 서블릿을 웹 브라우저를 통해서 요청한다.
- 웹 브라우저는 sendRedirect() 메서드가 지정한 두 번째 서블릿을 다시 요청한다.
* FirstServlet.java
package servlet;
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 FirstServlet
*/
@WebServlet("/first")
public class FirstServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
// sendRedirect() 메서드를 이용해 웹 브라우저에게 다른 서블릿인 second로 재요청한다.
response.sendRedirect("second");
}
}
* SecondServlet.java
package servlet;
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 FirstServlet
*/
@WebServlet("/second")
public class SecondServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
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("sendRedirect를 이용한 redirect 페이지");
out.print("</body></html>");
}
}
- 코드 작성 후 브라우저 주소 입력란에 localhost:[port]/[project_name]/first 를 입력해 본다.
- 위 /first로 요청 시 /second로 리다이렉트될 것이다.
refresh 포워딩
- refresh를 이용한 포워딩 역시 redirect처럼 웹 브라우저를 거쳐서 요청을 수행한다.
- 클라이언트의 웹 브라우저에서 첫 번째 서블릿에 요청한다.
- 첫 번째 서블릿은 addHeader() 메서드를 이용해 두 번째 서블릿을 웹 브라우저를 통해서 요청한다.
- 웹 브라우저는 addHeader() 메서드가 지정한 두 번째 서블릿을 다시 요청한다.
* FirstServlet.java
package servlet;
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 FirstServlet
*/
@WebServlet("/first")
public class FirstServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
// 웹 브라우저에 1초 후 서블릿 second로 재요청한다.
response.addHeader("Refresh", "1;url=second");
}
}
* SecondServlet.java
package servlet;
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 FirstServlet
*/
@WebServlet("/second")
public class SecondServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
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("refresh를 이용한 redirect 페이지");
out.print("</body></html>");
}
}
- 코드 작성 후 브라우저 주소 입력란에 localhost:[port]/[project_name]/first 를 입력해 본다.
- 위 /first로 요청 시 /second로 리다이렉트될 것이다.
location 포워딩
- 자바스크립트의 location 객체를 이용한다.
* FirstServlet.java
package servlet;
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 FirstServlet
*/
@WebServlet("/first")
public class FirstServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.print("<script type='text/javascript'>");
out.print("location.href='second';");
out.print("</script>");
}
}
* SecondServlet.java
package servlet;
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 FirstServlet
*/
@WebServlet("/second")
public class SecondServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
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("location 객체를 이용한 redirect 페이지");
out.print("</body></html>");
}
}
- 코드 작성 후 브라우저 주소 입력란에 localhost:[port]/[project_name]/first 를 입력해 본다.
- 위 /first로 요청 시 /second로 리다이렉트될 것이다.
redirect 방식으로 다른 서블릿에 데이터 전달
- redirect 방식을 이용하면 웹브라우저를 통해 다른 서블릿을 호출하면서 원하는 데이터를 전달할 수 있다.
- 다음은 redirect 방법으로 최초 요청한 서블릿에서 GET 방식으로 다른 서블릿에 데이터를 전달한다.
* FirstServlet.java
package servlet;
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 FirstServlet
*/
@WebServlet("/first")
public class FirstServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
// GET 방식을 이용해 키/값 쌍으로 데이터를 전달한다.
response.sendRedirect("second?name=yoo");
}
}
* SecondServlet.java
package servlet;
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 FirstServlet
*/
@WebServlet("/second")
public class SecondServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
String name = request.getParameter("name");
out.print("<html><body>");
out.print("redirect 데이터 수신<br>");
out.print("이름 : " + name);
out.print("</body></html>");
}
}
- 코드 작성 후 브라우저 주소 입력란에 localhost:[port]/[project_name]/first 를 입력해 본다.
- 위 /first로 요청 시 /second로 리다이렉트될 것이다.
dispatch 포워딩
- distpatch를 이용한 포워딩 과정이 redirect 방법과 다른 점은 클라이언트의 웹 브라우저를 거치지 않고 바로 서버에서
포워딩이 진행된다는 점이다.
- 따라서 웹 브라우저 주소창의 URL이 변경되지 않으며, 클라이언트 측에서는 포워드가 진행되었는지 알 수 없다.
* FirstServlet.java
package servlet;
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 FirstServlet
*/
@WebServlet("/first")
public class FirstServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
RequestDispatcher dispatch = request.getRequestDispatcher("second");
dispatch.forward(request, response);
}
}
* SecondServlet.java
package servlet;
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 FirstServlet
*/
@WebServlet("/second")
public class SecondServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
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("dispatch를 이용해 forward된 페이지");
out.print("</body></html>");
}
}
- 코드 작성 후 브라우저 주소 입력란에 localhost:[port]/[project_name]/first 를 입력해 본다.
'Servlet' 카테고리의 다른 글
서블릿 컨텍스트(ServletContext) (0) | 2024.08.12 |
---|---|
서블릿 - 바인딩 (1) | 2024.08.12 |
서블릿 - 비즈니스 로직(회원 정보 삭제) (0) | 2024.08.11 |
서블릿 - 비즈니스 로직(회원 정보 등록) (0) | 2024.08.11 |
DataSource를 이용한 DB 연동 (0) | 2024.08.11 |
- Total
- Today
- Yesterday
- 제이쿼리
- el
- 서브넷팅
- 네트워크
- javaserverpage
- 내장객체
- HTML
- Network
- Spring MVC
- 리액트
- react
- 미들웨어
- FMT
- CSS
- JSP
- Redux
- nodejs
- Binding
- Session
- Spring
- script element
- Servlet
- 서블릿
- CSS 속성
- html css
- httpServletRequest
- 세션
- 스프링
- a 태그
- Java Server Page
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |