Mục đích và cách sử dụng @ModelAttribute
trong Spring MVC là gì?
Mục đích và cách sử dụng @ModelAttribute
trong Spring MVC là gì?
Câu trả lời:
@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 @ModelAttribute
chú 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.
@ModelAttribute
trong trường hợp đầu tiên của bạn.
@ModelAttribute
trong các thuộc tính phương thức?
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 @ModelAttribute
là 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ĩ @ModelAttribute
như là tương đương với @Autowired + @Qualifier
nghĩ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ò @Bean
tứ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ĩ @ModelAttribute
là 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 @ModelAttribute
như 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 @ModelAttribute
một chú thích bao gồm tất cả; không ai muốn xem một smorgasbord chú thích.
@Scope("request")
rồi :)
Đố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
catch
động từ chính xác mô tả công việc mà @ModelAttribute
đã làm. Đẹp.
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:
Đố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.
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.
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.
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
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:
Đ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:
Sử dụng Biểu mẫu HTML: Xem xét kịch bản dưới đây,
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ẽ,
Để 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.
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!
Đ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.
@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/
@ModelAttribute
sẽ 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
.
@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.
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
Ở 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";
}