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)
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).
Ś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
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
Czy potrzebujemy pliku xml "Dispatcher Servlet' przy korzystaniu z" @ RestController "opartego na adnotacjach? – viper