Spring MVC에서 @ModelAttribute는 무엇입니까?


372

@ModelAttributeSpring MVC 의 목적과 사용법은 무엇입니까 ?



40
독자가 Spring 문서가 제공하는 것보다 더 많은 정보 (예를 포함하여)를 얻을 수 있기 때문에 이것이 유용한 질문이라고 생각합니다.
anton1980

3
이 글을 확인하십시오. thespringthing.blogspot.com/2010/11/…
praveenj

답변:


399

@ModelAttributeModel 객체의 속성 (MVC의 M)을 참조하므로 "Person"이라는 폼 백업 객체를 가진 폼이 있다고 가정 해 봅시다. 그러면 스프링 MVC가 @ModelAttribute어노테이션 을 사용하여 Controller 메소드에이 객체를 제공하도록 할 수 있습니다 :

public String processForm(@ModelAttribute("person") Person person){
    person.getStuff();
}

반면에 주석은 모델의 일부 여야하는 객체를 정의하는 데 사용됩니다. 따라서 모델에서 Person 객체를 참조하려면 다음 방법을 사용할 수 있습니다.

@ModelAttribute("person")
public Person getPerson(){
    return new Person();
}

이 어노테이션이있는 메소드는보기에서 Person 오브젝트에 액세스 할 수있게합니다. Spring에 의해 모델에 자동으로 추가되기 때문입니다.

"@ModelAttribute 사용"을 참조하십시오 .


8
@fasseg @ModelAttribute첫 번째 경우에는 실제로 필요하지 않습니다 .
Neil McGuigan

@Neil 언제 @ModelAttribute메소드 속성 에 사용해야 합니까?
Ryan


1
Person을 채우는 방법과이 메서드를 호출하는 방법을 포함해야합니다.
Philip Rego

134

나는 이것이 오래된 실이라는 것을 알고 있지만, 반지에 모자를 던지고 물을 조금 더 흐릴 수 있는지 알았습니다. :)

처음 이해해야 할 어려움 @ModelAttribute은 Spring이 여러 주석을 하나로 결합하기로 한 결정의 결과 라는 것을 알았 습니다. 여러 개의 작은 주석으로 나누면 더 명확 해졌습니다.

매개 변수 어노테이션의 @ModelAttribute경우와 동등한 것으로 생각 하십시오. @Autowired + @Qualifier즉, 스프링 관리 모델에서 지정된 이름의 Bean을 검색하려고 시도합니다. 명명 된 Bean을 찾을 수 없으면 오류를 던지거나을 리턴하는 대신 null암시 적 @Bean으로 기본 생성자를 사용하여 새 인스턴스를 작성하고 모델에 Bean을 추가하는 역할을 수행 합니다.

메소드 어노테이션의 @ModelAttribute경우와 동등한 것으로 생각 하십시오 @Bean + @Before. 즉, 사용자 코드로 구성된 Bean을 모델에 넣고 항상 요청 처리 메소드 전에 호출됩니다.

비 유적으로, 나는 @ModelAttribute다음과 같이 본다 (말 그대로 받아들이지 마라 !!) :

@Bean("person")
@Before
public Person createPerson(){
  return new Person();
}

@RequestMapping(...)
public xxx handlePersonRequest( (@Autowired @Qualifier("person") | @Bean("person")) Person person, xxx){
  ...
}

보시다시피 Spring은 @ModelAttribute포괄적 인 주석 을 만들기 위해 올바른 결정을 내 렸습니다 . 아무도 주석 smorgasbord를보고 싶지 않습니다.


2
흠, @Bean은 기본적으로 싱글 톤입니다. 동일한 개념이 여기에 적용되는지 확실하지 않습니다.
좀비

10
절대적으로하지. 이 복잡한 주석을 설명하기 위해 간단한 주석을 사용하고 있습니다. 말 그대로가 아니라 개념적으로 내 설명을 받아보십시오.
Christopher Yang

4
@Zombies add @Scope("request")then :)
OrangeDog 2016 년

28

내 스타일의 경우 항상 @ModelAttribute를 사용하여 스프링 형식 jsp에서 객체를 잡습니다. 예를 들어 jsp 페이지에서 양식을 디자인하면 해당 양식이 commandName과 함께 존재합니다.

<form:form commandName="Book" action="" methon="post">
      <form:input type="text" path="title"></form:input>
</form:form>

다음 코드를 사용하여 컨트롤러에서 객체를 잡습니다.

public String controllerPost(@ModelAttribute("Book") Book book)

책의 모든 필드 이름은 양식의 하위 요소에있는 경로와 일치해야합니다.


4
catch동사는 정확히 작업 설명 @ModelAttribute수행했습니다. 좋은.
Eddy

3
올해 최고의 답변.
목성 Cls

4
그러나 필요합니까? 이것은 @ModelAttribute 주석을 사용하지 않고 여전히 작동합니다.

23

그래서 더 간단한 방법으로 설명하려고 노력할 것입니다. 하자 :

public class Person {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(final String name) {
        this.name = name;
    }
}

Spring MVC 문서에서 설명 된 것처럼 @ModelAttribute 주석은 메소드메소드 인수 에서 사용될 수있다 . 물론 하나의 컨트롤러에서 동시에 두 가지를 모두 사용할 수 있습니다.

1. 방법 주석

@ModelAttribute(“cities”)
 public List<String> checkOptions(){
 return new Arrays.asList(new[]{“Sofia”,”Pleven","Ruse”});//and so on
}

이러한 방법의 목적은 모델에 속성을 추가하는 것입니다. 따라서 우리의 경우 도시 키는 목록 new Arras.asList(new[]{“Sofia”,”Pleven","Ruse”})을 모델의 값으로 가질 것입니다 (모델을 map (key : value)로 생각할 수 있습니다). 컨트롤러의 @ModelAttribute 메서드 는 동일한 컨트롤러 내에서 @RequestMapping 메서드 보다 먼저 호출됩니다 .

여기서는 사용자에게 표시하기 위해 양식에 사용될 공통 정보를 모델에 추가하려고합니다. 예를 들어 HTML 선택을 채우는 데 사용할 수 있습니다.

여기에 이미지 설명을 입력하십시오

2. 방법론

public String findPerson(@ModelAttriute(value="person") Person person) {
    //..Some logic with person
    return "person.jsp";
}

메소드 인수의 @ModelAttribute는 모델에서 인수를 검색해야 함을 나타냅니다. 따라서이 경우 Model person 객체에 키가 있고 값을 가져 와서 Person 인수 메서드 인수에 넣기를 원합니다 . 그러한 것이 존재하지 않거나 (때로는 (value = "persson")의 철자를 틀리면) Spring은 모델에서 그것을 찾지 못하고 기본값을 사용하여 빈 Person 객체를 만듭니다. 그런 다음 요청 매개 변수를 사용하여 이름을 사용하여 Person 개체에서 데이터 바인딩을 시도합니다.

name="Dmitrij"&countries=Lesoto&sponsor.organization="SilkRoad"&authorizedFunds=&authorizedHours=&

따라서 이름이 있고 setName (String name)을 사용하여 Person.name에 바인드됩니다. 그래서

//..Some logic with person

값이 "Dimitrij"인이 채워진 이름에 액세스 할 수 있습니다.

물론 Spring은 List, Maps, List of Maps 등의 복잡한 객체를 바인딩 할 수 있지만 장면 뒤에서 데이터 바인딩을 마술로 만듭니다.

  1. 인수에 @ModelAttribute를 사용하여 모델 어노테이션이있는 메소드 및 요청 메소드 핸들러를 동시에 가질 수 있습니다. 그런 다음 규칙을 통합해야합니다.

  2. 물론 우리는 다양한 상황을 가지고 있습니다-@ModelAttribute 메소드는 @ControllerAdvice 등에서도 정의 될 수 있습니다 ...


13

나는 파티에 늦었다는 것을 알고 있지만, "더 나은 것보다 늦지 말라"라고 말한 것처럼 인용 할 것이다. 우리 모두가 설명해 볼 수있는 방법을 가지고 있습니다. 예를 들어 몇 단계 만 거치면 간단하게 정리해 보겠습니다. 간단한 형식 form.jsp가 있다고 가정하십시오.

<form:form action="processForm" modelAttribute="student">
First Name : <form:input path="firstName" /> 
<br><br>
Last Name : <form:input path="lastName" />
<br><br>
<input type="submit" value="submit"/>
</form:form>

path = "firstName"path = "lastName"이들은 폼을 호출자 (getter)라고 부르지 만 일단 제출 된 설정자 (setter)가 호출되고 해당 값이 modelAttribute에 표시된 Bean에 설정 될 때 StudentClass의 필드 / 속성입니다. 양식 태그에서 "학생".

우리는 다음 메소드를 포함하는 StudentController를 가지고 있습니다;

@RequestMapping("/showForm")
public String showForm(Model theModel){ //Model is used to pass data between 
//controllers and views
    theModel.addAttribute("student", new Student()); //attribute name, value
return "form";
}

@RequestMapping("/processForm")
public String processForm(@ModelAttribute("student") Student theStudent){
    System.out.println("theStudent :"+ theStudent.getLastName());
return "form-details";
}

//@ModelAttribute("student") Student theStudent
//Spring automatically populates the object data with form data all behind the 
//scenes 

이제 마지막으로 form-details.jsp가 있습니다.

<b>Student Information</b>
${student.firstName}
${student.lastName}

Spring MVC에서 @ModelAttribute는 무엇입니까? 당신의 소스에서 샘플 정의는 http://www.baeldung.com/spring-mvc-and-the-modelattribute-annotation @ModelAttribute는 주석입니다 명명 된 모델 속성에 바인딩하는 방법 매개 변수 또는 메서드 반환 값 그런 다음 웹보기에 노출시킵니다.

실제로 발생하는 것은 양식에 의해 제출 된 양식의 모든 값을 가져 와서 객체에 바인딩하거나 할당하기 위해 보유하는 것입니다. 매개 변수 만 가져 와서 일부 필드에 값을 할당하는 @RequestParameter 와 동일하게 작동 합니다. 차이점은 @ModelAttribute 가 단일 매개 변수가 아닌 모든 양식 데이터를 보유한다는 것입니다. 나중에 개발자가 사용할 양식 제출 데이터를 보유하는 Bean을 작성합니다.

모든 것을 요약합니다. 1 단계 : 요청이 전송되고 메소드 showForm이 실행되고 모델이 생성되며, 임시 bean은 학생 이름으로 양식이 전달됩니다. theModel.addAttribute ( "student", new Student ());

2 단계 : 양식 제출 모델의 modelAttribute = "student" 가 학생을 변경하고 이제 양식의 모든 매개 변수를 보유합니다.

3 단계 : @ModelAttribute ( "student") Student theStudent @ModelAttribute 가 보유한 값을 가져 와서 전체 Bean / 객체를 Student에 지정합니다.

4 단계 : 그런 다음 페이지에 표시 한 것처럼 입찰에 따라 사용합니다.

나는 그것이 당신이 개념을 이해하는 데 도움이되기를 바랍니다. 감사


9

Gmail, Facebook 또는 Instagram 또는 기타 웹 응용 프로그램이든 웹 응용 프로그램이든 최종 사용자와 응용 프로그램 또는 UI와 백 엔드 응용 프로그램간에 데이터 나 정보를 교환하는 것입니다. Spring MVC 세계에서도 데이터를 교환하는 두 가지 방법이 있습니다.

  1. 컨트롤러에서 UI로
  2. UI에서 컨트롤러로.

여기서 관심이있는 것은 UI에서 컨트롤러로 데이터를 전달하는 방법입니다. 이 작업은 두 가지 방법으로 수행 할 수도 있습니다.

  1. HTML 양식 사용
  2. 쿼리 매개 변수 사용

HTML 양식 사용 : 아래 시나리오를 고려하십시오.

양식 제출 표현

웹 브라우저에서 양식 데이터를 제출하면 Controller 클래스의 해당 데이터에 객체로 액세스 할 수 있습니다. HTML 양식을 제출하면 스프링 컨테이너는 4 가지를 수행합니다. 그것은

  1. 먼저 request.getParameter 메소드를 사용하여 요청에 제공된 제출 된 모든 데이터를 읽습니다 .
  2. 일단 읽고 나면 integer.parseInt , double.parseDouble 및 데이터의 데이터 유형에 따라 사용 가능한 다른 모든 구문 분석 메소드를 사용하여 적절한 Java 유형으로 변환합니다 .
  3. 구문 분석되면 생성 한 모델 클래스의 객체가 생성됩니다. 예를 들어,이 시나리오에서는 제출되는 사용자 정보이며 User라는 클래스를 작성합니다.이 클래스는 컨테이너가 오브젝트를 작성하고 해당 오브젝트에 자동으로 들어오는 모든 값을 설정합니다.
  4. 그런 다음 값을 Controller로 설정하여 해당 객체를 핸드 오버합니다.

이 모든 것이 작동하게하려면 특정 단계를 따라야합니다.

내부 작업

먼저 필드 수는 HTML 양식의 필드 수와 정확히 일치해야하는 User와 같은 모델 클래스를 정의해야합니다. 또한 HTML 양식에 사용하는 이름은 Java 클래스에있는 이름과 일치해야합니다. 이 두 가지는 매우 중요합니다. 이름은 일치해야하며 양식의 필드 수는 생성 한 클래스의 필드 수와 일치해야합니다. 그렇게하면 컨테이너는 들어오는 데이터를 자동으로 읽고이 모델의 객체를 생성하고 값을 설정 한 후 컨트롤러에 전달합니다. Controller 내부의 값을 읽으려면 @ModelAttribute를 사용하십시오.메소드 매개 변수에 주석. Controller에서 메소드를 만들 때 @ModelAttribute를 사용하고 컨테이너에이 객체를 자동으로 부여하는 매개 변수를 추가합니다.

다음은 사용자 등록을위한 예제 코드입니다.

@RequestMapping(value = "registerUser", method = RequestMethod.POST)
public String registerUser(@ModelAttribute("user") User user, ModelMap model) {
    model.addAttribute("user", user);
    return "regResult";
}

이 도식적 인 설명이 도움이 되었기를 바랍니다!


4

이것은 Spring의 데이터 바인딩 목적으로 사용됩니다 MVC. 예를 들어 양식 요소가있는 jsp를 사용하십시오.

의 위에 JSP

<form:form action="test-example" method="POST" commandName="testModelAttribute"> </form:form>

(봄 양식 방법, 간단한 양식 요소도 사용할 수 있습니다)

컨트롤러 쪽

@RequestMapping(value = "/test-example", method = RequestMethod.POST)
public ModelAndView testExample(@ModelAttribute("testModelAttribute") TestModel testModel, Map<String, Object> map,...) {

}

이제 양식을 제출할 때 양식 필드 값을 사용할 수 있습니다.


4

메소드 매개 변수 또는 메소드 리턴 값을 웹보기에 노출 된 명명 된 모델 속성에 바인드하는 주석.

public String add(@ModelAttribute("specified") Model model) {
    ...
}


1

@ModelAttribute(@ModelAttribute("Testing") Test test) as Testing 주어진 예제에서 사용자 가 지정한 이름으로 속성을 생성합니다 . 테스트는 Bean에 대한 참조 인 Bean 테스트이며 테스트는 모델에서 사용할 수 있으므로 저장된 값을 검색하기 위해 jsp 페이지에서 추가로 사용할 수 있습니다 당신 안에 ModelAttribute.


1

@ModelAttribute는 단순히 컨트롤러 클래스에서 논리를 수행하기 위해 jsp 필드의 값을 Pojo calss에 바인딩합니다. 스트럿에 익숙한 경우 제출시 formbean 오브젝트를 채우는 것과 같습니다.


0

ModelAttribute 주석은 Spring MVC 웹 애플리케이션의 일부로 사용되며 두 가지 시나리오에서 사용할 수 있습니다.

우선, 데이터를 사전 JSP로드 모델에 주입하는 데 사용할 수 있습니다. 이는 모든 데이터 자체를 표시하기 위해 JSP가 필요한지 확인하는 데 특히 유용합니다. 하나의 방법을 모델에 연결하여 주입합니다.

둘째, 기존 모델에서 데이터를 읽고 코치 방법의 파라미터에 할당하는 데 사용할 수 있습니다.

굴절 https://dzone.com/articles/using-spring-mvc%E2%80%99s


0

방법 수준에서

1. 어노테이션이 메소드 레벨에서 사용되면 해당 메소드의 목적이 하나 이상의 모델 속성을 추가하는 것임을 나타냅니다.

@ModelAttribute
public void addAttributes(Model model) {
model.addAttribute("india", "india");
}

메소드 인수에서 1. 메소드 인수로 사용되는 경우 모델에서 인수를 검색해야 함을 나타냅니다. 존재하지 않고 먼저 인스턴스화 한 후 모델에 추가하고 모델에 존재하면 인수 필드는 일치하는 이름을 가진 모든 요청 매개 변수에서 채워 져야합니다. 따라서 양식 데이터를 Bean과 바인드합니다.

 @RequestMapping(value = "/addEmployee", method = RequestMethod.POST)
  public String submit(@ModelAttribute("employee") Employee employee) {
  return "employeeView";
  }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.