복붙노트

[SPRING] 봄 RedirectAttributes : addFlashAttribute 대 addAttribute () ()

SPRING

봄 RedirectAttributes : addFlashAttribute 대 addAttribute () ()

지금까지 우리 컨트롤러 요청 매핑 방법에 대한 이해는 RedirectAttributes 매개 변수를 지정하고 요청이 리디렉션 될 때 속성으로 채 웁니다.

예:

@RequestMapping(value="/hello", method=GET)
public String hello(RedirectAttributes redirAttr)
{
   // should I use redirAttr.addAttribute() or redirAttr.addFlashAttribute() here ?

   // ...

   return "redirect:/somewhere";
}

리디렉션 속성은 리디렉션 대상 페이지에서 사용할 수 있습니다.

그러나 RedirectAttributes 클래스에는 두 가지 메소드가 있습니다.

잠시 동안 Spring 문서를 읽었지 만 조금 잃어 버렸습니다. 이 둘의 근본적인 차이점은 무엇이며, 어떤 것을 사용할 것인지 선택해야합니까?

해결법

  1. ==============================

    1.차이점은 다음과 같습니다.

    차이점은 다음과 같습니다.

    따라서 addFlashAttribute ()의 이점은 flash 속성에 객체를 저장할 수 있다는 것입니다 (요청 매개 변수로 직렬화되지 않고 객체로 유지됨). 반면 addAttribute ()를 사용하면 add가 일반 요청 매개 변수로 변환되면 String이나 프리미티브와 같은 객체 유형으로 상당히 제한됩니다.

  2. ==============================

    2.컨트롤러가 2 대 있다고 가정합니다. 한 컨트롤러에서 다른 컨트롤러로 리디렉션하는 경우     모델 객체의 값을 다른 컨트롤러에서 사용할 수 없습니다.     다른 컨트롤러. 따라서 모델 객체 값을 공유하려면     첫 번째 컨트롤러에서 말을해야합니다.

    컨트롤러가 2 대 있다고 가정합니다. 한 컨트롤러에서 다른 컨트롤러로 리디렉션하는 경우     모델 객체의 값을 다른 컨트롤러에서 사용할 수 없습니다.     다른 컨트롤러. 따라서 모델 객체 값을 공유하려면     첫 번째 컨트롤러에서 말을해야합니다.

    addFlashAttribute("modelkey", "modelvalue");
    

    그런 다음 두 번째 컨트롤러의 모델에 위의 키 값 쌍이 포함됩니다.

    두 번째 질문은? RedirectAttributes 클래스의 addAttribute와 addFlashAttribute의 차이점은 무엇입니까?

    addAttribute는 모델 대신 requestparameters로 값을 전달하므로 addAttribute를 사용하여 일부를 추가하면 request.getParameter에서 해당 값에 액세스 할 수 있습니다

    여기에 코드가 있습니다. 나는 무슨 일이 일어나고 있는지 알아 보곤했습니다.

    @RequestMapping(value = "/rm1", method = RequestMethod.POST)
    public String rm1(Model model,RedirectAttributes rm) {
        System.out.println("Entered rm1 method ");
    
        rm.addFlashAttribute("modelkey", "modelvalue");
        rm.addAttribute("nonflash", "nonflashvalue");
        model.addAttribute("modelkey", "modelvalue");
    
        return "redirect:/rm2.htm";
    }
    
    
    @RequestMapping(value = "/rm2", method = RequestMethod.GET)
    public String rm2(Model model,HttpServletRequest request) {
        System.out.println("Entered rm2 method ");
    
        Map md = model.asMap();
        for (Object modelKey : md.keySet()) {
            Object modelValue = md.get(modelKey);
            System.out.println(modelKey + " -- " + modelValue);
        }
    
        System.out.println("=== Request data ===");
    
        java.util.Enumeration<String> reqEnum = request.getParameterNames();
        while (reqEnum.hasMoreElements()) {
            String s = reqEnum.nextElement();
            System.out.println(s);
            System.out.println("==" + request.getParameter(s));
        }
    
        return "controller2output";
    }
    
  3. ==============================

    3.Javadoc 설명 : "FlashMap은 하나의 요청이 다른 URL에서 사용하도록 의도 된 속성을 저장할 수있는 방법을 제공합니다. 이것은 한 URL에서 다른 URL로 리디렉션 할 때 가장 일반적으로 필요합니다. 예를 들어 Post / Redirect / Get 패턴 FlashMap은 리디렉션 리디렉션 후에 즉시 사용할 수있게되어 즉시 제거됩니다. "

    Javadoc 설명 : "FlashMap은 하나의 요청이 다른 URL에서 사용하도록 의도 된 속성을 저장할 수있는 방법을 제공합니다. 이것은 한 URL에서 다른 URL로 리디렉션 할 때 가장 일반적으로 필요합니다. 예를 들어 Post / Redirect / Get 패턴 FlashMap은 리디렉션 리디렉션 후에 즉시 사용할 수있게되어 즉시 제거됩니다. "

  4. from https://stackoverflow.com/questions/14470111/spring-redirectattributes-addattribute-vs-addflashattribute by cc-by-sa and MIT license