@ModelAttribution trong Spring MVC là gì?


372

Mục đích và cách sử dụng @ModelAttributetrong Spring MVC là gì?



40
Tôi nghĩ rằng đây là một câu hỏi hữu ích, bởi vì nó cho phép người đọc có được nhiều thông tin hơn (bao gồm các ví dụ) so với tài liệu chính thức của Spring cung cấp.
anton1980

3
Kiểm tra writeup này ở đây. thespringthing.blogspot.com/2010/11/...
praveenj

Câu trả lời:


399

@ModelAttributeđề cập đến một thuộc tính của đối tượng Model (M trong MVC;) vì vậy giả sử chúng ta có một biểu mẫu với một đối tượng sao lưu biểu mẫu được gọi là "Person" Sau đó, bạn có thể yêu cầu Spring MVC cung cấp đối tượng này cho phương thức Trình điều khiển bằng cách sử dụng @ModelAttributechú thích :

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

Mặt khác, chú thích được sử dụng để xác định các đối tượng nên là một phần của Mô hình. Vì vậy, nếu bạn muốn có một đối tượng Person được tham chiếu trong Mô hình, bạn có thể sử dụng phương thức sau:

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

Phương thức chú thích này sẽ cho phép truy cập vào đối tượng Person trong Chế độ xem của bạn, vì nó được tự động thêm vào Mô hình theo Mùa xuân.

Xem "Sử dụng @ModelAttribution" .


8
@fasseg Bạn không thực sự cần @ModelAttributetrong trường hợp đầu tiên của bạn.
Neil McGuigan

@Neil Khi nào bạn cần sử dụng @ModelAttributetrong các thuộc tính phương thức?
Ryan


1
bạn nên bao gồm cách Person được điền và cách gọi phương thức này.
Philip Rego

134

Tôi biết đây là một chủ đề cũ, nhưng tôi nghĩ rằng tôi ném chiếc mũ của mình vào vòng và xem liệu tôi có thể làm vấy bẩn nước thêm một chút nữa không :)

Tôi thấy cuộc đấu tranh ban đầu của mình để hiểu @ModelAttributelà kết quả của quyết định của Spring khi kết hợp nhiều chú thích thành một. Nó trở nên rõ ràng hơn khi tôi chia nó thành nhiều chú thích nhỏ hơn:

Đối với các chú thích tham số, hãy nghĩ @ModelAttributenhư là tương đương với @Autowired + @Qualifiernghĩa là nó cố gắng truy xuất một bean với tên đã cho từ mô hình được quản lý Spring. Nếu không tìm thấy bean được đặt tên, thay vì ném lỗi hoặc trả về null, nó hoàn toàn đảm nhận vai trò @Beantức là Tạo một thể hiện mới bằng cách sử dụng hàm tạo mặc định và thêm bean vào mô hình.

Đối với các chú thích phương thức, hãy nghĩ @ModelAttributelà tương đương với @Bean + @Before, nghĩa là nó đặt bean được xây dựng theo mã của người dùng trong mô hình và nó luôn được gọi trước một phương thức xử lý yêu cầu.

Theo nghĩa bóng, tôi thấy @ModelAttributenhư sau (xin đừng hiểu theo nghĩa đen !!):

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

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

Như bạn có thể thấy, Spring đã đưa ra quyết định đúng đắn để đưa ra @ModelAttributemột chú thích bao gồm tất cả; không ai muốn xem một smorgasbord chú thích.


2
Hừm, @Bean là singleton theo mặc định. Tôi không chắc các khái niệm tương tự được áp dụng ở đây.
Zombie

10
Tuyệt đối không. Tôi chỉ sử dụng các chú thích đơn giản hơn để giải thích chú thích phức tạp này. Hãy đưa ra lời giải thích của tôi về mặt khái niệm, không theo nghĩa đen.
Christopher Yang

4
@Zombie thêm @Scope("request")rồi :)
OrangeDog

28

Đối với phong cách của tôi, tôi luôn sử dụng @ModelAttribution để bắt đối tượng từ jsp dạng spring. ví dụ: tôi thiết kế biểu mẫu trên trang jsp, biểu mẫu đó tồn tại với lệnhName

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

và tôi bắt đối tượng trên bộ điều khiển với mã theo sau

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

và mọi tên trường của sách phải khớp với đường dẫn trong thành phần phụ của biểu mẫu


4
Các catchđộng từ chính xác mô tả công việc mà @ModelAttributeđã làm. Đẹp.
Eddy

3
Câu trả lời hay nhất trong năm.
Sao Mộc Cls

4
Nhưng nó có cần thiết không? Điều này vẫn hoạt động mà không sử dụng chú thích @ModelAttribution.

23

Vì vậy, tôi sẽ cố gắng giải thích nó theo cách đơn giản hơn. Hãy có:

public class Person {
    private String name;

    public String getName() {
        return name;
    }

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

Như được mô tả trong tài liệu Spring MVC - chú thích @ModelAttribution có thể được sử dụng trên các phương thức hoặc trên các đối số phương thức . Và tất nhiên chúng ta có thể có cả hai sử dụng cùng một lúc trong một bộ điều khiển.

Chú thích 1.Method

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

Mục đích của phương pháp này là thêm thuộc tính trong mô hình. Vì vậy, trong trường hợp thành phố của chúng ta, khóa sẽ có danh sách new Arras.asList(new[]{“Sofia”,”Pleven","Ruse”})là giá trị trong Mô hình (bạn có thể nghĩ Mô hình là bản đồ (key: value)). Các phương thức @ModelAttribution trong bộ điều khiển được gọi trước các phương thức @RequestMapping , trong cùng một bộ điều khiển.

Ở đây chúng tôi muốn thêm vào Mô hình thông tin chung sẽ được sử dụng trong biểu mẫu để hiển thị cho người dùng. Ví dụ: nó có thể được sử dụng để điền vào HTML chọn:

nhập mô tả hình ảnh ở đây

Đối số 2.Method

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

Một @ModelAttribution trên một đối số phương thức cho biết đối số nên được lấy từ mô hình. Vì vậy, trong trường hợp này, chúng tôi hy vọng rằng chúng tôi có trong mô hình người tượng như chìa khóa và chúng tôi muốn có được giá trị của nó và đưa nó vào phương pháp luận người Person . Nếu như vậy không tồn tại hoặc (đôi khi bạn viết sai chính tả (value = "Persson")) thì Spring sẽ không tìm thấy nó trong Mô hình và sẽ tạo đối tượng Person trống bằng cách sử dụng mặc định của nó. Sau đó sẽ lấy các tham số yêu cầu và cố gắng dữ liệu liên kết chúng trong đối tượng Person bằng tên của chúng.

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

Vì vậy, chúng tôi có tên và nó sẽ được liên kết với Person.name bằng cách sử dụng setName (Tên chuỗi). Vậy trong

//..Some logic with person

chúng tôi có quyền truy cập vào tên đầy đủ này với giá trị "Dimitrij".

Tất nhiên, Spring có thể liên kết các đối tượng phức tạp hơn như Danh sách, Bản đồ, Danh sách các Bộ bản đồ, v.v. nhưng đằng sau cảnh nó làm cho phép thuật liên kết dữ liệu.

  1. Chúng ta có thể có cùng lúc mô hình phương thức chú thích và xử lý phương thức yêu cầu với @ModelAttribution trong các đối số. Sau đó, chúng tôi phải hợp nhất các quy tắc.

  2. Tất nhiên, chúng ta có vô số tình huống khác nhau - các phương thức @ModelAttribution cũng có thể được định nghĩa trong một @ControllAdvice, v.v.


13

Tôi biết tôi đến bữa tiệc muộn, nhưng tôi sẽ trích dẫn như họ nói, "thà muộn còn hơn không". Vì vậy, hãy để chúng tôi đi, Mọi người đều có cách riêng để giải thích mọi thứ, hãy để tôi cố gắng tóm tắt và đơn giản hóa nó cho bạn trong một vài bước với một ví dụ; Giả sử bạn có một biểu mẫu đơn giản, 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" Đây là các trường / thuộc tính trong StudentClass khi biểu mẫu được gọi là getters của chúng được gọi nhưng sau khi gửi setters của chúng được gọi và giá trị của chúng được đặt trong bean được chỉ định trong modelAttribution = "Học sinh" trong thẻ mẫu.

Chúng tôi có StudentControll bao gồm các phương thức sau;

@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 

bây giờ cuối cùng chúng ta cũng có một form-detail.jsp

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

Vì vậy, trở lại câu hỏi @ModelAttribution trong Spring MVC là gì? Một định nghĩa mẫu từ nguồn cho bạn, http://www.baeldung.com/spring-mvc-and-the-modelattribute-annotation Các @ModelAttribute là một chú thích mà gắn bó với một tham số phương pháp hay giá trị trả về phương pháp để một thuộc tính mô hình tên và sau đó hiển thị nó cho một trang web xem.

Điều thực sự xảy ra là nó nhận được tất cả các giá trị của biểu mẫu của bạn đã được gửi bởi nó và sau đó giữ chúng để bạn liên kết hoặc gán chúng cho đối tượng. Nó hoạt động tương tự như @RequestParameter khi chúng ta chỉ nhận được một tham số và gán giá trị cho một số trường. Chỉ khác là @ModelAttribution chứa tất cả dữ liệu biểu mẫu thay vì một tham số. Nó tạo ra một bean cho bạn chứa dữ liệu đã gửi của nhà phát triển để sử dụng sau này.

Để tóm tắt lại toàn bộ. Bước 1: Một yêu cầu được gửi và phương thức showForm của chúng tôi chạy và một mô hình, một bean tạm thời được đặt với tên sinh viên được chuyển tiếp đến biểu mẫu. theModel.addAttribution ("sinh viên", Sinh viên mới ());

Bước 2: modelAttribution = "student" trên mô hình gửi biểu mẫu thay đổi sinh viên và bây giờ nó giữ tất cả các tham số của biểu mẫu

Bước 3: @ModelAttribution ("student") Student theStudent Chúng tôi tìm nạp các giá trị được giữ bởi @ModelAttribution và gán toàn bộ bean / object cho Student.

Bước 4: Và sau đó chúng tôi sử dụng nó khi chúng tôi đặt giá thầu, giống như hiển thị nó trên trang, v.v. như tôi đã làm

Tôi hy vọng nó sẽ giúp bạn hiểu khái niệm này. Cảm ơn


9

Sử dụng bất kỳ ứng dụng web nào cho dù đó là Gmail hay Facebook hoặc Instagram hoặc bất kỳ ứng dụng web nào khác, tất cả là về việc trao đổi dữ liệu hoặc thông tin giữa người dùng cuối và ứng dụng hoặc giao diện người dùng và ứng dụng phía sau. Ngay cả trong thế giới Spring MVC cũng có hai cách để trao đổi dữ liệu:

  1. từ Bộ điều khiển đến Giao diện người dùng và
  2. từ UI đến Bộ điều khiển.

Điều chúng tôi quan tâm ở đây là cách dữ liệu được truyền từ UI đến Bộ điều khiển. Điều này cũng có thể được thực hiện theo 2 cách:

  1. Sử dụng mẫu HTML
  2. Sử dụng tham số truy vấn.

Sử dụng Biểu mẫu HTML: Xem xét kịch bản dưới đây,

Biểu mẫu đại diện

Khi chúng tôi gửi dữ liệu biểu mẫu từ trình duyệt web, chúng tôi có thể truy cập dữ liệu đó trong lớp Trình điều khiển dưới dạng đối tượng. Khi chúng tôi gửi biểu mẫu HTML, Spring Container thực hiện bốn điều. Nó sẽ,

  1. trước tiên hãy đọc tất cả dữ liệu được gửi trong yêu cầu bằng phương thức request.getParameter .
  2. một lần nó đọc chúng, nó sẽ chuyển đổi chúng thành các loại Java thích hợp sử dụng Integer.parseInt , double.parseDouble và tất cả các phương pháp phân tích cú pháp khác mà có sẵn dựa trên các kiểu dữ liệu của dữ liệu.
  3. một khi được phân tích cú pháp, nó sẽ tạo một đối tượng của lớp mô hình mà chúng ta đã tạo. Ví dụ, trong kịch bản này, đó là thông tin người dùng đang được gửi và chúng tôi tạo một lớp có tên là Người dùng, mà Container sẽ tạo một đối tượng và nó sẽ đặt tất cả các giá trị tự động vào đối tượng đó.
  4. sau đó nó sẽ bàn giao đối tượng đó bằng cách đặt các giá trị cho Bộ điều khiển.

Để làm cho toàn bộ điều này hoạt động, chúng tôi sẽ phải làm theo các bước nhất định.

Làm việc nội bộ

Trước tiên chúng ta cần xác định một lớp mô hình, như Người dùng, trong đó số lượng trường phải khớp chính xác với số lượng trường trong biểu mẫu HTML. Ngoài ra, các tên mà chúng ta sử dụng trong biểu mẫu HTML phải khớp với các tên mà chúng ta có trong lớp Java. Hai cái này rất quan trọng. Tên phải khớp, số lượng trường trong biểu mẫu phải khớp với số lượng trường trong lớp mà chúng ta tạo. Khi chúng tôi thực hiện điều đó, Container sẽ tự động đọc dữ liệu đi vào, tạo một đối tượng của mô hình này, đặt các giá trị và nó trao nó cho Bộ điều khiển. Để đọc các giá trị đó bên trong Bộ điều khiển, chúng tôi sử dụng @ModelAttributionchú thích về các tham số phương thức. Khi chúng ta tạo các phương thức trong Trình điều khiển, chúng ta sẽ sử dụng @ModelAttribution và thêm một tham số cho nó, nó sẽ tự động có đối tượng này được cung cấp bởi Container.

Dưới đây là mã ví dụ để đăng ký người dùng:

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

Hy vọng giải thích sơ đồ này đã giúp!


4

Điều này được sử dụng cho mục đích ràng buộc dữ liệu trong Spring MVC. Để bạn có một jsp có một phần tử biểu mẫu trong đó, vd

trên JSP

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

(Phương thức Spring Form, phần tử biểu mẫu đơn giản cũng có thể được sử dụng)

Về phía bộ điều khiển

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

}

Bây giờ khi bạn sẽ gửi biểu mẫu, các giá trị trường biểu mẫu sẽ có sẵn cho bạn.


4

Chú thích liên kết giá trị tham số phương thức hoặc giá trị trả về phương thức với thuộc tính mô hình được đặt tên, được hiển thị với chế độ xem web.

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

3

@ModelAttribution có thể được sử dụng làm đối số / tham số của phương thức hoặc trước khi khai báo phương thức. Mục tiêu chính của chú thích này để liên kết các tham số yêu cầu hoặc các trường biểu mẫu với một đối tượng mô hình

Tham chiếu http://www.javabeat.net/modelattribution-spring-mvc/


1

@ModelAttributesẽ tạo một thuộc tính với tên do bạn chỉ định (@ModelAttribute("Testing") Test test) as Testing trong ví dụ đã cho, Kiểm tra là kiểm tra bean là tham chiếu đến bean và Kiểm tra sẽ có sẵn trong mô hình để bạn có thể sử dụng thêm trên các trang jsp để truy xuất các giá trị mà bạn đã lưu trữ trong bạn ModelAttribute.


1

@ModelAttribution chỉ liên kết giá trị từ các trường jsp với các tệp Pojo để thực hiện logic của chúng ta trong lớp trình điều khiển. Nếu bạn đã quen thuộc với các thanh chống, thì điều này giống như việc điền vào đối tượng formbean khi gửi.


0

Chú thích ModelAttribution được sử dụng như một phần của ứng dụng Spring MVC Web và có thể được sử dụng trong hai tình huống.

Trước hết, nó có thể được sử dụng để đưa dữ liệu vào mô hình tải trước tiền. Điều này đặc biệt hữu ích trong việc đảm bảo rằng cần phải có một bản sao để hiển thị tất cả dữ liệu. Một mũi tiêm có được bằng cách kết nối một phương pháp với mô hình.

Thứ hai, nó có thể được sử dụng để đọc dữ liệu từ một mô hình hiện có và gán nó cho các tham số của phương thức của huấn luyện viên.

điều chỉnh https://dzone.com/articles/USE-spring-mvc%E2%80%99s


0

Ở cấp độ phương pháp

1. Khi chú thích được sử dụng ở cấp phương thức, nó chỉ ra mục đích của phương thức đó là thêm một hoặc nhiều thuộc tính mô hình

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

Tại đối số phương thức 1. Khi được sử dụng làm đối số phương thức, nó chỉ ra đối số nên được lấy từ mô hình. Khi không có mặt và nên được khởi tạo trước rồi sau đó được thêm vào mô hình và một khi có mặt trong mô hình, các trường đối số sẽ được điền từ tất cả các tham số yêu cầu có tên trùng khớp Vì vậy, nó liên kết dữ liệu biểu mẫu với một bean.

 @RequestMapping(value = "/addEmployee", method = RequestMethod.POST)
  public String submit(@ModelAttribute("employee") Employee employee) {
  return "employeeView";
  }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.