Tôi biết câu hỏi này được đánh dấu là đã giải quyết rồi nhưng tôi muốn thêm một hình ảnh mới hơn giải thích mô hình này một cách chi tiết (nguồn: mùa xuân trong hành động 4):
Giải thích
Khi yêu cầu rời khỏi trình duyệt (1), nó mang thông tin về những gì người dùng đang yêu cầu. Ít nhất, yêu cầu sẽ mang theo URL được yêu cầu. Nhưng nó cũng có thể mang theo dữ liệu bổ sung, chẳng hạn như thông tin được gửi trong biểu mẫu của người dùng.
Điểm dừng đầu tiên trong chuyến đi của yêu cầu là tại DispatcherServlet của Spring. Giống như hầu hết các khung công tác web dựa trên Java, các kênh Spring MVC yêu cầu thông qua một servlet điều khiển phía trước đơn. Một bộ điều khiển phía trước là một mẫu ứng dụng web phổ biến trong đó một servlet đơn ủy nhiệm trách nhiệm cho một yêu cầu tới các thành phần khác của một ứng dụng để xử lý thực tế. Trong trường hợp của Spring MVC, DispatcherServlet là bộ điều khiển phía trước. Công việc của DispatcherServlet là gửi yêu cầu tới bộ điều khiển Spring MVC. Bộ điều khiển là một thành phần Spring xử lý yêu cầu. Nhưng một ứng dụng điển hình có thể có nhiều bộ điều khiển và DispatcherServlet cần một số trợ giúp để quyết định bộ điều khiển nào gửi yêu cầu đến. Vì vậy, DispatcherServlet tham khảo một hoặc nhiều ánh xạ xử lý (2) để tìm ra điểm dừng tiếp theo của yêu cầu. Lập bản đồ xử lý đặc biệt chú ý đến URL được thực hiện bởi yêu cầu khi đưa ra quyết định. Khi bộ điều khiển thích hợp đã được chọn, DispatcherServlet sẽ gửi yêu cầu trên đường đến bộ điều khiển đã chọn (3). Tại bộ điều khiển, yêu cầu giảm tải trọng của nó (thông tin được gửi bởi người dùng) và kiên nhẫn đợi trong khi bộ điều khiển xử lý thông tin đó. (Trên thực tế, một bộ điều khiển được thiết kế tốt cho mỗi bản thân ít hoặc không xử lý và thay vào đó phân bổ trách nhiệm cho logic nghiệp vụ cho một hoặc nhiều đối tượng dịch vụ.) Logic thực hiện bởi bộ điều khiển thường dẫn đến một số thông tin cần được mang trở lại cho người dùng và được hiển thị trong trình duyệt. Thông tin này được gọi là mô hình. Tuy nhiên, việc gửi thông tin thô về cho người dùng không đủ - nó cần được định dạng theo định dạng thân thiện với người dùng, thường là HTML. Để làm được điều đó, thông tin cần được cung cấp cho một khung nhìn, thường là một trang JavaServer (JSP). Một trong những điều cuối cùng mà bộ điều khiển thực hiện là gói dữ liệu mô hình và xác định tên của chế độ xem sẽ hiển thị kết quả đầu ra. Sau đó, nó sẽ gửi yêu cầu, cùng với tên model và view, quay lại DispatcherServlet (4). Để bộ điều khiển không được ghép nối với một chế độ xem cụ thể, tên chế độ xem được truyền lại cho DispatcherServlet không trực tiếp xác định một JSP cụ thể. Nó thậm chí không nhất thiết cho rằng khung nhìn là một JSP. Thay vào đó, nó chỉ mang một tên logic sẽ được sử dụng để tra cứu khung nhìn thực tế sẽ tạo ra kết quả. DispatcherServlet yêu cầu trình phân giải chế độ xem (5) để ánh xạ tên chế độ xem logic đến một triển khai chế độ xem cụ thể, có thể hoặc không thể là JSP. Bây giờ DispatcherServlet biết chế độ xem nào sẽ hiển thị kết quả, công việc của yêu cầu gần như đã kết thúc. Điểm dừng cuối cùng của nó là ở chế độ xem triển khai (6), thường là JSP, nơi nó cung cấp dữ liệu mô hình. Công việc của yêu cầu cuối cùng cũng được thực hiện.Khung nhìn sẽ sử dụng dữ liệu mô hình để hiển thị kết quả đầu ra sẽ được đưa trở lại máy khách bởi đối tượng phản hồi (không phải làm việc chăm chỉ) (7).
Tuyệt vời riposte, bây giờ là một câu hỏi như thế nào đến DispatcherServlet xác định tên lớp và tên phương pháp quá. Bạn có thể chỉ cho tôi một ví dụ về một cấu hình mà tôi có hai lớp và hai tên phương thức và cách DispatcherServlet nắm bắt được yêu cầu đúng. – Kevin
Nó thực sự quét đường dẫn lớp để khởi động chú thích đó và tạo một ánh xạ của "/pages/Home.html" cho Class + Method. Nếu bạn có hai phương thức mà cả hai đều có "/pages/Home.html" không có giới hạn nào khác trong chú thích của chúng, thì đó sẽ là lỗi và nó sẽ quăng ngoại lệ cho bạn. Bạn cũng có thể kết nối nó với XML nếu bạn đang học cũ. – Affe
Chúng ta có cần tệp xml 'Dispatcher Servlet' khi sử dụng Chú thích dựa trên' @ RestController' không? – viper