2010-05-04 30 views
134

Trong hình ảnh này (mà tôi nhận được từ here), HTTP yêu cầu gửi một thứ gì đó đến Servatcher.Servatcher Dispatcher trong mùa xuân là gì?

enter image description here

Câu hỏi của tôi là những gì hiện Dispatcher Servlet làm gì?

Có giống như nhận thông tin được ném từ trang web và đưa thông tin vào bộ điều khiển không?

Trả lời

148

Công việc của DispatcherServlet là để có một URI đến và tìm thấy sự kết hợp của bộ xử lý (nói chung là phương pháp trên khiển lớp) và quan điểm (thường JSP) mà kết hợp để tạo các trang hoặc tài nguyên đó là nghĩa vụ được tìm thấy tại vị trí đó.

tôi có thể có

  • một file /WEB-INF/jsp/pages/Home.jsp
  • và một phương pháp trên một lớp

    @RequestMapping(value="/pages/Home.html") 
    private ModelMap buildHome() { 
        return somestuff; 
    } 
    

Các Dispatcher servlet là bit rằng "biết" để gọi phương thức đó khi trình duyệt yêu cầu ests trang và kết hợp các kết quả của nó với tệp JSP phù hợp để tạo một tài liệu html.

Cách thực hiện điều này rất khác nhau với cấu hình và phiên bản Spring.

Cũng không có lý do gì khiến kết quả cuối cùng phải là trang web. Nó có thể làm tương tự để xác định các điểm kết thúc RMI, xử lý các yêu cầu SOAP, bất kỳ thứ gì có thể đi vào một servlet.

+2

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

+8

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

+0

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

39

DispatcherServlet là triển khai Spring MVC của front controller pattern.

Xem mô tả trong tài liệu Spring here.

Về bản chất, đó là servlet nhận yêu cầu gửi đến và ủy quyền xử lý yêu cầu đó cho một trong số các trình xử lý, ánh xạ trong đó cụ thể trong cấu hình DispatcherServlet.

+0

Có giống như sự kiện trong Flex, nơi tôi nhận được sự kiện gửi từ một MXML này sang một MXML khác hoặc tới máy chủ. Tôi có thể có nhiều hơn một DispatcherServlet trong ứng dụng của mình hay không. Mỗi tệp lớp có một DispatcherServlet riêng biệt. – Kevin

+0

Thường chỉ có một bộ điều khiển phía trước. Điều này là bất kể các mô hình và quan điểm bạn có. Nó chỉ mang đến các mô hình và quan điểm cụ thể với nhau. – BalusC

+2

@theband: Bạn * có thể * có nhiều 'DispatcherServlets', nếu kiến ​​trúc của bạn có ý nghĩa hơn theo cách đó, nhưng thường không có lý do gì. – skaffman

5

Chúng tôi có thể nói như DispatcherServlet chăm sóc mọi thứ trong Spring MVC.

Tại container web khởi động:

  1. DispatcherServlet sẽ được nạp và khởi tạo bằng cách gọi init() phương pháp
  2. init() của DispatcherServlet sẽ cố gắng để xác định các cấu hình tài liệu xuân với quy ước đặt tên như "servlet_name-servlet.xml" sau đó tất cả đậu có thể được xác định.

Ví dụ:

public class DispatcherServlet extends HttpServlet { 

    ApplicationContext ctx = null; 

    public void init(ServletConfig cfg){ 
     // 1. try to get the spring configuration document with default naming conventions 
     String xml = "servlet_name" + "-servlet.xml"; 

     //if it was found then creates the ApplicationContext object 
     ctx = new XmlWebApplicationContext(xml); 
    } 
    ... 
} 

Vì vậy, trong thường DispatcherServlet yêu cầu chụp URI và bàn giao cho HandlerMapping. HandlerMapping tìm kiếm ánh xạ bean với phương pháp điều khiển, nơi bộ điều khiển trả về tên logic (xem). Sau đó, tên hợp lý này được gửi đến DispatcherServlet theo HandlerMapping. Sau đó, DispatcherServlet yêu cầu ViewResolver cung cấp toàn bộ vị trí xem bằng cách thêm tiền tố và hậu tố, sau đó DispatcherServlet cung cấp chế độ xem cho khách hàng.

+0

Đây là một lời giải thích tốt đẹp. Điểm số 2 của bạn nói rằng DispatcherServlet sẽ cố gắng xác định Tài liệu Cấu hình Mùa xuân với các quy ước đặt tên như "servlet_name-servlet.xml". Tuy nhiên, tôi đã thấy các dự án sử dụng tên như "dispatcher" chỉ, và nó hoạt động tốt. Tôi cũng đã thử điều đó. Nhưng tôi không biết tại sao? –

27

Trong Spring MVC, tất cả các yêu cầu đến đều đi qua một servlet đơn. Servlet này - DispatcherServlet - là bộ điều khiển phía trước. Bộ điều khiển mặt trước là một mẫu thiết kế điển hình trong việc phát triển các ứng dụng web. Trong trường hợp này, một servlet đơn nhận tất cả các yêu cầu và chuyển chúng tới tất cả các thành phần khác của ứng dụng.

Nhiệm vụ của DispatcherServlet là gửi yêu cầu đến bộ điều khiển MVC Spring cụ thể.

Thông thường chúng ta có rất nhiều bộ điều khiển và DispatcherServlet đề cập đến một trong những người vẽ bản đồ sau đây để xác định bộ điều khiển mục tiêu:

Nếu không có cấu hình nào được thực hiện, DispatcherServlet sử dụng BeanNameUrlHandlerMappingDefaultAnnotationHandlerMapping theo mặc định.

Khi bộ điều khiển đích được xác định, yêu cầu DispatcherServlet gửi đến nó. Bộ điều khiển thực hiện một số công việc theo yêu cầu (hoặc ủy quyền nó cho các đối tượng khác), và quay trở lại DispatcherServlet với Mô hình và tên của Chế độ xem.

Tên của Chế độ xem chỉ là tên hợp lý. Tên logic này sau đó được sử dụng để tìm kiếm Chế độ xem thực tế (để tránh khớp nối với bộ điều khiển và Chế độ xem cụ thể). Sau đó, DispatcherServlet đề cập đến ViewResolver và ánh xạ tên lôgic của Chế độ xem để triển khai cụ thể Chế độ xem.

Một số Triển khai có thể có của các ViewResolver là:

Khi DispatcherServlet xác định chế độ xem sẽ hiển thị kết quả, nó sẽ được hiển thị dưới dạng phản hồi.

Cuối cùng, DispatcherServlet trả lại đối tượng Response cho khách hàng.

12
  • Các DispatcherServlet khung Spring Web MVC là một thực hiện FrontController và là một thành phần Java Servlet. tức là, nó là một mặt trước servlet cho ứng dụng Spring Web Mvc.

  • Bộ điều phốiServlet t là các lớp FrontController nhận tất cả yêu cầu ứng dụng khách HTTP đến cho ứng dụng mvc của Web mùa xuân.

  • DispatcherServlet chịu trách nhiệm khởi tạo khung mvc web mùa xuân cho ứng dụng của chúng tôi và servlet được triển khai như một loại phụ của HttpServlet giống như bất kỳ Servlet nào khác.

  • DispatcherServlet cũng yêu cầu phải được cấu hình trong ứng dụng web của chúng tôi giống như bất kỳ khác Servlet ví dụ, mô tả triển khai ứng dụng web (web.xml)

Chúng ta có thể cấu hình các thông số khởi tạo để thay đổi hành vi của DispatcherServlet liên quan đến việc định vị các tệp cấu hình XML đậu mùa xuân và khởi tạo ngữ cảnh ứng dụng.

  • Dưới đây hình ảnh mô tả mọi thứ về DispatcherServlet enter image description here
10

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):

enter image description here

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).

Các vấn đề liên quan