2010-05-04 9 views
134

W tym obrazie (które dostałem od here), HTTP żądanie wysyła coś do dyspozytora serwletu.Co to jest serwlet Dispatcher na wiosnę?

enter image description here

moje pytanie jest, co robi Dyspozytor Servlet zrobić?

Czy jest to coś w rodzaju pobierania informacji zrzucanych ze strony internetowej i przesyłania jej do kontrolera?

Odpowiedz

148

Zadaniem DispatcherServlet jest podjęcie przychodzące URI i znaleźć właściwą kombinację koparki (ogólnie metod na Controller klas) i poglądów (ogólnie JSP), które łączą się tworząc stronę lub zasób, który powinien znaleźć się w tej lokalizacji.

mógłbym

  • plik /WEB-INF/jsp/pages/Home.jsp
  • i metoda w klasie

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

Dyspozytor aplet jest nieco, że "wie" wywołać tę metodę, gdy przeglądarka wymaga estuje stronę i łączy jej wyniki z pasującym plikiem JSP, aby utworzyć dokument HTML.

Sposób, w jaki się to odbywa, różni się w zależności od konfiguracji i wersji Spring.

Nie ma również powodu, aby końcowym wynikiem były strony internetowe. Może to zrobić tak samo, aby zlokalizować punkty końcowe RMI, obsłużyć żądania SOAP, wszystko, co może wejść w serwlet.

+2

Świetna riposta, teraz pytanie, w jaki sposób DispatcherServlet identyfikuje również nazwę klasy i nazwę metody. Czy możesz pokazać mi przykład konfiguracji, w której mam dwie klasy i dwie nazwy metod oraz jak DispatcherServlet przechwytuje właściwe żądanie. – Kevin

+8

To faktycznie skanuje ścieżkę klasy podczas uruchamiania dla tej adnotacji i odwzorowuje "/pages/Home.html" na metodę klasy +. Gdybyś miał dwie metody, które obie miały "/pages/Home.html" bez żadnych innych ograniczeń w ich adnotacji, byłby to błąd i spowoduje rzucenie wyjątków. Możesz także połączyć go z XML, jeśli jesteś oldschool. – Affe

+0

Czy potrzebujemy pliku xml "Dispatcher Servlet' przy korzystaniu z" @ RestController "opartego na adnotacjach? – viper

39

DispatcherServlet jest wiosenną implementacją MVC front controller pattern.

Zobacz opis na wiosnę docs here.

Zasadniczo jest to aplet, który przyjmuje przychodzące żądanie i przekazuje przetwarzanie tego żądania do jednego z wielu programów obsługi, których mapowanie jest specyficzne dla konfiguracji DispatcherServlet.

+0

Czy jest to coś w rodzaju wydarzeń w programie Flex, w których wysyłam zdarzenia z jednego MXML do drugiego lub do serwera. Czy mogę mieć więcej niż jeden serwer DispatcherService w mojej aplikacji. Czy pliki klas mają oddzielny serwer DispatcherServlet. – Kevin

+0

Zwykle jest tylko jeden kontroler frontowy. Jest to niezależne od posiadanych modeli i widoków. Po prostu łączy ze sobą określone modele i widoki. – BalusC

+2

@theband: Ty * możesz * mieć wiele 'DispatcherServlets', jeśli twoja architektura ma więcej sensu w ten sposób, ale zazwyczaj nie ma powodu, aby to robić. – skaffman

5

Możemy powiedzieć jak DispatcherServlet dbanie o wszystko na wiosnę MVC.

Na pojemniku internetowej uruchomić:

  1. DispatcherServlet zostanie załadowany i zainicjowany przez wywołanie metody init()
  2. init() od DispatcherServlet spróbuje zidentyfikować konfiguracji dokumentu Wiosna z konwencjami nazewnictwa jak "servlet_name-servlet.xml" Wtedy wszystko ziarna można zidentyfikować.

Przykład:

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

więc w ogólnie DispatcherServlet życzenie przechwytywania URI i przekazać HandlerMapping. HandlerMapping Fasola mappingowania wyszukiwania z metodą kontrolera, gdzie kontroler zwraca nazwę logiczną (widok). Następnie ta logiczna nazwa jest wysyłana pod numer DispatcherServlet przez HandlerMapping. Następnie DispatcherServlet powiedz ViewResolver, aby podać pełną lokalizację widoku, dodając prefiks i sufiks, a następnie DispatcherServlet przekazać widok klientowi.

+0

To miłe wyjaśnienie. Twój numer 2 mówi, że DispatcherServlet spróbuje zidentyfikować Dokument konfiguracji Spring z konwencjami nazewnictwa, takimi jak "servlet_name-servlet.xml". Widziałem jednak projekty, które używały nazwy, takie jak "dispatcher", i działają dobrze. Ja też tego próbowałem. Ale nie wiem dlaczego? –

27

Wiosną MVC wszystkie przychodzące żądania przechodzą przez pojedynczy serwlet. Ten serwlet - DispatcherServlet - jest kontrolerem frontowym. Sterownik frontowy to typowy wzorzec projektowania w tworzeniu aplikacji internetowych. W takim przypadku pojedynczy serwlet odbiera wszystkie żądania i przesyła je do wszystkich innych składników aplikacji.

Zadaniem urządzenia DispatcherServlet jest wysłanie żądania do określonego kontrolera Spring MVC.

Zazwyczaj mamy wiele kontrolerów i DispatcherServlet odnosi się do jednego z następujących elementów odwzorowujących w celu określenia kontrolera docelowa:

Jeśli konfiguracja nie jest wykonywana, DispatcherServlet wykorzystuje BeanNameUrlHandlerMapping i DefaultAnnotationHandlerMapping domyślnie.

Po zidentyfikowaniu kontrolera docelowego DispatcherServlet wysyła do niego żądanie. Sterownik wykonuje pewną pracę zgodnie z żądaniem (lub przekazuje go innym obiektom) i wraca z powrotem do DispatcherServlet wraz z Modelem i nazwą Widoku.

Nazwa widoku jest tylko nazwą logiczną. Ta nazwa logiczna jest następnie używana do wyszukiwania rzeczywistego widoku (aby uniknąć sprzężenia ze sterownikiem i określonym widokiem). Następnie DispatcherServlet odnosi się do ViewResolver i odwzorowuje logiczną nazwę widoku na konkretną implementację widoku.

Możliwe Implementacje ViewResolver są:

Gdy DispatcherServlet określa widok, który wyświetli wyniki, zostanie wyświetlony jako odpowiedź.

Wreszcie, DispatcherServlet zwraca obiekt Response z powrotem do klienta.

12
  • DispatcherServlet od Spring Web MVC ram jest implementacja FrontController i jest składnikiem Java Servlet. tj. jest to front serwletu dla aplikacji Spring Web Mvc.

  • DispatcherServlet t zajęcia FrontController który odbiera wszystkie przychodzące żądania klienta HTTP na wiosnę internetowej mvc appliaction.

  • DispatcherServlet jest odpowiedzialny za inicjowanie wiosna internetowej mvc ramy dla naszej aplikacji i jest realizowany jako aplet podtypu HttpServlet podobnie jak każdej innej serwletu.

  • DispatcherServlet wymagane również być skonfigurowane w naszej internetowej aplikacji, jak każdy inny, czyli Servlet deskryptora wdrażania aplikacji WWW (web.xml)

Możemy skonfigurować parametry inicjalizacji do zmiany zachowań serwera DispatcherServlet w odniesieniu do lokalizowania plików konfiguracyjnych XML fasoli Spring i inicjowania kontekstu aplikacji.

  • Poniżej obrazek opisać wszystko o DispatcherServlet enter image description here
10

Wiem, że to pytanie jest oznaczone jako już rozwiązany, ale chcę dodać nowszą obraz wyjaśniający ten wzór w szczegółach (źródło: Wiosna w akcji 4)

enter image description here

Objaśnienie

Gdy żądanie opuszcza przeglądarkę (1), przenosi informacje o tym, o co prosi użytkownik. Przynajmniej żądanie będzie zawierać żądany adres URL. Może jednak zawierać również dodatkowe dane, takie jak informacje przesłane w formularzu przez użytkownika.

Pierwszy przystanek podczas podróży zapytania znajduje się w Spring DispatcherServlet. Podobnie jak większość frameworków internetowych opartych na Javie, Spring MVC konwertuje żądania przez pojedynczy serwlet kontrolera frontowego. Kontroler frontowy to powszechny wzorzec aplikacji WWW, w którym pojedynczy serwlet deleguje odpowiedzialność za żądanie do innych komponentów aplikacji w celu wykonania faktycznego przetwarzania. W przypadku Spring MVC, DispatcherServlet jest kontrolerem frontowym. Zadaniem DispatcherServlet jest wysłanie żądania do kontrolera Spring MVC. Kontroler jest składnikiem sprężynowym, który przetwarza żądanie. Ale typowa aplikacja może mieć kilka kontrolerów, a DispatcherServlet potrzebuje pomocy w wyborze kontrolera, do którego wysłano żądanie. Tak więc DispatcherServlet konsultuje się z jednym lub wieloma mapowaniem procedur obsługi ((2), aby dowiedzieć się, gdzie będzie następny przystanek tego żądania. Mapowanie programu obsługi zwraca szczególną uwagę na adres URL przenoszony przez żądanie podczas podejmowania decyzji. Po wybraniu odpowiedniego kontrolera, DispatcherServlet wysyła żądanie na swój wesoły sposób do wybranego kontrolera: (3). W kontrolerze żądanie zrzuca jego ładunek (informacje przekazane przez użytkownika) i cierpliwie czeka, podczas gdy kontroler przetwarza te informacje. (W rzeczywistości dobrze zaprojektowany kontroler wykonuje tylko niewielkie przetwarzanie lub wcale, a zamiast tego deleguje odpowiedzialność za logikę biznesową na jeden lub więcej obiektów usługowych.) Logika wykonywana przez kontroler często daje pewne informacje, które należy przenieść do użytkownika i wyświetlane w przeglądarce. Ta informacja jest określana jako model. Ale wysyłanie surowych informacji z powrotem do użytkownika nie jest wystarczające - musi być sformatowane w przyjaznym dla użytkownika formacie, zwykle HTML. W tym celu informacje muszą zostać przekazane do widoku, zazwyczaj strony JavaServer (JSP). Jedną z ostatnich rzeczy, które robi kontroler, jest spakowanie danych modelu i określenie nazwy widoku, który powinien renderować dane wyjściowe. Następnie wysyła żądanie wraz z modelem i nazwą widoku z powrotem do DispatcherServlet (4). Aby kontroler nie został połączony z określonym widokiem, nazwa widoku zwrócona do obiektu DispatcherServlet nie identyfikuje bezpośrednio określonej strony JSP. Nie musi to sugerować, że jest to strona JSP. Zamiast tego zawiera tylko nazwę logiczną, która będzie używana do wyszukiwania rzeczywistego widoku, który da wynik. Serwer DispatcherServlet konsultuje się z narzędziem do przekształcania widoku, aby mapować logiczną nazwę widoku do konkretnej implementacji widoku, która może ale nie musi być JSP. Teraz, gdy DispatcherServlet wie, który widok wyświetli wynik, zadanie żądania jest już prawie zakończone. Ostatnim punktem końcowym jest implementacja widoku (6), zazwyczaj strona JSP, w której dostarcza dane modelu. Zadanie zlecenia zostało w końcu wykonane.Widok będzie używał danych modelu do renderowania danych wyjściowych, które będą przenoszone z powrotem do klienta przez (niezbyt pracowity) obiekt odpowiedzi (7).