Spring MVC와 @ModelAttribute 주석

1. 개요

가장 중요한 Spring-MVC 주석 중 하나는 @ModelAttribute 주석입니다.

@ModelAttribute는 명명 된 모델 속성에 메서드 매개 변수 또는 메서드 반환 값을 결합하는 주석과 후 웹보기를 제공합니다.

다음 예에서는 회사 직원이 제출 한 양식이라는 공통 개념을 통해 주석의 유용성과 기능을 보여줍니다.

2. 깊이 있는 @ModelAttribute

소개 단락에서 알 수 있듯이 @ModelAttribute 는 메서드 매개 변수 또는 메서드 수준에서 사용할 수 있습니다.

2.1 방법 수준에서

어노테이션이 메소드 레벨에서 사용되면 해당 메소드의 목적이 하나 이상의 모델 속성을 추가하는 것임을 나타냅니다. 이러한 메서드는 @RequestMapping 메서드와 동일한 인수 유형을 지원하지만 요청에 직접 매핑 할 수 없습니다.

이것이 어떻게 작동하는지 이해하기 위해 여기에서 간단한 예를 살펴 보겠습니다.

@ModelAttribute public void addAttributes(Model model) { model.addAttribute("msg", "Welcome to the Netherlands!"); } 

이 예제에서는 컨트롤러 클래스에 정의 된 모든 모델에 msg 라는 속성을 추가하는 메소드를 보여줍니다 .

물론이 기사의 뒷부분에서이 동작을 볼 수 있습니다.

일반적으로 Spring-MVC는 요청 핸들러 메소드를 호출하기 전에 항상 해당 메소드를 먼저 호출합니다. 즉, @RequestMapping 으로 주석이 달린 컨트롤러 메서드가 호출되기 전에 @ModelAttribute 메서드가 호출 됩니다. 시퀀스의 논리는 컨트롤러 메서드 내에서 처리가 시작되기 전에 모델 개체를 만들어야한다는 것입니다.

각 클래스에 @ControllerAdvice로 주석을 추가하는 것도 중요합니다. 따라서 글로벌로 식별 될 모델 에 값을 추가 할 수 있습니다 . 이것은 실제로 모든 요청에 ​​대해 응답 부분의 모든 메서드에 대해 기본값이 존재 함을 의미합니다.

2.2 메서드 인수로

메서드 인수로 사용되는 경우 모델에서 인수를 검색해야 함을 나타냅니다. 존재하지 않는 경우 먼저 인스턴스화 한 다음 모델에 추가하고 모델에 있으면 인수 필드는 이름이 일치하는 모든 요청 매개 변수에서 채워 져야합니다.

직원 모델 속성 을 따르는 코드 조각 에서 addEmployee 끝점에 제출 된 양식의 데이터로 채워집니다 . Spring MVC는 submit 메소드를 호출하기 전에 배후에서이를 수행합니다.

@RequestMapping(value = "/addEmployee", method = RequestMethod.POST) public String submit(@ModelAttribute("employee") Employee employee) { // Code that uses the employee object return "employeeView"; }

이 기사의 뒷부분에서 employee 개체를 사용 하여 employeeView 템플릿 을 채우는 방법에 대한 전체 예제를 살펴 보겠습니다 .

따라서 양식 데이터를 빈과 바인딩합니다. @RequestMapping 주석이 달린 컨트롤러 는 @ModelAttribute 주석이 달린 사용자 정의 클래스 인수를 가질 수 있습니다 .

이것은 일반적으로 Spring-MVC에서 데이터 바인딩으로 알려진 것으로, 각 양식 필드를 개별적으로 구문 분석하지 않아도되는 공통 메커니즘입니다.

3. 양식 예

이 섹션에서는 개요 섹션에 언급 된 예를 제공합니다. 사용자 (특정 예에서는 회사의 직원)에게 일부 개인 정보 (특히 이름ID) 를 입력하라는 메시지를 표시하는 매우 기본적인 양식입니다 . 제출이 완료되고 오류없이 사용자는 이전에 제출 된 데이터가 다른 화면에 표시되기를 기대합니다.

3.1보기

먼저 id 및 name 필드가있는 간단한 양식을 만들어 보겠습니다.

 Name  Id    

3.2 컨트롤러

다음은 앞서 언급 한 뷰에 대한 논리가 구현되는 컨트롤러 클래스입니다.

@Controller @ControllerAdvice public class EmployeeController { private Map employeeMap = new HashMap(); @RequestMapping(value = "/addEmployee", method = RequestMethod.POST) public String submit( @ModelAttribute("employee") Employee employee, BindingResult result, ModelMap model) { if (result.hasErrors()) { return "error"; } model.addAttribute("name", employee.getName()); model.addAttribute("id", employee.getId()); employeeMap.put(employee.getId(), employee); return "employeeView"; } @ModelAttribute public void addAttributes(Model model) { model.addAttribute("msg", "Welcome to the Netherlands!"); } }

제출 () 방법 우리는이 직원 우리에 바인딩 개체 보기를 . 이 주석의 힘을 볼 수 있습니까? 간단하게 양식 필드를 개체 모델에 매핑 할 수 있습니다. 메서드에서 우리는 폼에서 값을 가져 와서 ModelMap으로 설정합니다 .

결국 employeeView 를 반환 합니다 . 이는 해당 JSP 파일이 View 대표 로 호출된다는 것을 의미합니다 .

Furthermore, there is also an addAttributes() method. Its purpose is to add values in the Model which will be identified globally. That is, a default value will be returned as a response for every request to every controller method. We also have to annotate the specific class as @ControllerAdvice.

3.3 The Model

As mentioned before, the Model object is very simplistic and contains all that is required by the “front-end” attributes. Now, let's have a look at an example:

@XmlRootElement public class Employee { private long id; private String name; public Employee(long id, String name) { this.id = id; this.name = name; } // standard getters and setters removed }

3.4 Wrap Up

The @ControllerAdvice assists a controller and in particular, @ModelAttribute methods that apply to all @RequestMapping methods. Of course, our addAttributes() method will be the very first to run, prior to the rest of the @RequestMapping methods.

Keeping that in mind and after both of submit() and addAttributes() are run, we could just refer to them in the View returned from the Controller class, by mentioning their given name inside a dollarized curly-braces duo, like for example ${name}.

3.5 Results View

Let's now print what we received from the form:

${msg}

Name : ${name} ID : ${id}

4. Conclusion

이 자습서에서는 메서드 인수 및 메서드 수준 사용 사례 모두에 대해 @ModelAttribute 주석 의 사용을 조사했습니다 .

이 간단한 튜토리얼의 구현은 github 프로젝트에서 찾을 수 있습니다.