Spring Web MVC, znany także jako Spring MVC, to zaawansowany framework webowy, który stanowi integralną część Springa.
O jego bogactwie i złożoności można by napisać obszerną książkę, ilustrującą pełen zakres jego
możliwości.
Niemniej naszym celem jest przedstawić Ci najistotniejsze i najczęściej używane aspekty Spring MVC.
Otrzymasz tutaj kluczową wiedzę, która umożliwi Ci stworzenie zaawansowanej aplikacji webowej, podobnej do aplikacji
StartAPPa.
W tym rozdziale skoncentrujemy się na najistotniejszych elementach frameworka. Warto jednak pamiętać, że pewne
zagadnienia zostaną omówione bardziej szczegółowo na innych stronach naszego kursu. Mocno zachęcamy do zapoznania
się z nimi, co pozwoli na głębsze zrozumienie omawianych tematów.
Kluczowe funkcjonalności Spring MVC:
-
Dyspozytor Serwletu (DispatcherServlet)
Zanim technologia Spring stała się powszechna, w świecie aplikacji webowych dominował model
oparty na licznych serwletach, co było traktowane jako branżowy standard. Po wprowadzeniu
Springa na rynek, pojawiło się nowe podejście do tworzenia aplikacji webowych,
polegające na wykorzystaniu pojedynczego serwletu oraz jego 'dyspozytora', znanego jako
DispatcherServlet.
Zgodnie ze specyfikacją serwletów DispatcherServlet musi zostać zadeklarowany
i zmapowany za pomocą konfiguracji Java bądź w pliku web.xml.
I teraz uwaga! Korzystając ze Spring Boot-a z szablonem startowym spring-boot-starter-web nie musisz posiadać pliku web.xml,
ani dodatkowej konfiguracji w Javie. Wystarczy, że dodasz spring-boot-starter-web do projektu, a Spring sam będzie wiedział o co chodzi, zgodnie z hasłem "Keep it simple".
-
Mapowanie żądań (Request Mapping)
Funkcjonalność umożliwia odwzorowanie żądań na konkretne metody kontrolerów. Bazową adnotacją jest tutaj @RequestMapping,
która jeszcze do niedawna była powszechnie używana w projektach (nawet obecnie adnotacja ta ciągle jest potrzebna w niektórych przypadkach, ale o tym później).
Wraz z wersją 4.3 Springa (zobacz Wersje Springa)
wprowadzone zostały wygodniejsze w użyciu dedykowane adnotacje opakowujące @RequestMapping:
- @GetMapping - obsługuje żądania wykonywane metodą GET
- @PostMapping - obsługuje żądania wykonywane metodą POST
- @PutMapping - obsługuje żądania wykonywane metodą PUT
- @DeleteMapping - obsługuje żądania wykonywane metodą DELETE
- @PatchMapping - obsługuje żądania wykonywane metodą PATCH
Adnotacje te omawiamy nieco szerzej w artykule: Spring MVC: Mapowanie requestów HTTP
-
Metody obsługi żądań (Handler methods)
Wspomniane wyżej adnotacje spowodują, że żądanie HTTP trafi do właściwej metody zdefiniowanej w odpowiednim kontrolerze. Natomiast w tym miejscu należy zadać pytanie
co się dzieje dalej? Jak dobrać się do danych, które zostały wysłane w ramach żądania? Odpowiedź polega na przedstawieniu kilku innych elementów funkcjonujących w Springu,
które wspierają programistę w uzyskiwaniu dostępu do danych. Mowa tu o adnotacjach, które możemy stosować w obrębie metod oznaczonych adnotacjami typu @RequestMapping i
które można podzielić na dwie kategorie: argumenty metod oraz zwracane wartości metod. Oto najczęściej używane z nich:
Argumenty metod
- @RequestParam - obsługuje parametr typu query param (parametry nazwane w ścieżce: "?nazwa_parametru=wartosc")
- @PathVariable - obsługuje parametr typu path param (poprzez szablonowe zmienne URI: "/{nazwa_zmiennej}")
- @RequestBody - obsługuje body żądania (konwertuje zawartość body żądania HTTP do konkretnego typu argumentu metody)
- @RequestPart - obsługuje obiekt "w częściach" (dostęp do części w ramach żądania multipart/form-data)
Zwracane wartości metod
- @ResponseBody - obsługuje body odpowiedzi (konwertuje typ argumentu do body odpowiedzi HTTP)
Adnotacje te omawiamy szerzej w artykule: Spring MVC - Mapowanie danych w requestach HTTP
-
Obsługa wyjątków (Exceptions handling)
Nie byłoby frameworka MVC bez obsługi błędów (tak jak nie byłoby projektów IT, gdyby dla każdego z nich nie działał dedykowany - choćby skromny - support team rozwiązujący zgłaszane problemy).
Jakie zatem błędy mogą się pojawić na naszej drodze podczas pracy z aplikacją? W zasadzie dowolne. Od błędów natury programistycznej po błędy w interpretacji żądań, problemy
z wysyłanymi parametrami, czy też np. z uwierzytelnieniem w systemie, bądź autoryzacją w dostępie do jego zasobów.
Wszystkie takie problematyczne sytuacje wypadało by obsłużyć i właśnie
po to została stworzona w Springu adnotacja @ExceptionHandler, która służy do oznaczania metod odpowiedzialnych za odpowiednią obsługę błędów.
Możemy definiować handlery per kontroler albo też zbiorczo dla grupy kontrolerów. O tym jednak już w następnym punkcie.
-
Porady dla kontrolerów (Controller Advice)
Funkcjonalności takie jak np. obsługa błędów za pomocą annotacji @ExceptionHandler mogą być zrealizowane przekrojowo
dla wszystkich (lub wybranych) kontrolerów w naszej aplikacji. Jeśli zatem chcemy wprowadzić jeden spójny model obsługi wyjątków dla całej aplikacji,
to możemy w tym celu stworzyć klasę opisaną adnotacją @ControllerAdvice. Taka klasa pozwoli nam na zdefiniowanie metod
opisanych adnotacją @ExceptionHandler, gdzie każda z tych metod będzie odpowiedzialna za dostarczenie odpowiedniej obsługi
dla przechwytywanego typu wyjątku.
Rekomendacja
W artykule wspomnieliśmy o tym, że nie potrzebujemy używać web.xml w projektach.
Jednakże, istnieją sytuacje, kiedy dynamiczna konfiguracja za pomocą web.xml może być pożądana, na
przykład w celu wprowadzania zmian bez konieczności ponownego wdrażania aplikacji (deploymentu).
W takim przypadku, stosowanie web.xml jest w pełni uzasadnione.
Warto również podkreślić, że stosowanie web.xml może być skutecznie połączone z użyciem Spring Boot.
Możliwe jest zbudowanie aplikacji bazującej na Spring Boot, do której w procesie wdrażania dodajemy
odpowiednio skonfigurowany plik web.xml.
W takim pliku mogą być umieszczone ustawienia specyficzne dla całego serwera, a nie tylko dla pojedynczej aplikacji.
Praktyka
Wszystkie kursy Spring oparte są u nas o Spring Boota i zawierają szablon startowy
spring-boot-starter-web, co powoduje, że
z automatu otrzymujemy funkcjonalności frameworka Spring MVC. Wielokrotnie używamy adnotacji takich jak
@GetMapping,
@PostMapping,
czy też
@PathVariable itp. Za przykład niech posłuży tu choćby klasa
ItemController:
Oczywiście, zgodnie z tym co zostało napisane w bieżącym rozdziale, w każdym kursie znajdziesz również klasę zarządzającą obsługą wyjątków
CustomExceptionHandler
(korzysta z adnotacji
@ControllerAdvice).
Autor: Jarek Klimas
Data: 03 stycznia 2024
Labele: Backend, Podstawowy, Java
Czy informacje, które otrzymałeś, były pomocne?
Jeśli tak, zapraszam Cię do podarowania mi kawy.
Topowe Materiały
Spring IO: Spring Framework - Spring MVC
Spring IO: Web MVC framework
Baeldung: Spring MVC Tutorial
Baeldung: An Intro to the Spring DispatcherServlet
Udemy: [NEW] Spring Boot 3, Spring 6 & Hibernate for Beginners — polskie napisy