본문으로 바로가기

선행되어야할 개념 : request, session, application 


https://sallykim5087.tistory.com/133

 

리다이렉트 vs forward 차이점

https://doublesprogramming.tistory.com/63

 

리다이렉트(redirect)


  • 클라이언트가 요청한 내용에 대해 서버가 바로 응답하는 것이아니라
    클라이언트에게 다시 요청하라고 서버가 강제 하는 것.

  • 다른 context(project) 경로로도 이동 가능 하며, redirect 이동시에는 절대 경로로 이동하는 것이 일반적이다.
    따라서 context 경로가 반드시 필요하다.

//contextPath 얻어오기
request.getContextPath();
//리다이렉트 메소드 사용하기
response.sendRedirect(cPath+"리다이렉트할 경로");

 

 

[예시]

<테스트 준비>

1. test1/home.jsp 에 test1/game.jsp 페이지로 이동할 수 있도록 링크를 걸어 놓는다.

<body>
<h1>리다이렉트 이동 테스트 home</h1>
<ul>
	<li><a href="game.jsp">게임하러 가기(jsp)</a></li>
	<li><a href="game">게임하러 가기(servlet)</a></li>
</ul>
</body>

2. test1/game.jsp 와 test1/study.jsp 페이지를 만든다

 

3. test.servlet 패키지에 GameServlet.java 서블렛을 만든다.

 

게임하러가기 링크를 눌렀을 때, study.jsp 페이지로 이동되도록 테스트 한다.

 

 

1. jsp 페이지에서 리다이렉트 시켜보기

redirect는 다른 context(project) 경로로도 이루어지므로, 일반적으로 contextpath를 작성해서 '절대 경로'로 이동한다.

 

test1/game.jsp 에 리다이렉트 되도록 코드를 작성한다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	//context 경로 얻어오기
	String cPath=request.getContextPath();
	//강제로 리다이렉트 이동시키기
	//리다이렉트 이동 시킬때는 절대 경로로 이동하는 것이 일반적이다.
	//따라서 context 경로가 반드시 필요하다
	response.sendRedirect(cPath+"/test1/study.jsp");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<p>게임 페이지 입니다.</p>
</body>
</html>

 

리다이렉트되어 최종적으로 클라이언트에게 응답되는 test1/study.jsp 페이지 작성

<body>
	<p>study 페이지 입니다.</p>
</body>

 

 test1/home.jsp 를 run해서 링크를 클릭해보면  test1/study.jsp 페이지로 이동하는 것을 확인할 수 있다.

클라이언트가 test1/home.jsp 에서 '게임하러 가기(jsp)'링크를 클릭하여 서버에 요청을 보내면 처음에는 test1/game.jsp 페이지를 응답한다. 

test1/game.jsp 에는 클라이언트가 test1/study.jsp 페이지를 서버에게 다시 요청하도록 redirect 코드가 작성되어 있기 때문에 클라이언트는 다시 서버로 test1/study.jsp 페이지를 요청한다.

따라서 최종적으로 클라이언트는 test1/study.jsp 페이지를 응답받는다.

 

 

2. servlet 에서 리다이렉트 시켜보기

redirect는 다른 context(project) 경로로도 이루어지므로, 일반적으로 contextpath를 작성해서 '절대 경로'로 이동한다.

 

서블릿 클래스를 만들때 준다.

@WebServlet("/test1/game")
public class GameServlet extends HttpServlet{
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String sPath=req.getContextPath();
		resp.sendRedirect(sPath+"/test1/study.jsp");
	}
}

 

클라이언트가 test1/home.jsp 에서 '게임하러 가기(sevlet)'링크를 클릭하여  servlet으로 요청을 보낸다.

그럼 servlet에서는 test1/study.jsp가 응답하도록 리다이렉트 동작을 한다.

 

 

포워드(forward)


  • 클라이언트에서 요청한 내용에 대한 응답을 jsp 페이지 혹은 다른 서블릿으로 위임 하는 것

  • 주의점! contextpath를 넣지 않는다.

    위임은 같은 context(project)안에서만 가능하다. 

//1. 응답을 위임할 이동경로
String path="응답을 위임할 이동경로";
//2. requestDispatcher 객체의 참조값으로 전달
RequestDispatcher rd=req.getRequestDispatcher(path);
//3. 포워드 이동해서 응답한다. - 서블릿에 전달 되었던 request와 response 객체를 전달해 주어야 한다.
rd.forward(req, resp);

 

 

[예시]

<테스트 준비>

1. test.servlet 패키지에 FortuneServlet 클래스를 만든다.

@WebServlet("/test2/fortune")
public class FortuneServlet extends HttpServlet{
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) 
			throws ServletException, IOException {
		//응답을 jsp 페이지 혹은 다른 서블릿으로 위임 할 수 있다.
		
		//1. 응답을 위임할 이동경로
		String path="/test2/person.jsp";
		//2. requestDispatcher 객체의 참조값
		RequestDispatcher rd=req.getRequestDispatcher(path);
		//3. 포워드 이동해서 응답한다. - 서블릿에 전달 되었던 
        //request와 response 객체를 전달해 주어야 한다.
		rd.forward(req, resp);
	}
}

 

2. test2/home.jsp 와 test2/person.jsp 페이지를 만든다

//test2/home.jsp
<body>
  <ul>
      <li><a href="fortune">오늘의 운세 보기</a></li>
  </ul>
</body>
//test2/person.jsp
<body>
	<h1>오늘의 운세 페이지</h1>
	<p>오늘은 운세 : 동쪽으로 가면 귀인을 만나요</p>
</body>

 

 

test2/home.jsp 에서 run을 해보면 서블릿에서 위임한 경로인 test2/person.jsp 으로 클라이언트에게 응답해준 것을 확인할 수 있다.

웹 브라우저 주소창에 test2/fortune 페이지로 표시되는 이유는 servlet에게 요청을 보냈고, 해당 서블릿에서는 @WebServlet("/test2/fortune") 으로 맵핑을 했기때문이다.