3. diel - Úvod do architektúry MVC v Spring Boote pre Kotlin
V predchádzajúcej lekcii, Vytvorenie Spring Boot projektu v Kotline sme si založili prvý projekt. Zoznámili sme sa s prostredím a funkciou webovej stránky.
V dnešnom Spring Boot tutoriále pre Kotlin sa zoznámime s výhodami a zmyslom MVC architektúry pre webové aplikácie. Popíšeme a vysvetlíme si používané termíny.
Základnou myšlienkou MVC architektúry je oddelenie logiky od výstupu. Rieši teda problém tzv. "špagetového kódu", kedy máme v jednom súbore (triede) logické operácie a zároveň renderovanie výstupu. Súbor teda obsahuje databázové otázky, logiku (napr. operácie v Kotline) a rôzne pohádzané HTML tagy. Všetko je zamotané do seba ako špagety.
Kód sa samozrejme zle udržuje, nieto ešte rozširuje. Je zle zvýraznený, pretože si s ním IDE nevie rady, HTML nie je správne naformátovaný, strácame sa v jeho stromovej štruktúre. Našim cieľom je, aby zdrojový kód s logikou vyzeral ako zdrojový kód v Kotline a výstup vyzeral ako HTML stránka s čo najmenšou prímesou ďalšieho kódu.
Komponenty MVC architektúry
Celá webová aplikácia je rozdelená do troch komponentov, ktoré tvoria tieto tri vrstvy:- Model
- View (Pohľad)
- Controller
Z tohto rozdelenia vznikol názov tejto architektúry.
Termínu pohľad sa budeme tu vyhýbať, pretože budeme používať anglické výrazy.
Komponenty sú triedy zdedené z abstraktných tried Model
,
View
a Controller
. Poďme si jednotlivé komponenty
najprv popísať.
Model
Model obsahuje logiku a vše, co do ní spadá. Mohou to být výpočty, databázové dotazy, validace a podobně. Model vůbec neví o výstupu. Jeho funkce spočívá v přijetí parametrů zvenku a vydání dat ven. Model neví, odkud data v parametrech přišla a ani jak budou výstupní data zformátována a vypsána.
Parametry není myšlena URL adresa, ani žádné jiné parametry od uživatele.
\--- V kurze budeme používať ORM (O
bjektovo- R elačné M apovanie), v ktorom
modely priamo korešpondujú s databázovými tabuľkami. Máme
teda model User
, Comment
alebo Article
.
Inštancie modelov obsahujú atribúty z databázy. Napr.
inštancia modelu User
môže mať atribút name
.
Modelu môžeme definovať inštančné metódy. Takouto
metódou môže byť napríklad metóda, ktorá vypočíta vek používateľa
podľa jeho dátumu narodenia.
View
View se stárá o zobrazení výstupu uživateli. Nejčastěji se jedná o HTML šablonu obsahující HTML stránku a tagy nějakého značkovacího jazyka. Tento nám pak umožňuje do šablony vkládat proměnné, případně provádět iterace (cykly) a podmínky.
Např. pohled user.html
vypíše detaily o
uživateli, pohled clanek.html
vypíše obsah článku.
\---
Pohľadov máme mnoho, napr. pre funkcionalitu s objektom
užívateľ: registration.html
,
login.html
, profile.html
a podobne. Pohľad
profile.html
je ale už spoločný všetkým
užívateľom a sú doň posielané rôzne dáta,
vždy podľa toho, koho práve zobrazujeme. Tieto dáta sú potom dosadené do
HTML elementov šablóny.
Šablóny je možné vkladať do seba, aby sme sa neopakovali (šablóna s rozložením stránky, šablóna s menu a šablóna článkom).
View nie je len šablóna, ale aj zobrazovač výstupu. Obsahuje teda minimálne množstvo logiky, ktorá je pre výpis nutná (napr. kontrola, či si užívateľ vyplnil prezývku pred jej vypísaním alebo cyklus s komentármi, ktoré sa vypisujú).
View podobne ako Model vôbec nevie, odkiaľ mu dáta prišli, stará sa len o ich zobrazenie užívateľovi.
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. Nejčastěji má
každá entita jeden controller, máme tedy UserController
,
ArticleController
a tak podobně.
Controller drží celý systém pohromadě a komponenty propojuje.
\---
Webová aplikácia a životný cyklus stránky
Pozrime sa na základné funkcionality webových aplikácií a životného cyklu webových stránok.Webová aplikácia
Najväčší "boom" webových aplikácií prišiel s rozmachom internetu, kedy bolo potrebné do pôvodne statických webových stránok zaniesť dynamické prvky. A preto po nespočte slepých uličiek a omylov, sa postupom času dosiahlo to, že sa webová stránka chová úplne rovnako, ako desktopová aplikácia. Takýmto webovým stránkam sa už hovorí webová aplikácia.Príkladom webovej aplikácie je napríklad Google Docs, online alternatíva k MS Office.
Webové aplikácie fungujú takto. Klient (napríklad počítač) sa spýta servera na určitý dokument. Na serveri beží program, ktorý dokáže vygenerovať do stránky to, čo používateľ požaduje. Stránka teda na serveri neexistuje, ale je dynamicky vytváraná podľa toho, čo používateľ potrebuje.
Technológia Spring Boot nám umožňuje takéto dynamické stránky na serveri vytvoriť.
Životný cyklus stránky
Životný cyklus začína užívateľ, ktorý zadá do prehliadača adresu webu a parametre, ktorými nám oznámi, ktorú podstránku si želá zobraziť. Napr. budeme chcieť zobraziť detail užívateľa s id15
. URL
adresa by bola nasledujúca:
http://www.domena.cz/user/detail/15
Požiadavka ako prvá zachytí tzv. router. Ten podľa
parametrov pozná, že voláme UserController
.
UserController
podľa parametrov detail
a
15
pozná, že voláme akciu (metódu) Detail
, ktorá
prijíma parameter 15
. Akcia Detail
zavolá
model, ktorý používateľa vyhľadá v databáze a vráti jeho
údaje. Ďalej zavolá ďalšiu metódu modelu, ktorá napr. vypočíta vek
používateľa. Tieto údaje si controller ukladá do
premenných. Nakoniec vygeneruje view, do ktorého odovzdá
premenné s príslušnými dátami.
Controller teda poslúchol užívateľa, obstaral podľa parametrov dotazu dáta od Modelu a odovzdal ich View.
Celú situáciu môžeme znázorniť diagramom:
Získali sme teda oddelenie logiky od výstupu, view sú ako HTML súbory, modely ako triedy v Kotline. Dosiahli sme prehľadnosť kódu, ktorý je logicky rozčlenený.
MVC architektúra nám uľahčuje aj myslenie pri vývoji projektu. Logiku píšeme do Modelu, formátovanie a štylovanie výstupu riešime vo View, to čo užívateľ chce zisťujeme z parametrov v Controlleri. 3 rôzne problémy na 3 rôznych miestach, oddelené tak, aby do seba nezasahovali a nerobili nám vývoj zložitejší.
V ďalšej lekcii, Mapping (routing) v Kotline Spring Boot , si vytvoríme prvú webovú aplikáciu s využitím architektúry MVC. Bude vedieť vygenerovať náhodné číslo, pozdraví používateľa v jeho mene a tiež sa naučíme používať mapping.