Blade - Kompletný sprievodca

1. Prehľad

Blade je malý rámec Java 8+ MVC postavený od nuly s ohľadom na niektoré jasné ciele: byť samostatný, produktívny, elegantný, intuitívny a super rýchly.

Jeho dizajn inšpirovalo veľa rôznych rámcov: Node's Express, Python's Flask a Golang's Macaron / Martini.

Blade je tiež súčasťou ambiciózne väčšieho projektu Let's Blade. Zahŕňa heterogénnu zbierku ďalších malých knižníc, od generovania Captcha po konverziu JSON, od šablónovania po jednoduché pripojenie k databáze.

V tomto tutoriáli sa však zameriame iba na MVC.

2. Začíname

Najskôr vytvorme prázdny projekt Maven a pridajme najnovšiu závislosť Blade MVC do pom.xml:

 com.bladejava blade-mvc 2.0.14. UVOĽNENIE 

2.1. Zväzovanie aplikácií Blade

Pretože bude naša aplikácia vytvorená ako JAR, nebude mať / lib priečinok, ako vo VOJNE. Vo výsledku nás to vedie k problému, ako zabezpečiť blade-mvc JAR spolu s akýmikoľvek ďalšími súbormi JAR, ktoré by sme mohli potrebovať, do našej aplikácie.

Rôzne spôsoby, ako to dosiahnuť, každý s výhodami a nevýhodami, sú vysvetlené v príručke Ako vytvoriť spustiteľný súbor JAR pomocou nástroja Maven.

Pre jednoduchosť použijeme Doplnkový modul Maven technika, ktorý exploduje všetky JAR importované v pom.xml a následne spojí všetky triedy do jedného uber-JAR.

2.2. Spustenie aplikácie Blade

Blade je založený na Netty, úžasný asynchrónny rámec sieťových aplikácií riadený udalosťami. Preto na spustenie našej aplikácie založenej na blade serveroch nepotrebujeme žiadny externý aplikačný server ani servletový kontajner; JRE bude stačiť:

java -jar target / sample-blade-app.jar 

Potom bude aplikácia prístupná na internetovej stránke // localhost: 9000 URL.

3. Pochopenie architektúry

Architektúra blade je veľmi jednoduchá:

Vždy sa riadi rovnakým životným cyklom:

  1. Netty dostane žiadosť
  2. Middlewares sú vykonávané (voliteľné)
  3. WebHooks sa vykonávajú (voliteľné)
  4. Vykoná sa smerovanie
  5. Odpoveď sa odošle klientovi
  6. Vyčistiť

Vyššie uvedené funkcie preskúmame v ďalších častiach.

4. Smerovanie

Stručne povedané, smerovanie v MVC je mechanizmus používaný na vytvorenie väzby medzi adresou URL a radičom.

Blade poskytuje dva typy trás: základnú a anotovanú.

4.1. Základné trasy

Základné trasy sú určené pre veľmi malý softvér, ako sú mikroslužby alebo minimálne webové aplikácie:

Blade.of () .get ("/ basic-Route-example", ctx -> ctx.text ("ZÍSKAJTE")). Post ("/ basic-Route-example", ctx -> ctx.text (" POST s názvom ")) .put (" / basic-route-example ", ctx -> ctx.text (" PUT nazvaný ")) .delete (" / basic-route-example ", ctx -> ctx.text (" DELETE nazvané ")) .start (App.class, args); 

Názov metódy použitej na registráciu trasy zodpovedá slovesu HTTP, ktoré sa použije na preposlanie žiadosti. Také jednoduché.

V tomto prípade vraciame text, ale môžeme tiež vykresliť stránky, ako uvidíme ďalej v tomto výučbe.

4.2. Komentované trasy

Pre realistickejšie prípady použitia určite môžeme pomocou anotácií definovať všetky potrebné trasy. Mali by sme na to použiť samostatné triedy.

Najskôr je potrebné vytvoriť radič prostredníctvom @ Cesta anotácia, ktorú Blade naskenuje počas spustenia.

Potom musíme použiť anotáciu trasy súvisiacu s metódou HTTP, ktorú chceme zachytiť:

@ Cesta verejná trieda RouteExampleController {@GetRoute ("/ Route-example") public String get () {return "get.html"; } @PostRoute ("/ route-example") public String post () {return "post.html"; } @PutRoute ("/ route-example") public String put () {return "put.html"; } @DeleteRoute ("/ route-example") public String delete () {return "delete.html"; }} 

Môžeme použiť aj jednoduché @ Route anotáciu a ako parameter zadajte metódu HTTP:

@Route (value = "/ another-route-example", method = HttpMethod.GET) public String anotherGet () {return "get.html"; } 

Na druhej strane, ak nezadáme žiadny parameter metódy, trasa zachytí každé volanie HTTP na túto adresu URL, bez ohľadu na sloveso.

4.3. Vstrekovanie parametrov

Existuje niekoľko spôsobov, ako odovzdať parametre na naše trasy. Poďme ich preskúmať na niekoľkých príkladoch z dokumentácie.

  • Parameter formulára:
@GetRoute ("/ home") public void formParam (@Param názov reťazca) {System.out.println ("meno:" + meno); } 
  • Upokojujúci parameter:
@GetRoute ("/ users /: uid") public void restfulParam (@PathParam Integer uid) {System.out.println ("uid:" + uid); } 
  • Parameter nahrávania súboru:
@PostRoute ("/ upload") public void fileParam (@MultipartParam FileItem fileItem) {byte [] súbor = fileItem.getData (); } 
  • Parameter hlavičky:
@GetRoute ("/ header") public void headerParam (@HeaderParam String referer) {System.out.println ("Referer:" + referer); } 
  • Parameter súboru cookie:
@GetRoute ("/ cookie") public void cookieParam (@CookieParam reťazec myCookie) {System.out.println ("myCookie:" + myCookie); } 
  • Parameter tela:
@PostRoute ("/ bodyParam") public void bodyParam (používateľ používateľa @BodyParam) {System.out.println ("používateľ:" + user.toString ()); } 
  • Parameter hodnotového objektu, ktorý sa volá zaslaním jeho atribútov na trasu:
@PostRoute ("/ voParam") verejné void voParam (používateľ používateľa @Param) {System.out.println ("používateľ:" + užívateľ.toString ()); } 

5. Statické zdroje

Blade môže tiež slúžiť statickým zdrojom, ak je to potrebné, jednoduchým vložením dovnútra / resources / static priečinok.

Napríklad src / main / resources / static / app.css bude k dispozícii na //localhost:9000/static/app.css.

5.1. Prispôsobenie ciest

Toto správanie môžeme vyladiť pridaním jednej alebo viacerých statických ciest programovo:

blade.addStatics ("/ custom-static"); 

Rovnaký výsledok je možné získať konfiguráciou úpravou súboru src / main / resources / application.properties:

mvc.statics = / custom-static 

5.2. Povolenie výpisu zdrojov

Môžeme povoliť zaradenie obsahu statického priečinka, čo je funkcia, ktorá je predvolene vypnutá z bezpečnostných dôvodov:

blade.showFileList (true); 

Alebo v konfigurácii:

mvc.statics.show-list = true 

Teraz môžeme otvoriť // localhost: 9000 / custom-static / na zobrazenie obsahu priečinka.

5.3. Používanie WebJars

Ako je vidieť v tutoriáli Úvod do WebJars, životaschopnou možnosťou sú aj statické prostriedky zabalené ako JAR.

Ostrie ich automaticky vystavuje pod / webjars / cesta.

Napríklad importujme Bootstrap do pom.xml:

 bootstrap org.webjars 4.2.1 

Vo výsledku bude k dispozícii pod //localhost:9000/webjars/bootstrap/4.2.1/css/bootstrap.css

6. HTTP požiadavka

Odkedy Blade nie je založený na špecifikácii servletu, objekty ako jeho rozhranie Žiadosť a jeho trieda HttpRequest sa mierne líšia od tých, na ktoré sme zvyknutí.

6.1. Parametre formulára

Pri čítaní parametrov formulára Blade vo veľkej miere využíva Java Voliteľné vo výsledkoch dotazovacích metód (všetky nižšie uvedené metódy vracajú an Voliteľné objekt):

  • dopyt (názov reťazca)
  • queryInt (názov reťazca)
  • queryLong (názov reťazca)
  • queryDouble (názov reťazca)

Sú tiež k dispozícii s náhradnou hodnotou:

  • Reťazcový dopyt (názov reťazca, reťazec defaultValue)
  • int queryInt (názov reťazca, int defaultValue)
  • long queryLong (názov reťazca, dlhá defaultValue)
  • double queryDouble (názov reťazca, dvojitá predvolená hodnota)

Parameter formulára môžeme načítať prostredníctvom vlastnosti automapped:

@PostRoute ("/ save") verejné neplatné formParams (používateľské meno @Param String) {// ...} 

Alebo z Žiadosť objekt:

@PostRoute ("/ save") public void formParams (požiadavka na požiadavku) {String username = request.query ("username", "Baeldung"); } 

6.2. Údaje JSON

Poďme sa teraz pozrieť na to, ako možno objekt JSON mapovať na POJO:

curl -X POST // localhost: 9000 / users -H 'Content-Type: application / json' \ -d '{"name": "Baeldung", "site": "baeldung.com"}' 

POJO (kvôli čitateľnosti anotované Lombokom):

verejná trieda Používateľ {@Getter @Setter súkromné ​​meno reťazca; @Getter @Setter súkromná stránka s reťazcami; } 

Hodnota je opäť k dispozícii ako vložená vlastnosť:

@PostRoute ("/ users") public void bodyParams (používateľ používateľa @BodyParam) {// ...} 

A z Žiadosť:

@PostRoute ("/ users") public void bodyParams (požiadavka na požiadavku) {String bodyString = request.bodyToString (); } 

6.3. RESTful parametre

Parametre RESTFul v pekných adresách URL, ako je localhost: 9000 / používateľ / 42 sú tiež občanmi prvej triedy:

@GetRoute ("/ user /: id") public void user (@PathParam Integer id) {// ...} 

Ako obvykle sa môžeme spoľahnúť na Žiadosť v prípade potreby objekt:

@GetRoute ("/ user") public void user (požiadavka na požiadavku) {Integer id = request.pathInt ("id"); } 

Rovnaká metóda je samozrejme k dispozícii aj pre Dlhé a String typy tiez.

6.4. Väzba údajov

Blade podporuje parametre väzby JSON aj Form a automaticky ich pripája k objektu modelu:

@PostRoute ("/ users") public void bodyParams (používateľ používateľa) {} 

6.5. Atribúty požiadavky a relácie

API na čítanie a zápis objektov v a Žiadosť a a Session sú krištáľovo čisté.

Metódy s dvoma parametrami, predstavujúcimi kľúč a hodnotu, sú mutátory, ktoré môžeme použiť na uloženie našich hodnôt v rôznych kontextoch:

Relácia session = request.session (); request.attribute ("request-val", "hodnota nejakej požiadavky"); session.attribute ("session-val", 1337); 

Na druhú stranu, rovnaké metódy akceptujúce iba kľúčový parameter sú prístupové osoby:

Reťazec requestVal = request.attribute ("request-val"); Reťazec sessionVal = session.attribute ("session-val"); // Je to celé číslo 

Zaujímavou funkciou je ich generický návratový typ T, ktorý nás šetrí od potreby odovzdania výsledku.

6.6. Hlavičky

Hlavičky žiadosti sa naopak dajú prečítať iba z žiadosti:

Reťazec header1 = request.header ("a-header"); Reťazec header2 = request.header ("a-safe-header", "s predvolenou hodnotou"); Map allHeaders = request.headers (); 

6.7. Verejné služby

Nasledujúce obslužné metódy sú k dispozícii aj po vybalení z krabice a sú také zrejmé, že nepotrebujú ďalšie vysvetlenie:

  • boolean isIE ()
  • boolean isAjax ()
  • Reťazec contentType ()
  • Reťazec userAgent ()

6.8. Čítanie cookies

Pozrime sa, ako Žiadosť nám objekt pomáha pri zaobchádzaní s cookies, najmä pri čítaní súboru Voliteľné:

Voliteľný súbor cookieRaw (názov reťazca); 

Môžeme ju získať aj ako a String zadaním predvolenej hodnoty, ktorá sa použije, ak súbor cookie neexistuje:

Reťazec cookie (názov reťazca, reťazec defaultValue); 

Nakoniec takto môžeme prečítať všetky súbory cookie naraz (kľúče sú mená cookies, hodnoty sú hodnoty súborov cookie):

Mapové cookies = request.cookies (); 

7. Odozva HTTP

Analogicky k tomu, čo sa robilo s Žiadosť, môžeme získať odkaz na Odozva objekt jednoduchým vyhlásením za parameter smerovacej metódy:

@GetRoute ("/") public void home (odpoveď na odpoveď) {} 

7.1. Jednoduchý výstup

Môžeme ľahko odoslať jednoduchý výstup volajúcemu pomocou jednej z praktických výstupných metód spolu s kódom 200 HTTP a príslušným typom obsahu.

Najskôr môžeme poslať obyčajný text:

response.text („Hello World!“);

Po druhé, môžeme vytvoriť HTML:

response.html ("");

Po tretie, môžeme tiež vygenerovať XML:

response.xml („Hello World!“);

Nakoniec môžeme výstup JSON pomocou a String:

response.json ("{\" Odpoveď \ ": 42}"); 

A dokonca aj z POJO využívajúceho automatickú konverziu JSON:

User user = new User ("Baeldung", "baeldung.com"); response.json (užívateľ); 

7.2. Výstup súboru

Stiahnutie súboru zo servera nemôže byť užšie:

response.download ("the-file.txt", "/path/to/the/file.txt"); 

Prvý parameter nastavuje názov súboru, ktorý sa má stiahnuť, zatiaľ čo druhý (a Súbor objekt, tu skonštruovaný s a String) predstavuje cestu k aktuálnemu súboru na serveri.

7.3. Vykreslenie šablóny

Blade môže tiež vykresľovať stránky pomocou šablónového nástroja:

response.render ("admin / users.html"); 

Predvolený adresár šablón je src / main / resources / templates /, teda predchádzajúci riadok bude hľadať súbor src / main / resources / templates / admin / users.html.

Viac sa o tom dozvieme neskôr v Šablóna oddiel.

7.4. Presmerovanie

Presmerovanie znamená odoslanie 302 kódu HTTP do prehliadača spolu s adresou URL, ktorá nasleduje po druhom GET.

Môžeme presmerovať na inú cestu alebo tiež na externú adresu URL:

response.redirect ("/ target-route"); 

7.5. Písanie cookies

V tejto chvíli by sme mali byť zvyknutí na jednoduchosť čepele. Pozrime sa teda, ako môžeme napísať expirujúci súbor cookie do jedného riadku kódu:

response.cookie ("cookie-name", "Tu je nejaká hodnota"); 

Odstránenie súboru cookie je skutočne rovnako jednoduché:

response.removeCookie ("názov súboru cookie"); 

7.6. Ostatné operácie

Nakoniec Odozva object nám poskytuje niekoľko ďalších metód na vykonávanie operácií, ako je písanie hlavičiek, nastavenie typu obsahu, nastavenie stavového kódu atď.

Poďme sa rýchlo pozrieť na niektoré z nich:

  • Stav odpovede (stav int)
  • Hlavičky mapy ()
  • Odozva nenašla ()
  • Mapové súbory cookie ()
  • Odozva contentType (reťazec contentType)
  • void body (@NonNull byte [] údaje)
  • Hlavička odpovede (názov reťazca, hodnota reťazca)

8. Webové háčiky

WebHook je zachytávač, cez ktorý môžeme spustiť kód pred a po vykonaní metódy smerovania.

WebHook môžeme vytvoriť jednoduchou implementáciou WebHook funkčné rozhranie a prvoradé pred () metóda:

@FunctionalInterface verejné rozhranie WebHook {boolean before (RouteContext ctx); default boolean after (RouteContext ctx) {return true; }} 

Ako vidíme, po () je predvolená metóda, a preto ju prepíšeme iba v prípade potreby.

8.1. Zachytávanie každej žiadosti

The @Bean anotácia hovorí rámcu, aby skenoval triedu pomocou kontajnera IoC.

Webový hák s anotáciou, ktorý bude s ním anotovaný, bude následne fungovať globálne a zachytávať požiadavky na každú adresu URL:

@Bean public class BaeldungHook implementuje WebHook {@Override public boolean before (RouteContext ctx) {System.out.println ("[BaeldungHook] volaný pred metódou Route"); návrat pravdivý; }} 

8.2. Zúženie na adresu URL

Môžeme tiež zachytiť konkrétne adresy URL, aby sme spustili kód iba okolo týchto metód smerovania:

Blade.of () .before ("/ user / *", ctx -> System.out.println ("Pred:" + ctx.uri ())); .start (App.class, args); 

8.3. Middlewares

Middlewares majú prioritu WebHooks, ktoré sa spustia pred akýmkoľvek štandardným WebHook:

public class BaeldungMiddleware implementuje WebHook {@Override public boolean before (RouteContext context) {System.out.println ("[BaeldungMiddleware] volaný pred Route metódou a inými WebHooks"); návrat pravdivý; }} 

Musia byť jednoducho definované bez @Bean anotácie a potom sa deklaratívne zaregistruje prostredníctvom použitie ():

Blade.of () .use (nový BaeldungMiddleware ()) .start (App.class, args); 

Blade navyše prichádza s nasledujúcimi vstavanými Middlewares súvisiacimi so zabezpečením, ktorých názvy by mali byť samozrejmé:

  • BasicAuthMiddleware
  • CorsMiddleware
  • XssMiddleware
  • CsrfMiddleware

9. Konfigurácia

V Blade je konfigurácia úplne voliteľná, pretože podľa dohody funguje všetko ihneď po vybalení. Môžeme však prispôsobiť predvolené nastavenia a zaviesť nové atribúty vo vnútri okna src / main / resources / application.properties spis.

9.1. Čítanie konfigurácie

Konfiguráciu môžeme načítať rôznymi spôsobmi, či už so zadaním alebo bez určenia predvolenej hodnoty pre prípad, že nastavenie nebude k dispozícii.

  • Počas spustenia:
Blade.of () .on (EventType.SERVER_STARTED, e -> {voliteľná verzia = WebContext.blade (). Env ("app.version");}) .start (App.class, args); 
  • Vo vnútri trasy:
@GetRoute ("/ some-route") public void someRoute () {String autors = WebContext.blade (). Env ("app.authors", "Neznámi autori"); } 
  • Vo vlastnom zavádzači implementáciou BladeLoader rozhranie, prevažujúce nad naložiť() metódou a anotovanie triedy pomocou @Bean:
@Bean verejná trieda LoadConfig implementuje BladeLoader {@Override public void load (Blade blade) {voliteľná verzia = WebContext.blade (). Env ("app.version"); Autori reťazcov = WebContext.blade (). Env ("app.authors", "Neznámi autori"); }} 

9.2. Atribúty konfigurácie

Niekoľko nastavení, ktoré sú už nakonfigurované, ale pripravené na prispôsobenie, sú zoskupené podľa typu a uvedené na tejto adrese v tabuľkách s tromi stĺpcami (názov, popis, predvolená hodnota). Môžeme tiež odkázať na preloženú stránku, pričom venujeme pozornosť skutočnosti, že preklad nesprávne zadáva veľké písmená v názvoch nastavení. Skutočné nastavenia sú úplne malé.

Zoskupenie konfiguračných nastavení podľa predpony ich robí čitateľnými naraz na mapu, čo je užitočné, keď ich je veľa:

Environment environment = blade.environment (); Mapa mapa = environment.getPrefix ("aplikácia"); Reťazec version = map.get ("verzia"). ToString (); Autori reťazcov = map.get ("autori", "Neznámi autori"). ToString (); 

9.3. Zaobchádzanie s viacerými prostrediami

Pri nasadzovaní našej aplikácie do iného prostredia bude možno potrebné zadať rôzne nastavenia, napríklad tie, ktoré sa týkajú pripojenia k databáze. Namiesto manuálnej výmeny súboru application.properties súbor, Blade nám ponúka spôsob konfigurácie aplikácie pre rôzne prostredia. Môžeme si jednoducho nechať application.properties so všetkými vývojovými nastaveniami a potom vytvoriť ďalšie súbory v rovnakom priečinku, napríklad application-prod.properties, ktorý obsahuje iba odlišné nastavenia.

Počas spustenia potom môžeme určiť prostredie, ktoré chceme použiť, a framework zlúči súbory pomocou najšpecifickejších nastavení z application-prod.propertiesa všetky ostatné nastavenia z predvoleného nastavenia application.properties spis:

java -jar target / sample-blade-app.jar --app.env = prod 

10. Šablóna

Templating in Blade je modulárny aspekt. Aj keď integruje veľmi základný šablónový modul, pre akékoľvek profesionálne použitie zobrazení by sme sa mali spoľahnúť na externý šablónový modul. Môžeme potom vyberte si motor z tých, ktoré sú k dispozícii v úložisku blade-template-engine na GitHub, ktoré sú FreeMarker, Jetbrick, Kamienoka Rýchlosťalebo dokonca vytvorenie obálky na import inej šablóny, ktorá sa nám páči.

Autor čepele navrhuje Jetbrick, ďalší inteligentný čínsky projekt.

10.1. Používanie predvoleného nástroja

Predvolená šablóna funguje na základe analýzy premenných z rôznych kontextov prostredníctvom ${} notácia:

10.2. Pripojenie externého modulu

Prechod na iný šablónový engine je hračka! Jednoducho importujeme závislosť (obalu Blade) motora:

 com.bladejava blade-template-jetbrick 0.1.3 

V tomto okamihu stačí napísať jednoduchú konfiguráciu, ktorá dá rámcu pokyn na používanie tejto knižnice:

@Bean verejná trieda TemplateConfig implementuje BladeLoader {@Override public void load (Blade blade) {blade.templateEngine (new JetbrickTemplateEngine ()); }} 

Výsledkom je, že teraz každý súbor pod src / main / resources / templates / bude analyzovaný s novým enginom, ktorého syntax presahuje rámec tohto tutoriálu.

10.3. Zabalenie nového motora

Zabalenie nového šablónového stroja si vyžaduje vytvorenie jednej triedy, ktorá musí implementovať TemplateEngine rozhranie a prepísať render () metóda:

void render (ModelAndView modelAndView, Writer writer) vyvolá TemplateException; 

Za týmto účelom sa môžeme pozrieť na kód skutočného balíka Jetbrick, aby sme získali predstavu o tom, čo to znamená.

11. Ťažba dreva

Blade používa slf4j-api ako logovacie rozhranie.

Zahŕňa tiež už nakonfigurovanú implementáciu protokolovania s názvom čepeľ-guľatina. Preto nemusíme nič dovážať; funguje to tak, ako to je, jednoducho definovaním a Logger:

súkromný statický konečný org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger (LogExample.class); 

11.1. Prispôsobenie integrovaného záznamníka

V prípade, že chceme upraviť predvolenú konfiguráciu, musíme vyladiť nasledujúce parametre ako Vlastnosti systému:

  • Úrovne protokolovania (môžu byť „stopa“, „ladenie“, „informácie“, „varovať“ alebo „chyba“):
# Root Logger com.blade.logger.rootLevel = info # Vlastná úroveň protokolovania balíka com.blade.logger.somepackage = debug # Vlastná úroveň protokolovania triedy com.blade.logger.com.baeldung.sample.SomeClass = trace 
  • Zobrazené informácie:
# Dátum a čas com.blade.logger.showDate = false # Vzor dátumu a času com.blade.logger.datePattern = rrrr-MM-dd HH: mm: ss: SSS Z # Názov vlákna com.blade.logger.showThread = true # Názov inštancie záznamníka com.blade.logger.showLogName = true # Iba posledná časť FQCN com.blade.logger.shortName = true 
  • Logger:
# Cesta com.blade.logger.dir =. / Logs # Názov (predvolené nastavenie je pre aktuálny názov aplikácie) com.blade.logger.name = vzorka 

11.2. Okrem integrovaného záznamníka

Aj keď mať už nakonfigurovaný integrovaný záznamník je veľmi užitočné na zahájenie nášho malého projektu, mohli by sme ľahko skončiť v prípade, že iné knižnice importujú svoju vlastnú implementáciu protokolovania. A v takom prípade dokážeme odstrániť ten integrovaný, aby sme predišli konfliktom:

 com.bladejava blade-mvc $ {blade.version} com.bladejava blade-log 

12. Prispôsobenia

12.1. Vlastné spracovanie výnimiek

V rámci je predvolene zabudovaný aj obslužný program výnimiek. Vypíše výnimku na konzolu, a ak app.devMode je pravda, je sledovanie zásobníka viditeľné aj na webovej stránke.

Výnimku však môžeme vyriešiť špecifickým spôsobom, keď definujeme a @Bean predĺženie DefaultExceptionHandler trieda:

@Bean verejná trieda GlobalExceptionHandler rozširuje DefaultExceptionHandler {@Override public void handle (výnimka e) {if (e instanceof BaeldungException) {BaeldungException baeldungException = (BaeldungException) e; Reťazec msg = baeldungException.getMessage (); WebContext.response (). Json (RestResponse.fail (msg)); } else {super.handle (e); }}} 

12.2. Vlastné chybové stránky

Podobne aj chyby 404 nenájdené a 500 - Interná chyba servera sú spracované cez chudé predvolené stránky.

Rámec môžeme prinútiť, aby používal naše vlastné stránky tak, že ich vyhlásime v application.properties súbor s nasledujúcimi nastaveniami:

mvc.view.404 = môj-404.html mvc.view.500 = môj-500.html 

Tieto stránky HTML musia byť určite umiestnené pod src / main / resources / templates priečinok.

V rámci 500 z nich môžeme navyše načítať výnimku správa a stackTrace prostredníctvom ich špeciálnych premenných:

    500 interná chyba servera 

Vyskytla sa nasledujúca chyba : "$ {message}"

 $ {stackTrace} 

13. Naplánované úlohy

Ďalšou zaujímavou vlastnosťou rámca je možnosť plánovania vykonania metódy.

To je možné anotáciou metódy a @Bean trieda s @ Časový plán anotácia:

@Bean verejná trieda ScheduleExample {@Schedule (name = "baeldungTask", cron = "0 * / 1 * * *?") Public void runScheduledTask () {System.out.println ("Toto je naplánovaná úloha spustená raz za minútu." . "); }} 

V skutočnosti používa na špecifikáciu klasických výrazov cron Dátum Čas súradnice. O tých si môžeme prečítať v Sprievodcovi výrazmi Cron.

Neskôr by sme mohli využiť statické metódy Správca úloh triedy na vykonávanie operácií s naplánovanými úlohami.

  • Získajte všetky naplánované úlohy:
Zoznam allScheduledTasks = TaskManager.getTasks (); 
  • Získajte úlohu podľa názvu:
Task myTask = TaskManager.getTask ("baeldungTask"); 
  • Zastavenie úlohy podľa názvu:
boolean closed = TaskManager.stopTask ("baeldungTask"); 

14. Udalosti

Ako už bolo vidieť v časti 9.1, pred spustením vlastného kódu je možné vypočuť si zadanú udalosť.

Blade poskytuje nasledujúce veci po vybalení z krabice:

verejné výpisy EventType {SERVER_STARTING, SERVER_STARTED, SERVER_STOPPING, SERVER_STOPPED, SESSION_CREATED, SESSION_DESTROY, SOURCE_CHANGED, ENVIRONMENT_CHANGED} 

Zatiaľ čo prvých šesť je ľahké uhádnuť, posledné dve potrebujú nejaké rady: ENVIRONMENT_CHANGED umožňuje nám vykonať akciu, ak sa konfiguračný súbor zmení, keď je server hore. SOURCE_CHANGED, zatiaľ nie je implementovaná a je tu iba pre budúce použitie.

Pozrime sa, ako môžeme dať relácii hodnotu vždy, keď je vytvorená:

Blade.of () .on (EventType.SESSION_CREATED, e -> {Session session = (Session) e.attribute ("session"); session.attribute ("name", "Baeldung");}) .start (App .trieda, args); 

15. Implementácia relácie

Keď hovoríme o relácii, jej predvolená implementácia ukladá hodnoty relácie do pamäte.

Mohli by sme teda chcieť prejsť na inú implementáciu, aby sme zabezpečili vyrovnávaciu pamäť, vytrvalosť alebo niečo iné. Zoberme si napríklad Redis. Najprv by sme si mali vytvoriť naše RedisSession zavinovačka implementáciou Session rozhranie, ako je uvedené v dokumentoch pre server HttpSession.

Potom by už išlo iba o to, dať rámcu najavo, že ho chceme použiť. Môžeme to urobiť rovnakým spôsobom, ako sme to urobili pre vlastný modul šablón, s jediným rozdielom, ktorý nazývame sessionType () metóda:

@Bean public class SessionConfig implementuje BladeLoader {@Override public void load (Blade blade) {blade.sessionType (new RedisSession ()); }} 

16. Argumenty príkazového riadku

Pri spustení nástroja Blade z príkazového riadku môžeme zmeniť jeho nastavenie pomocou troch nastavení.

Najskôr môžeme zmeniť IP adresu, ktorá je predvolene lokálna 0.0.0.0 loopback:

java -jar target / sample-blade-app.jar --server.address = 192.168.1.100 

Po druhé, môžeme tiež zmeniť port, ktorý je predvolene nastavený 9000:

java -jar target / sample-blade-app.jar --server.port = 8080 

Nakoniec, ako je vidieť v časti 9.3, môžeme zmeniť prostredie tak, aby umožňovalo iné application-XXX.properties súbor, ktorý sa má načítať cez predvolený, ktorým je application.properties:

java -jar target / sample-blade-app.jar --app.env = prod 

17. Beží v IDE

Akékoľvek moderné Java IDE je schopné hrať projekt Blade bez toho, aby potrebovalo pluginy Maven. Spustenie čepele v IDE je obzvlášť užitočné pri spustení ukážky čepele, príklady napísané výslovne na predstavenie funkcií rámca. Všetci zdedia rodičovský pom, takže je jednoduchšie nechať IDE pracovať, namiesto toho, aby ste ich ručne upravovali tak, aby fungovali ako samostatné aplikácie.

17.1. Zatmenie

V Eclipse stačí kliknúť pravým tlačidlom myši na projekt a spustiť ho Spustiť ako aplikáciu Java, vyberte našu App triedy a stlačte Ok.

Konzola Eclipse však nebude zobrazovať farby ANSI správne, namiesto toho vyleje svoje kódy:

Inštalácia rozšírenia ANSI Escape in Console našťastie problém nadobro vyrieši:

17.2. IntelliJ IDEA

IntelliJ IDEA pracuje s farbami ANSI už po vybalení z krabice. Preto stačí vytvoriť projekt, kliknite pravým tlačidlom myši na ikonu App súbor a spustiť Spustite program „App.main ()“ (čo sa rovná stlačeniu Ctrl + Shift + F10):

17.3. Kód Visual Studio

Je tiež možné použiť VSCode, populárne IDE nesúvisiace s Java, predtým nainštalovaním balíka Java Extension Pack.

Lisovanie Ctrl + F5 potom spustí projekt:

18. Záver

Už sme videli, ako pomocou Blade vytvoriť malú aplikáciu MVC.

Celá dokumentácia je k dispozícii iba v čínskom jazyku. Napriek tomu, že je autor rozšírený hlavne v Číne, vďaka svojmu čínskemu pôvodu nedávno preložil API a na GitHub zdokumentoval kľúčové funkcie projektu v angličtine.

Ako vždy, na GitHube nájdeme zdrojový kód príkladu.


$config[zx-auto] not found$config[zx-overlay] not found