Spring | Redirect, flash redirect(RedirectAttributes)

brightbell·2023년 10월 5일

Redirect

컨트롤러의 반환값이 "redirect:" 으로 시작하면 리다이렉트로 이동함
response.sendRedirect() 를 대체하는 스프링의 방식
"redirect:" 뒤에는 새로운 요청 URL 이 오기 때문에 특정 URLMapping 값을 작성해야 함
(뷰이름(.jsp)을 작성하는 것이 아님!!)

forward와 구분하여 db에 접근하거나 api 단계별 호출을 위함

redirect 하는 방법

  1. return "redirect:이동경로";
   public String add(){
     return "redirect:/list.do";
   }
  1. location.href='이동경로';
   public void add(HttpServletResponse response){
     PrintWriter out = response.getWriter();
     out.println("<script>"); 
     out.println("location.href='이동경로'"); 
     out.println("</script>");
   } 

redirect 이동경로

  1. 반드시 URLMapping 값을 작성한다.
  2. 이동할 JSP 경로를 작성할 수 없다.
//  @RequestMapping(value = "/faq/add.do", method = RequestMethod.POST)
  public String add(HttpServletRequest request) {
    
    // 요청 파라미터
    String title = request.getParameter("title");

    // title이 빈 문자열이면 add 실패로 가정(DB 처리할 때 insert 성공은 1, 실패는 0이다.)
    int addResult = title.isEmpty() ? 0 : 1;
    
    // addResult를 가지고 faq 목록보기로 이동
    return "redirect:/faq/list.do?addResult=" + addResult;
  }
  
//  @RequestMapping(value ="/faq/list.do", method = RequestMethod.GET)
  public String list(@RequestParam(value="addResult", required = false) String addResult, Model model) {
    model.addAttribute("addResult", addResult);
    return "faq/list";
  }

flash redirect(RedirectAttributes 인터페이스)

  @RequestMapping(value = "/faq/add.do", method = RequestMethod.POST)
  public String add2(HttpServletRequest request
                   , RedirectAttributes redirectAttributes) {  // redirect 상황에서 값을 전달할 때 사용한다.
    
    // 요청 파라미터
    String title = request.getParameter("title");
    
    // title이 빈 문자열이면 add 실패
    int addResult = title.isEmpty() ? 0 : 1;
    
    // faq 목록보기로 redirect 할 때 addResult를 "flash attribute"로 곧바로 전달하기
    redirectAttributes.addFlashAttribute("addResult", addResult);
    
    // faq 목록보기로 redirect
    return "redirect:/faq/list.do";
  }
  
  @RequestMapping(value ="/faq/list.do", method = RequestMethod.GET)
  public String list2() {
    return "faq/list";
  }

index.jsp

  <%-- MyController05으로 요청 --%>
  <div>
    <form action="${contextPath}/faq/add.do" method="post">
      <div>
        <label for="title">제목</label>
        <input type="text" id="title" name="title">
      </div>
      <div>
        <button type="submit">작성완료</button>
      </div>
    </form>
  </div>

list.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>
<script>
	var addResult = '${addResult}';  // var addResult = '1'; add성공
								     // var addResult = '0'; add실패
								     // var addResult = ''; add와 상관없음
	if(addResult !== ''){
		if(addResult === '1'){
			alert('add 성공했습니다.');
		} else {
			alert('add 실패했습니다.');
		}
	}							     
</script>
</head>
<body>
  faq 목록
</body>
</html>

0개의 댓글