Lekce 3 - Úvod do MVC architektury ve Spring Bootu
V předchozí lekci, Vytvoření Spring Boot projektu v Javě, jsme si připravili vývojové prostředí pro Spring Boot a nainstalovali si plugin Lombok. Také jsme poprvé spustili náš projekt.
Spring framework je postavený na MVC architektuře. Ta je velmi oblíbená na webu, ačkoli původně vznikla na desktopech. Je součástí populárních webových frameworků, jakými jsou kromě Spring Boot např. Symfony nebo Laravel pro PHP. Osobně si bez něj (nebo nějakého podobného principu) nedokáži představit složitější web.
Motivace
Základní myšlenkou MVC architektury je oddělení logiky od výstupu. Řeší tedy problém tzv. "špagetového kódu", kdy máme v jednom souboru (třídě) logické operace a zároveň renderování výstupu. Soubor tedy obsahuje databázové dotazy, logiku (Java kód) a různě poházené HTML tagy. Vše je zamotané do sebe jako špagety.
Kód se samozřejmě špatně udržuje, natož rozšiřuje. Je špatně highlightovaný, protože si s ním IDE neví rady, HTML není správně naformátováno, ztrácíme se v jeho stromové struktuře. Naším cílem je, aby zdrojový kód s logikou vypadal jako zdrojový kód v Javě a výstup vypadal jako HTML stránka s co nejmenší příměsí dalšího kódu.
Komponenty
Celá aplikace je rozdělena na komponenty 3 typů, hovoříme o:
- Modelech,
- View (pohledech) a
- Controllerech (kontrolerech).
Z toho také vychází název MVC. Označení pohled se budu snažit vyhýbat, protože mi přijde matoucí, že takto přeložené nekoresponduje s písmenem V. Neexistuje žádná striktní definice architektury a tak se můžete setkat s více výklady. My se zaměříme na ten nejrozšířenější.
Pojďme si jednotlivé komponenty nejprve popsat.
Model

Model obsahuje logiku a vše, co do ní spadá. Mohou to být výpočty, databázové dotazy, validace a podobně. Pro nás to znamená, že modely jsou klasické Java třídy, jako jsme je znali doposud. Model vůbec neví o výstupu. Jeho funkce spočívá v přijetí parametrů zvenku a vydání dat ven. Zdůrazněme, že parametry nemyslíme URL adresu ani žádné jiné parametry od uživatele, ale parametry metod ve třídě modelu. Model neví, odkud data v parametrech přišla a ani jak budou výstupní data zformátována a vypsána.
V kurzu budeme používat ORM (objektově relační mapování), modely potom
přímo korespondují s databázovými tabulkami. Máme tedy model
User
, Comment
nebo Article
. Instance
modelů obsahují samozřejmě vlastnosti z databáze. Např. instance modelu
User
má vlastnost name
. Třídě můžeme definovat
instanční metody, např. takovou, která vypočítá věk uživatele podle
jeho data narození. Modely mohou být také služby, např.
CalculatorService
.
Nyní máme představu, co model vykonává, pojďme se podívat na pohled.
View

Pohled (View) se stará o zobrazení výstupu uživateli.
Jedná se o HTML šablonu, obsahující HTML stránku a
tagy speciálního jazyka, který umožňuje do šablony
vkládat proměnné, případně provádět iterace (cykly) a podmínky. Pohled
user.html
tedy vypíše detaily o uživateli, pohled
article.html
vypíše obsah článku.
Pohledů máme mnoho, např. pro funkcionalitu s entitou uživatele:
registration.html
, login.html
,
profile.html
a podobně. Pohled profile.html
je ale
již společný všem uživatelům a jsou do něj posílána různá data, vždy
podle toho, koho zrovna zobrazujeme. Tato data jsou poté dosazena do HTML
elementů šablony.
Šablony lze samozřejmě vkládat do sebe, abychom se neopakovali (šablona s layoutem stránky, šablona s menu a šablona článkem).
View není jen šablona, ale zobrazovač výstupu. Obsahuje tedy minimální množství logiky, která je pro výpis nutná (např. kontrola, zda si uživatel vyplnil přezdívku před jejím vypsáním nebo cyklus s komentáři, které se vypisují).
View podobně jako Model vůbec neví, odkud mu data přišla, stará se jen o jejich zobrazení uživateli.
Controller

Controller je nyní onen chybějící prvek, který osvětlí funkčnost
celé architektury. Jedná se o jakéhosi prostředníka, se
kterým komunikuje uživatel, model i view. Drží tedy celý systém pohromadě
a komponenty propojuje. Jeho funkci pochopíme z ukázky
životního cyklu stránky. Nejčastěji má každá entita jeden controller,
máme tedy UserController
, ArticleController
a tak
podobně.
Životní cyklus stránky
Životní cyklus zahajuje uživatel, který
zadá do prohlížeče adresu webu a
parametry, kterými nám sdělí, kterou podstránku si přeje
zobrazit. Budeme chtít zobrazit detail uživatele s id 15
.
Udělejme si ukázku URL adresy:
http://www.domena.cz/user/detail/15
Požadavek jako první zachytí tzv. router. Ten podle parametrů pozná, který controller voláme.
Daný controller podle parametrů pozná, co se po něm chce, tedy že má zobrazit detail uživatele. Zavolá model, který uživatele vyhledá v databázi a vrátí jeho údaje. Dále zavolá další metodu modelu, která např. vypočítá věk uživatele. Tyto údaje si controller ukládá do proměnných. Nakonec vyrenderuje view (pohled). Název pohledu poznáme podle akce, kterou provádíme. View jsou předány proměnné s příslušnými daty. Controller tedy poslechl uživatele, obstaral podle parametrů dotazu data od modelu a předal je view.
View přijme data od controlleru a vloží je do
připravené šablony. Hotová stránka je zobrazena uživateli, který často o
celé této kráse ani netuší
Celou situaci můžeme znázornit diagramem:

Získali jsme tedy oddělení logiky od výstupu, view jsou jako HTML soubory, modely zas v Javě. Dosáhli jsme přehlednosti kódu, který je logicky rozčleněný.
MVC architektura nám usnadňuje i myšlení při vývoji projektu. Když píši logiku, patří do modelu, formátování a stylování výstupu řeším v šabloně, to co uživatel chce z parametrů zjišťuji v controlleru. 3 různé problémy na 3 různých místech, oddělené tak, aby do sebe nezasahovaly a nedělaly nám vývoj složitější.
V další lekci, Mapping (routing) v Java Spring Boot, si vytvoříme první menší aplikaci. Bude umět vygenerovat náhodné číslo, pozdraví uživatele jeho jménem a také se naučíme používat mapping.
Komentáře
Zatím nikdo nevložil komentář - buď první!