프로그래밍/Spring & Spring boot

[Spring/스프링] redirect / RedirectAttribute - flashAttribute / ModelAndView

pupu91 2022. 9. 7. 16:58
반응형

 

 

redirect

: 사용자의 url을 강제적으로 redirect 경로로 이동시키라는 의미

  접두사로 redirect: 을 하면 forward가 아닌 redirect 시킴

 

 

 

/main 설정

@Controller
public class MainController {

	@RequestMapping("/main")
	public void main() {}
	
}

 

 

 

 

메인페이지에 버튼 생성하고 string-redirect 로 이동 경로 설정

<%@ 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>
</head>
<body>
	
	<h1 align="center"> 뷰 리졸버를 이용한 뷰 연결하기 </h1>
	
	<h3> 문자열로 redirect 하기</h3>
	<button onclick="location.href='string-redirect'">문자열로 뷰 이름 반환하여 리다이렉트</button>
    
        확인을 위한 알럿창 
        <script>
	const message = decodeURIComponent('${ param.message }').replace("+", " ");
	if(message){
		alert(message);
	}
	</script>

 

 

 

 

Controller파일에 redirect할 핸들러메소드 작성

@Controller
public class ResolverConrtroller {
	
    @GetMapping("/string-redirect")
	public String stringRedirect(Model model) throws UnsupportedEncodingException {
	
    redirect시 기본 타입 데이터를 model에 추가하면 url의 parameter가 됨(쿼리스트링으로) 
    model.addAttribute("message", URLEncoder.encode("문자열로 리다이렉트함", "UTF-8"));
    =>인코딩하지 않으면 알럿창에 한글값 출력x
	
    main으로 재요청하도록 강제화
    return "redirect:main";
}

 

 

 

결과 화면

=> URL에 메세지 값이 쿼리스트링으로 나옴.

 

 

 

 

 


 

RedirectAttributes의 addFlashAttribute 메소드 

:  RedirectAttribute에 addFlashAttribute를 하면 redirect 했을 경우에도 requestScope에서 값을 꺼내 쓸 수있음

  내부적으로 세션에 임시로 값을 담고 소멸시키기 때문에 세션에 동일한 키 값이 존재하면 덮어쓰기 될 수 있으니 유의!

 

 

 

◎ addFlashAttribute 메소드 사용하여 redirect하기

 

메인페이지에 버튼 생성하고 string-redirect-attr 로 이동 경로 설정

<%@ 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>
</head>
<body>

	<button onclick="location.href='string-redirect-attr'"> 문자열 redirect하면서 flashAttr 사용하기</button>
	
	<script>
    	 addFlashAttribute를 하면 redirect 했을 경우에도 requestScope에서 값을 꺼내 쓸 수 있음
		const flashMessage = '${ requestScope.flashMessage }';
		if(flashMessage){
			alert(flashMessage);
		}
	</script>
	
</body>
</html>

 

반응형

 

Controller파일의 핸들러 메소드에 RedirectAttribetes 전달하고 addFlashAttribute사용하여 redirect하기

@Controller
public class ResolverConrtroller {
	
    @GetMapping("/string-redirect-attr")
	public String stringRedirectFlashAttribute(RedirectAttributes rttr) {
		
        rttr.addFlashAttribute("flashMessage","리다이렉트 attr 사용하여 리다이렉트함");
		
        return "redirect:main";
	}

}

 

 

 

화면 결과

=> 인코딩하지 않아도 한글 출력 가능. 쿼리스트링 없이 main URL 만 요청됨.

 

 

 

 


ModelAndView

: 모델과 뷰를 합친 개념. 

  핸들러 어댑터가 핸들러 메소드를 호출하고 문자열을 ModelAndview로 만들어 DispatcherServlet에 반환하는데

  이 때 문자열을 반환해도 되지만 ModelAndView를 미리 만들어서 반환할 수도 있음.

 

 

@Controller
public class ResolverConrtroller {
	
    @GetMapping("/modelandview")
	public ModelAndView modelAndView(ModelAndView mv) {
    
   
    mv.addObject("message", "ModelAndView를 이용한 모델과 뷰 반환");  반환할 데이터
    mv.setViewName("result"); 반환할 뷰
    
    return mv;
    
   }
}

 

ModelAndView를  RedirectAttributes사용하여 redirect하기

@Controller
public class ResolverConrtroller {

    @GetMapping("/modelandview-redirect-attr")
	public ModelAndView modelAndViewRedirectFlashAttribute(ModelAndView mv, RedirectAttributes rttr) {
		
		rttr.addFlashAttribute("flashMessage", "모델앤드뷰를 리타이렉트 attr사용하여 리다이럭트함");
		mv.setViewName("redirect:main");
		
		return mv;
	}
}

 

반응형