@ModelAttribute
Spring MVC 의 목적과 사용법은 무엇입니까 ?
@ModelAttribute
Spring MVC 의 목적과 사용법은 무엇입니까 ?
답변:
@ModelAttribute
Model 객체의 속성 (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 사용"을 참조하십시오 .
@ModelAttribute
첫 번째 경우에는 실제로 필요하지 않습니다 .
@ModelAttribute
메소드 속성 에 사용해야 합니까?
나는 이것이 오래된 실이라는 것을 알고 있지만, 반지에 모자를 던지고 물을 조금 더 흐릴 수 있는지 알았습니다. :)
처음 이해해야 할 어려움 @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를보고 싶지 않습니다.
@Scope("request")
then :)
내 스타일의 경우 항상 @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)
책의 모든 필드 이름은 양식의 하위 요소에있는 경로와 일치해야합니다.
catch
동사는 정확히 작업 설명 @ModelAttribute
수행했습니다. 좋은.
그래서 더 간단한 방법으로 설명하려고 노력할 것입니다. 하자 :
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 등의 복잡한 객체를 바인딩 할 수 있지만 장면 뒤에서 데이터 바인딩을 마술로 만듭니다.
인수에 @ModelAttribute를 사용하여 모델 어노테이션이있는 메소드 및 요청 메소드 핸들러를 동시에 가질 수 있습니다. 그런 다음 규칙을 통합해야합니다.
물론 우리는 다양한 상황을 가지고 있습니다-@ModelAttribute 메소드는 @ControllerAdvice 등에서도 정의 될 수 있습니다 ...
나는 파티에 늦었다는 것을 알고 있지만, "더 나은 것보다 늦지 말라"라고 말한 것처럼 인용 할 것이다. 우리 모두가 설명해 볼 수있는 방법을 가지고 있습니다. 예를 들어 몇 단계 만 거치면 간단하게 정리해 보겠습니다. 간단한 형식 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 단계 : 그런 다음 페이지에 표시 한 것처럼 입찰에 따라 사용합니다.
나는 그것이 당신이 개념을 이해하는 데 도움이되기를 바랍니다. 감사
Gmail, Facebook 또는 Instagram 또는 기타 웹 응용 프로그램이든 웹 응용 프로그램이든 최종 사용자와 응용 프로그램 또는 UI와 백 엔드 응용 프로그램간에 데이터 나 정보를 교환하는 것입니다. Spring MVC 세계에서도 데이터를 교환하는 두 가지 방법이 있습니다.
여기서 관심이있는 것은 UI에서 컨트롤러로 데이터를 전달하는 방법입니다. 이 작업은 두 가지 방법으로 수행 할 수도 있습니다.
HTML 양식 사용 : 아래 시나리오를 고려하십시오.
웹 브라우저에서 양식 데이터를 제출하면 Controller 클래스의 해당 데이터에 객체로 액세스 할 수 있습니다. HTML 양식을 제출하면 스프링 컨테이너는 4 가지를 수행합니다. 그것은
이 모든 것이 작동하게하려면 특정 단계를 따라야합니다.
먼저 필드 수는 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";
}
이 도식적 인 설명이 도움이 되었기를 바랍니다!
이것은 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,...) {
}
이제 양식을 제출할 때 양식 필드 값을 사용할 수 있습니다.
@ModelAttribute는 메서드 인수 / 매개 변수로 또는 메서드 선언 전에 사용할 수 있습니다. 요청 매개 변수 또는 양식 필드를 모델 오브젝트에 바인드하기위한이 주석의 기본 목표
ModelAttribute 주석은 Spring MVC 웹 애플리케이션의 일부로 사용되며 두 가지 시나리오에서 사용할 수 있습니다.
우선, 데이터를 사전 JSP로드 모델에 주입하는 데 사용할 수 있습니다. 이는 모든 데이터 자체를 표시하기 위해 JSP가 필요한지 확인하는 데 특히 유용합니다. 하나의 방법을 모델에 연결하여 주입합니다.
둘째, 기존 모델에서 데이터를 읽고 코치 방법의 파라미터에 할당하는 데 사용할 수 있습니다.
방법 수준에서
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";
}