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 필드가있는 간단한 양식을 만들어 보겠습니다.
<form:form method="POST" action="/spring-mvc-basics/addEmployee"
modelAttribute="employee">
<form:label path="name">Name</form:label>
<form:input path="name" />
<form:label path="id">Id</form:label>
<form:input path="id" />
<input type="submit" value="Submit" />
</form:form>
3.2 컨트롤러
다음은 앞서 언급 한 뷰에 대한 논리가 구현되는 컨트롤러 클래스입니다.
@Controller
@ControllerAdvice
public class EmployeeController {
private Map<Long, Employee> 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 대표 로 호출된다는 것을 의미합니다 .
또한 addAttributes () 메서드도 있습니다. 그 목적은 전 세계적으로 식별 될 모델 에 값을 추가 하는 것입니다. 즉, 모든 컨트롤러 메서드에 대한 모든 요청에 대한 응답으로 기본값이 반환됩니다. 또한 특정 클래스에 @ControllerAdvice 로 어노테이션을 달아야 합니다.
3.3 모델
앞에서 언급했듯이 Model 개체는 매우 단순하며 "프런트 엔드"특성에 필요한 모든 것을 포함합니다. 이제 예제를 살펴 보겠습니다.
@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 마무리
@ControllerAdvice는 컨트롤러를 지원하고, 특히에서 @ModelAttribute 모두에 적용되는 방법 @RequestMapping의 방법. 물론, 우리의 addAttributes () 메소드는 나머지 @RequestMapping 메소드 보다 먼저 실행될 것 입니다.
이 점을 염두에두고 submit () 및 addAttributes ()를 모두 실행 한 후에는 $ 와 같이 달러화 중괄호 듀오 안에 주어진 이름을 언급 하여 Controller 클래스 에서 반환 된 View 에서 참조 할 수 있습니다. {name} .
3.5 결과보기
이제 양식에서받은 내용을 인쇄 해 보겠습니다.
<h3>${msg}</h3>
Name : ${name}
ID : ${id}
4. 결론
이 사용방법(예제)에서는 메서드 인수 및 메서드 수준 사용 사례 모두에 대해 @ModelAttribute 어노테이션 의 사용을 조사했습니다 .
이 간단한 예제의 구현은 github 프로젝트 에서 찾을 수 있습니다 .
- https://docs.spring.io/spring-framework/docs/current/reference/html
- https://www.baeldung.com/spring-mvc-and-the-modelattribute-annotation
'Java' 카테고리의 다른 글
Spring MVC 사용자 지정 유효성 검사 (0) | 2021.04.19 |
---|---|
Spring @ResponseStatus를 사용하여 HTTP 상태 코드 설정 (0) | 2021.04.19 |
Spring MVC의 HttpMediaTypeNotAcceptableException (0) | 2021.04.18 |
@Before 대 @BeforeClass 대 @BeforeEach 대 @BeforeAll (0) | 2021.04.18 |
Spring MVC의 HandlerAdapters (0) | 2021.04.18 |