복붙노트

[SPRING] Spring MVC는 컨트롤러간에 같은 객체를 전달한다.

SPRING

Spring MVC는 컨트롤러간에 같은 객체를 전달한다.

Spring MVC에서 두 컨트롤러 메소드간에 객체를 전달하는 방법은 무엇입니까? 업데이트 폼과 updateController가 있습니다. 컨트롤러에는 데이터를 가져 와서 뷰에 표시하는 두 가지 방법이 있습니다. 컨트롤러의 두 번째 방법은 사용자가 수정 된 변경 사항으로 업데이트 버튼을 클릭 할 때 호출됩니다. 내가 관찰 한 것은 컨트롤러의 두 번째 메서드에서 얻은 개체가 첫 번째 컨트롤러 메서드 호출에서 뷰에 전달한 개체가 아니라는 것입니다. 그것과 연결된 모든 양식 필드를 가진 새로운 객체입니다. 첫 번째 컨트롤러 메서드로 뷰에 제공된 두 번째 컨트롤러 메서드에 동일한 개체가 전달되도록하려면 어떻게해야합니까?

@RequestMapping(value = "/showEmpDetail.html", method = RequestMethod.GET)
public String showEmpDetails(
        @RequestParam(value = "page", required = false) Integer page,
        HttpServletRequest request, @RequestParam("empId") Long empId,
        ModelMap model) {
    // Get employee using empId from DB
    model.addAttribute("emp",emp);
    return "showEmpDetail";
    }

위의 컨트롤러 메서드는 Db에서 emp 값을 가져 와서 뷰에 올바르게 표시합니다. 이제 사용자가 세부 정보를 변경하고 제출 버튼을 클릭합니다. 다음 제어기 메소드가 호출됩니다.

@RequestMapping(value = "/editEmpFormSubmission.html", method = RequestMethod.POST)
public String editEmpFormSubmission(
        @RequestParam(value = "page", required = false) Integer page,
        @ModelAttribute("emp") Employee emp, BindingResult result,
        ModelMap model, HttpServletRequest request) {
     // update changes in DB
    }

위의 컨트롤러 메서드에서 이전 컨트롤러 호출에서 전달한 동일한 개체가 아닌 emp 개체를 확인할 때. 양식은 아니지만 값이있는 필드는 null로 변경되었습니다. 동일한 객체가 뷰로 전달되는지 어떻게 확인할 수 있습니까? 사용자가 세션의 많은 직원을 수정할 수 있기 때문에 sessionAttribute로 객체를 추가하고 싶지 않습니다.

해결법

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

    1.3 가지 옵션이 있습니다.

    3 가지 옵션이 있습니다.

    @SessionAttributes("emp")
    public class EmployeeController {
    @RequestMapping(value = "/editEmpFormSubmission.html", method = RequestMethod.POST)
    public String editEmpFormSubmission(
        @RequestParam(value = "page", required = false) Integer page,
        @ModelAttribute("emp") Employee emp, BindingResult result,
        ModelMap model, HttpServletRequest request
        SessionStatus status) {
     // update changes in DB
     status.setComplete();
    }    
    } 
    
    public class EmployeeController {
    
        @ModelAttribute("emp")
        public Employee getEmployee(@RequestParam("empdId") Long id) {
            // Get employee using empId from DB
            return  emp;
        }
    
        @RequestMapping(value = "/showEmpDetail.html", method = RequestMethod.GET)
        public String showEmpDetails() {) {
            return "showEmpDetail";
        }
    }
    

    나는 옵션으로 가지 않을 것이고, 강하게 클린업을위한 SessionStatus 객체에 setComplete ()를 포함하는 옵션 1을 강하게 제안 할 것이다. 1과 2를 결합 할 수도 있습니다 (@ModelAttribute 주석이있는 메소드가 있고 @SessionAttributes를 여전히 사용합니다).

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

    2.초기 렌더링시 임의의 숫자로 채워진 필드를 필드에 만들면 해당 개체를 세션에 저장할 수 있습니다. 보기에서 해당 필드를 숨겨진 입력과 매핑 할 수 있습니다. 이제 사용자가 작업 편집 요청을 보내면 숨겨진 필드를 가져올 수 있으며 숨겨진 필드의 번호로 세션에서 원래 개체를 가져올 수 있습니다. 그러면 다른 탭의 여러 편집 내용이 서로 충돌하게됩니다.

    초기 렌더링시 임의의 숫자로 채워진 필드를 필드에 만들면 해당 개체를 세션에 저장할 수 있습니다. 보기에서 해당 필드를 숨겨진 입력과 매핑 할 수 있습니다. 이제 사용자가 작업 편집 요청을 보내면 숨겨진 필드를 가져올 수 있으며 숨겨진 필드의 번호로 세션에서 원래 개체를 가져올 수 있습니다. 그러면 다른 탭의 여러 편집 내용이 서로 충돌하게됩니다.

  3. from https://stackoverflow.com/questions/21426519/spring-mvc-pass-same-object-between-controller by cc-by-sa and MIT license