Spring MVC: ogólny zarys


Jak sama nazwa wskazuje, Spring MVC opiera swoje działanie o wzorzec architektoniczny Model View Controller. Zakłada on oddzielenie widoku od danych, które są do niego przekazywane, oraz z niego pobierane. Zadaniem natomiast kontrolera jest poprawne sparowanie obu.

Przepływ danych jest dwukierunkowy, tj. z widoku wysyłane są żądania http na back-end, coś się zmienia, następnie po odświeżeniu przeglądarki, wraca na widok. Po nieco więcej o MVC możesz zerknąć tutaj.

Magia i Spring

Spring MVC to moduł (spring-webmvc), służący do tworzenia aplikacji webowych, będący częścią ‘kombajnu’ nazywanego Spring Framework. W dużym uproszczeniu Spring składa się z modułów, natomiast moduły, na gotowe do użycia komponenty, które są ładowane wraz z uruchomieniem aplikacji do kontenera Spring. Pisząc tworzysz swoje własne komponenty, które są również przekazywane do kontenera, a następnie poprzez mechanizm wstrzykiwania zależności (ang. Dependency Injection) kontrolujesz wymianę danych pomiędzy nimi. Masz też oczywiście, jak wspomniałem, do wykorzystania komponenty spełniające określone zadania, a napisane przez twórców Frameworka. Nawet jeżeli z nich świadomie nie korzystasz, to część z nich działa i komunikuje się ze sobą, bez twojej wiedzy.   

Cytat:
“Podstawową cegiełką budulcową aplikacji zgodnych z architekturą Spring są komponenty JavaBean. Jak się okazuje, przy niewielkim wsparciu ze strony kontenera Spring większość złożonej i zaawansowanej funkcjonalności może być osiągnięte przez wykorzystanie współpracujących ze sobą i komunikujących się komponentów JavaBean.”
Architektura Spring dr hab. inż. Mikołaj Morzy

Na ten moment Spring Framework jest dla mnie bardzo skomplikowaną strukturą, składającą się z wielu klas i interfejsów, napisanych z wykorzystaniem zaawansowanych technik Java, oraz umożliwiającą budowę dowolnego systemu informatycznego 😉 . No i aktualnie uczę się podstawowych zasad, oraz jak z tego korzystać. Zauważyłem też, że w odniesieniu do działania tego frameworka dość często można się spotkać z określeniem ‘magia’. Nawet w tekstach doświadczonych programistów, z czym się nie raz spotkałem lub przy okazji nazw artykułów takich ten: The magic of Spring Data. Można więc na pocieszenie dla początkujących i jeszcze kiepsko zorientowanych w temacie, jak ja, wyciągnąć taki wniosek, że wszystkiego raczej nikt nie wie, a to czego rozum nie przenika ale działa, jest magią. 

Servlety i DispatcherServlet – centralny komponent Spring MVC

Takim podstawowym pojęciem, które łączy się z programowaniem webowym w Java, z użyciem Spring MVC, jest servlet. Servlety to klasy Java, których obiekty są zdolne do obsługi żądań HTTP. W Spring MVC takim centralnym servletem jest DispatcherServlet, wszystkie requesty HTTP przez niego przechodzą. 

Cytat:
The Spring DispatcherServlet… It is the heart of the Spring Web MVC framework. This core component receives all requests to your application.”
How Spring MVC Really Works By Eugen ParaschiveDZone 11-07-2017

Jak sama nazwa mówi, DispatcherServlet jest takim dyspozytorem, gdyż o ile zajmuje się obsługą żądań, to poza tym resztę zadań oddelegowuje do innych komponentów, takich jak HandlerMapping, czy ViewResolver. Ma on też pewną hierarchię dziedziczenia, w okrojonej wersji wygląda to tak:

public abstract class GenericServlet implements Servlet {
   
    public abstract class HttpServlet extends GenericServlet {
   
        public abstract class HttpServletBean extends HttpServlet {
  
            public abstract class FrameworkServlet extends HttpServletBean {
  
                public class DispatcherServlet extends FrameworkServlet {

Jak widać na samym początku hierarchii znajduje się interfejs Servlet. Jego kluczową metodą odpowiedzialną za obsługę żądań HTTP jest service(). Przyjmuje ona dwa argumenty dla żądania i odpowiedzi HTTP.

public void service(ServletRequest req, ServletResponse res)
            throws ServletException, IOException;

Dochodząc więc do sedna można powiedzieć, że sensu stricto servletami są właśnie klasy implementujące interfejs Servlet, co umożliwia im przyjmowanie i przetwarzanie żądań HTTP za pomocą metody service().

Kontener servletów

Trudno przy okazji servletów choćby nie wspomnieć o elemencie warunkującym ich działanie, oraz w ogóle aplikacji webowych Java, a mowa o kontenerze servletów. Jednym z nich jest Apache Tomcat. Jest on serwerem HTTP oraz kontenerem servletów, a jego zadaniem jest obsługa kierowanych do nich żądań HTTP. Jak czytałeś coś wcześniej o kodach HTTP zwracanych przez serwer HTTP, to w przypadku aplikacji Java jest on chyba aktualnie najczęściej tym właśnie odpowiadającym serwerem. Jest on również domyślnie dostarczony ze Spring Boot jako embedded, czyli w zasadzie nic na starcie nie trzeba z nim robić, po prostu działa.

Spring Boot je cudo !

Korzystanie z komponentów Spring, wiąże się również z niełatwą dla początkującego kwestią ich poprawnej konfiguracji. Ja jestem początkujący i nie używałem Spring Framework przed Spring Boot, a z nim właśnie przyszły startery z domyślną konfiguracją dla każdej zaimportowanej klasy znajdującej się na classpath projektu. Nie za wiele więc też wiem o konfiguracji manualnej komponentów springowych takich jak powyższy DispacherServlet lub serwera Tomcat. Wcześniej nawet jeżeli korzystałeś z domyślnych tzw. strategii działania tego komponentu, umieszczonych w pliku DispatcherServlet.properties, to w wersji minimum i tak zdaje się trzeba było wspomnieć o nim w pliku web.xml. Jak to mniej więcej wyglądało można zerknąć przykładowo in here

Z mojego punktu widzenia, tj. osoby wdrażającej się, z używaniem Spring Boot łączą się dwie kwestie:

  1. Brak konieczności wykonania odrzucającej na początku i wymagającej wiedzy konfiguracji, znacząco obniża punkt wejścia w technologię Spring Framework. No a dla doświadczonych programistów, którzy musieli zwykle przechodzić i pewnie wielokrotnie powielać sporą część tej konfiguracji to jak myślę po prostu usprawnienie dla ich pracy.
  2. Jednakże brak konieczności ręcznej konfiguracji pozwala też osobie początkującej na brak informacji o najbardziej podstawowych rzeczach, że w ogóle są. W zasadzie nie musisz na początku wiedzieć nic, o tym co się dzieje pod spodem, by coś działającego napisać – magia.

Z punktu drugiego więc wzięła się moja próba przeanalizowania w kolejnym wpisie, chociaż z grubsza, tego co się dzieje gdy aplikacja oparta o Spring MVC, otrzymuje żądanie HTTP.

Jeżeli wchodzisz dopiero w temat i nie do końca się orientujesz czym jest Spring Boot, to poniższy link będzie myślę dobrym wprowadzeniem. Konferencja może nie najnowsza ale dla mnie to był wartościowy materiał.

Warning! Tego nie pisał programista, ale dev-wannabe. Jak coś poknociłem, chętnie się o tym dowiem.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *