서블릿 간의 이동
서버로 요청이 들어오면 , 서블릿을 확인한후 , 조건에 따라 다른 서블릿으로 이동할 수 있다.
서블릿을 확인한 후 조건에 따라 html 또는 JSP로 이동할 수 있다.
또는 복잡하게, 서블릿의 서블릿을 거쳐 html 또는 JSP 로 이동할 수있다.
servlet -> servlet
servlet <-> jsp , html
jsp -> jsp
서블릿에서 서블릿으로 넘어갈 때 , 2가지 방법이 있는데 ,
다이렉트로 넘어가는 방법이 있고 (forward 방식)
서블릿에서 웹브라우저에 다시 요청을 보내서 또다른 서블릿으로 넘어가는 방법이 있다(재요청처리 : redirect 방식)
forward 방식
- 웹브라우져의 주소창이 안바뀜
현재의 요청에 대해 서버내에서 page만 이동함.
A 요청 → B출력 ⇒ 주소창이 변화 없음.
redirect 방식
- 웹브라우져의 주소창이 바뀜
현재의 요청에 대해 응답 -> 재요청 -> 처리
A요청 → A출력 → B재요청 → B출력 ⇒ 주소창이 달라질 수 밖에 없음
forward 방식
servlet -> servlet 으로의 forward 방식
요청명과 다른페이지가 화면에 출력되는 것을 확인해보자.
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1 . Forward 방식
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
out.print("<html><body>");
out.print("<h2 style='color:blue;'>** Forward Test **</h2>");
out.print("</body></html>");
//=> 콘솔로 확인
System.out.println("** Forward&Redirect Test : Forward**");
//서블릿 -> 서블릿.
String url = "hello";
//RequestDispatcher dis = request.getRequestDispatcher(url);
//dis.forward(request, response);
request.getRequestDispatcher(url).forward(request, response);
}//doGet
RequestDispatcher 클래스
클라이언트로부터 최초에 들어온 요청을 JSP/Servlet 내에서 원하는 자원으로 요청을 넘기는(보내는) 역할을 수행하거나,
특정 자원에 처리를 요청하고 처리 결과를 얻어오는 기능을 수행하는 클래스
forward()
대상 자원으로 요청을 넘기는 메서드.
RequestDispatcher dis = request.getRequestDispatcher(url);
dis.forward(request, response);
이런식으로 forward 하거나 ,
request.getRequestDispatcher(url).forward(request, response);
이런식으로 forward.
- forward() 사용시 주의할 점
forward()는 제어를 넘기기 이전에 출력 버퍼를 비우기 때문에 a.jsp -> b.jsp로 호출시
a.jsp에서 어떤 내용을 버퍼에 출력했더라도 무시되며 제어가 넘어간 b.jsp의 출력 내용만
브라우저에게 전달되므로 주의하도록 한다.
출력 결과
/flow 라는 요청을 보냈으나 , url 을 통해 hello 에 해당하는 서블릿 요청으로 넘겼다.
* hello Servlet
@WebServlet("/hello")
public class Ex01_helloServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
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("<h2 style='color:blue;'>** Hello Servlet **</h2>");
out.print("<h3> => ContextPath : "+request.getContextPath()+"</h3>");
out.print("<h3> => 여기는 doGet 메서드 입니다.</h3>");
out.print("</body></html>");
}
...
servlet -> jsp 으로의 forward 방식
/flow 라는 요청을 보냈으나 , url 을 통해 servletTestForm/form04_Select.jsp에 해당하는 jsp 요청으로 넘겼다.
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1 . Forward 방식
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
out.print("<html><body>");
out.print("<h2 style='color:blue;'>** Forward Test **</h2>");
out.print("</body></html>");
//=> 콘솔로 확인
System.out.println("** Forward&Redirect Test : Forward**");
//서블릿 -> jsp.
String url = "servletTestForm/form04_Select.jsp";
//RequestDispatcher dis = request.getRequestDispatcher(url);
//dis.forward(request, response);
request.getRequestDispatcher(url).forward(request, response);
}//doGet
jsp 를 출력하기 위해서는 , webapp 하위의 경로로 명시해주면 된다.
출력 결과
Redirect 방식
servlet -> servlet 으로의 redirect 방식
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//2 . redirect 방식
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
out.print("<html><body>");
out.print("<h2 style='color:blue;'>** Forward Test **</h2>");
out.print("</body></html>");
//=> 콘솔로 확인
System.out.println("** Forward&Redirect Test : redirect **");
//서블릿 -> 서블릿.
String url = "hello";
response.sendRedirect(url);
}//doGet
결과
주소가 바뀐것을 확인할 수 있다.
servlet -> jsp 으로의 redirect 방식
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//2 . redirect 방식
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
out.print("<html><body>");
out.print("<h2 style='color:blue;'>** Forward Test **</h2>");
out.print("</body></html>");
//=> 콘솔로 확인
System.out.println("** Forward&Redirect Test : redirect **");
//서블릿 -> jsp.
String url = "servletTestForm/form04_Select.jsp";
response.sendRedirect(url);
}//doGet
결과
redirect 의 요청 방식
새로운 URL로 다시 요청을 보내기 때문에 두 번의 요청-응답 사이클이 발생한다.
새로운 URL로 이동하기 때문에, 브라우저의 주소 창에 새로운 URL이 표시된다.
한번 더 살펴보는
리디렉트 방식과 포워드 방식의 차이점
서블릿에서 sendRedirect는 클라이언트 측 리디렉션인 반면,
RequestDispatcher의 forward 메서드는 서버 측에서 직접 다른 자원으로 요청을 넘기는 방식이다.
이 두 가지는 목적과 용도가 다르기 때문에 상황에 맞게 사용해야한다.
- sendRedirect: 클라이언트 측에서 완전히 새로운 요청을 보내야 하는 경우.
- forward: 같은 요청/응답 내에서 다른 자원으로 이동해야 하는 경우.
'Developer > Spring eGov4.0 (Java11, Tomcat9)' 카테고리의 다른 글
Spring URI 빌더 활용하기 : 동적 URL 생성 (0) | 2024.11.04 |
---|---|
Servlet Scope와 세션 관리 이해하기: 객체 생성부터 소멸까지 (0) | 2024.11.04 |
Servlet 알아보기 3 (lifecycle) (0) | 2024.11.01 |
Servlet 알아보기 2 (메서드 사용) (0) | 2024.11.01 |
Servlet 알아보기 1 (servlet개념 , mapping Name) (0) | 2024.10.31 |