Spring Framework - Spring MVC

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:
@RestController
@Validated
@RequestMapping("/api/appaform/appaitems")
public class ItemController {

    public ItemController(ItemService appaItemService) {
        this.appaItemService = appaItemService;
    }

    @PostMapping
    public ResponseEntity saveOrUpdateAppaItem(
            @Valid @RequestPart ItemRequestDTO appaItemRequestDTO...) {

        ...
        
        return new ResponseEntity(new ItemIdResponseDTO(appaItemId), HttpStatus.OK);
    }

    @GetMapping
    public ResponseEntity> getAppaItems() {

        ...
        
        return new ResponseEntity>(appaItemResponseDTOs, HttpStatus.OK);
    }

    @GetMapping("/{id}")
    public ResponseEntity getAppaItem(@PathVariable Long id) {

        ...
        
        return new ResponseEntity(appaItemResponseDTO, HttpStatus.OK);
    }

}
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).
Zdjęcie autora
Autor: Jarek Klimas
Data: 03 stycznia 2024
Labele: Backend, Podstawowy, Java
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

Stale się rozwijamy, a więc bądź na bieżąco!
Na ten adres będziemy przesyłać informacje o ważniejszych aktualizacjach, a także o nowych materiałach pojawiających się na stronie.
Polub nas na Facebooku:
Nasi partnerzy: stackshare
Javappa to również profesjonalne usługi programistyczne oparte o technologie JAVA. Jeśli chesz nawiązać z nami kontakt w celu uzyskania doradztwa bądź stworzenia aplikacji webowej powinieneś poznać nasze doświadczenia.
Kliknij O nas .


Pozycjonowanie stron: Grupa TENSE