본문으로 바로가기

[Spring MVC] Flash Attributes

category Spring/SpringMVC 2019. 8. 20. 20:53

Flash Attributes

: 주로 리다이렉트시 데이터를 전달할때 사용한다.

: 쿼리 파라미터로 노출되지 않는다.

: 임의의 객체를 저장할 수 있다.

: 보통 HTTP 세션을 사용한다.

: 리다이렉트 하기 전에 데이터를 HTTP 세션에 저장하고 리다이렉트 요청을 처리 한 다음 즉시 제거한다.

 

=> RedirectAttributes를 통해 사용할 수 있다.

 

<소스 코드>

package com.example.demo;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.SessionAttribute;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.bind.support.SessionStatus;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

@Controller
@SessionAttributes("event")
public class SampleController {

	@GetMapping("/events/form/name")
	public String eventFormName(Model model) {
		model.addAttribute("event", new Event());
		return "/events/form-name";
	}

	@PostMapping("/events/form/name")
	public String eventsFromNameSubmit(@Validated @ModelAttribute Event event, BindingResult bindingResult) {
		if (bindingResult.hasErrors()) {
			return "/events/form-name";
		}

		return "redirect:/events/form/limit";
	}

	@GetMapping("/events/form/limit")
	public String eventFormLimit(@ModelAttribute Event event, Model model) {
		model.addAttribute("event", event);
		return "/events/form-limit";
	}

	@PostMapping("/events/form/limit")
	public String createEvent(@Validated @ModelAttribute Event event, BindingResult bindingResult,
			SessionStatus sessionStatus, RedirectAttributes attributes) {
		if (bindingResult.hasErrors()) {
			return "/events/form-limit";
		}
		sessionStatus.setComplete();
		attributes.addFlashAttribute("newEvent", event);
		return "redirect:/events/list";
	}

	@GetMapping("/events/list")
	public String getEvents(Model model,
			@SessionAttribute LocalDateTime visitTime) {

		Event spring = new Event();
		spring.setName("spring");
		spring.setLimit(10);
		
		Event newEvent = (Event)model.asMap().get("newEvent");

		List<Event> eventList = new ArrayList<Event>();
		eventList.add(newEvent);
		eventList.add(spring);
		model.addAttribute(eventList);

		return "/events/list";
	}

}

 

<Test 코드>

@Test
public void getEvents() throws Exception{
		
		Event newEvent = new Event();
		newEvent.setName("Winter");
		newEvent.setLimit(1000);
		
		mockMvc.perform(get("/events/list")
				.sessionAttr("visitTime", LocalDateTime.now())
				.flashAttr("newEvent", newEvent))
				.andDo(print())
				.andExpect(status().isOk())
				.andExpect(xpath("//p").nodeCount(2));
				
}

'Spring > SpringMVC' 카테고리의 다른 글

[Spring MVC] 응답 타입 @ResponseBody & ResponseEntity  (0) 2019.08.22
[Spring MVC] MultipartFile  (0) 2019.08.20
[Spring MVC] RedirectAttributes  (0) 2019.08.19
[Spring MVC] @SessionAttribute  (0) 2019.08.19
[Spring MVC] @SessionAttributes  (0) 2019.08.15