리다이렉트와 포워드에 차이를 명확하게 구분하자
@Controller
public class ProductController {
@Autowired
private HttpSession session;
@GetMapping("/test")
public String test(){
return "test";
}
// 리다이렉트 - request 객체 사용
@GetMapping("/redirect")
public void requestTest(HttpServletRequest request,
HttpServletResponse response) throws IOException{
request.setAttribute("name2", "request metacoding");
response.sendRedirect("/test");
// request객체에 데이터 넣었지만 브라우저가 다시 요청 함
// 새로운 request객체가 test.jsp 로 포워딩 된다. ( null )
}
// 리다이렉트 - session 객체 사용
@GetMapping("/redirect2")
public void sessionTest(HttpServletRequest request,
HttpServletResponse response, HttpSession session) throws IOException{
session.setAttribute("name2", "session metacoding");
response.sendRedirect("/test"); // 세션에 저장해서 데이터 유지
// 세션이 30분동안 유지되기 때문에 (디폴트) 이후 /test쳐도 데이터 나옴
}
// 포워딩 - request 객체 사용
@GetMapping("/dispatcher")
public void forwardTest(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("name2", "forward metacoding");
RequestDispatcher dis = request.getRequestDispatcher("/test");
dis.forward(request, response);
}
}
test.jsp
<body>
<h1>test page ${name2}</h1>
</body>
request.setAttribute("name2", "forward metacoding");
RequestDispatcher dis = request.getRequestDispatcher("/test");
dis.forward(request, response);
request 객체를 @GetMapping("/test")
로 포워딩 + /test
에서 한번 더 포워딩 되므로
덮어쓰고 덮어쓴 request 객체에서 데이터를 꺼내면 위처럼 결과가 나온다
세션은 30분간 유지 ( 디폴트 ) http://localhost:8080/test 결과가 위처럼 나온다.
리다이렉트 포워드 차이 덕분에 잘 알고 갑니다.
그런디... 차이나타운은 어떤 차이가 있어서 차이나타운인가요?