[SPRING] Spring MVC는 컨트롤러간에 같은 객체를 전달한다.
SPRINGSpring 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.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.초기 렌더링시 임의의 숫자로 채워진 필드를 필드에 만들면 해당 개체를 세션에 저장할 수 있습니다. 보기에서 해당 필드를 숨겨진 입력과 매핑 할 수 있습니다. 이제 사용자가 작업 편집 요청을 보내면 숨겨진 필드를 가져올 수 있으며 숨겨진 필드의 번호로 세션에서 원래 개체를 가져올 수 있습니다. 그러면 다른 탭의 여러 편집 내용이 서로 충돌하게됩니다.
초기 렌더링시 임의의 숫자로 채워진 필드를 필드에 만들면 해당 개체를 세션에 저장할 수 있습니다. 보기에서 해당 필드를 숨겨진 입력과 매핑 할 수 있습니다. 이제 사용자가 작업 편집 요청을 보내면 숨겨진 필드를 가져올 수 있으며 숨겨진 필드의 번호로 세션에서 원래 개체를 가져올 수 있습니다. 그러면 다른 탭의 여러 편집 내용이 서로 충돌하게됩니다.
from https://stackoverflow.com/questions/21426519/spring-mvc-pass-same-object-between-controller by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring @autowired는 non-singleton 컨테이너가 아닌가요? (0) | 2019.02.14 |
---|---|
[SPRING] Thymeleaf / Spring MVC - Link 표현식에서 변수 / 표현식을 중첩하는 방법은 무엇입니까? (0) | 2019.02.14 |
[SPRING] 스프링 데이터 JPA로 version 속성이 설정되지 않은 이유는 무엇입니까? (0) | 2019.02.14 |
[SPRING] HttpStatus 상태 코드를 기반으로 Spring 재시도에서 RetryPolicy를 설정할 수 있습니까? (0) | 2019.02.14 |
[SPRING] 호출되지 않는 Spring 싱글 톤 Bean의 @PreDestroy 메소드 (0) | 2019.02.14 |