Blade - cjelovit vodič

1. Pregled

Blade je maleni Java 8+ MVC okvir, izgrađen od nule, imajući na umu neke jasne ciljeve: biti samostalan, produktivan, elegantan, intuitivan i super brz.

Mnogo različitih okvira nadahnulo je njegov dizajn: Node's Express, Python's Flask i Golang's Macaron / Martini.

Blade je također dio ambiciozno većeg projekta Let's Blade. Uključuje heterogenu zbirku drugih malih knjižnica, od Captcha generacije do JSON pretvorbe, od predložaka do jednostavne veze s bazom podataka.

Međutim, u ovom uputstvu usredotočit ćemo se samo na MVC.

2. Početak rada

Prije svega, stvorimo prazan Maven projekt i dodajte najnoviju ovisnost Blade MVC u pom.xml:

 com.bladejava blade-mvc 2.0.14.Opusti 

2.1. Spajanje aplikacije oštrice

Budući da će naša aplikacija biti izrađena kao JAR, neće imati / lib mapa, kao u RATU. Kao rezultat toga, ovo nas dovodi do problema kako pružiti oštrica-mvc JAR, zajedno s bilo kojim drugim JAR-om koji bi nam mogao zatrebati, u našu aplikaciju.

Različiti načini za to, svaki sa prednostima i nedostacima, objašnjeni su u vodiču Kako stvoriti izvršni JAR s Mavenom.

Za jednostavnost, koristit ćemo Dodatak Maven Assembly tehnika, koji eksplodira bilo koji JAR uvezen u pom.xml a zatim sve klase spaja u jedan uber-JAR.

2.2. Pokretanje Blade aplikacije

Blade se temelji na Nettyju, nevjerojatan asinhroni mrežni aplikacijski okvir vođen događajima. Stoga nam za pokretanje naše aplikacije zasnovane na Blade-u nije potreban vanjski poslužitelj aplikacija niti Servlet spremnik; JRE će biti dovoljan:

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

Nakon toga, aplikacija će biti dostupna na // localhost: 9000 URL.

3. Razumijevanje arhitekture

Arhitektura Bladea je vrlo jasna:

Uvijek slijedi isti životni ciklus:

  1. Netty prima zahtjev
  2. Izvodi se posrednički softver (nije obavezno)
  3. WebHooks se izvršavaju (nije obavezno)
  4. Izvodi se usmjeravanje
  5. Odgovor se šalje klijentu
  6. Počistiti

Gore navedene funkcije istražit ćemo u sljedećim odjeljcima.

4. Usmjeravanje

Ukratko, usmjeravanje u MVC-u je mehanizam koji se koristi za stvaranje povezivanja između URL-a i kontrolera.

Blade nudi dvije vrste ruta: osnovnu i anotiranu.

4.1. Osnovne rute

Osnovne rute namijenjene su vrlo malom softveru, poput mikrousluga ili minimalnih web aplikacija:

Blade.of () .get ("/ basic-routes-example", ctx -> ctx.text ("GET pozvan")) .post ("/ basic-routes-example", ctx -> ctx.text (" POST pod nazivom ")) .put (" / basic-routes-example ", ctx -> ctx.text (" PUT pozvan ")) .delete (" / basic-routes-example ", ctx -> ctx.text (" DELETE pod nazivom ")) .start (App.class, args); 

Naziv metode koja se koristi za registraciju rute odgovara HTTP glagolu koji će se koristiti za prosljeđivanje zahtjeva. Jednostavno.

U ovom slučaju vraćamo tekst, ali možemo i prikazivati ​​stranice, kao što ćemo vidjeti kasnije u ovom vodiču.

4.2. Bilježene rute

Svakako, za realnije slučajeve uporabe možemo definirati sve rute koje su nam potrebne pomoću bilješki. Za to bismo trebali koristiti zasebne razrede.

Prije svega, moramo stvoriti kontroler putem @Staza napomena koju će Blade skenirati tijekom pokretanja.

Zatim trebamo upotrijebiti bilješku rute koja se odnosi na HTTP metodu koju želimo presresti:

@Path javna klasa RouteExampleController {@GetRoute ("/ routes-example") javni niz get () {return "get.html"; } @PostRoute ("/ routes-example") javni niz niza () {return "post.html"; } @PutRoute ("/ routes-example") javni niz put () {return "put.html"; } @DeleteRoute ("/ routes-example") javni niz delete () {return "delete.html"; }} 

Možemo se poslužiti i jednostavnim @Route i navedite HTTP metodu kao parametar:

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

S druge strane, ako ne stavimo nijedan parametar metode, ruta će presresti svaki HTTP poziv na taj URL, bez obzira na glagol.

4.3. Injekcija parametra

Postoji nekoliko načina za prosljeđivanje parametara našim rutama. Istražimo ih s nekoliko primjera iz dokumentacije.

  • Parametar obrasca:
@GetRoute ("/ home") javna praznina formParam (@Param String name) {System.out.println ("name:" + name); } 
  • Parametar za odmor:
@GetRoute ("/ users /: uid") javna praznina restfulParam (@PathParam Integer uid) {System.out.println ("uid:" + uid); } 
  • Parametar za prijenos datoteke:
@PostRoute ("/ upload") javna void datotekaParam (@MultipartParam FileItem fileItem) {byte [] file = fileItem.getData (); } 
  • Parametar zaglavlja:
@GetRoute ("/ header") javna praznina headerParam (@HeaderParam String referer) {System.out.println ("Referer:" + referer); } 
  • Parametar kolačića:
@GetRoute ("/ cookie") javni void cookieParam (@CookieParam String myCookie) {System.out.println ("myCookie:" + myCookie); } 
  • Parametar tijela:
@PostRoute ("/ bodyParam") javna void bodyParam (@BodyParam Korisnički korisnik) {System.out.println ("user:" + user.toString ()); } 
  • Parametar objekta vrijednosti, poziva se slanjem njegovih atributa na rutu:
@PostRoute ("/ voParam") javna void voParam (korisnik korisnika @Param) {System.out.println ("korisnik:" + user.toString ()); } 

5. Statički resursi

Blade također može poslužiti statičke resurse ako je potrebno, jednostavnim stavljanjem u / resources / static mapu.

Na primjer, src / main / resources / static / app.css bit će dostupan na //localhost:9000/static/app.css.

5.1. Prilagođavanje staza

To ponašanje možemo prilagoditi dodavanjem jedne ili više statičkih staza programskim putem:

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

Isti rezultat može se dobiti putem konfiguracije, uređivanjem datoteke src / main / resources / application.properties:

mvc.statics = / custom-static 

5.2. Omogućavanje popisa resursa

Možemo dopustiti popis sadržaja statične mape, značajke koja je po zadanim postavkama isključena iz sigurnosnih razloga:

blade.showFileList (true); 

Ili u konfiguraciji:

mvc.statics.show-list = true 

Sada možemo otvoriti // localhost: 9000 / custom-static / za prikaz sadržaja mape.

5.3. Korištenje WebJarsa

Kao što se vidi u vodiču Uvod u WebJars, statični resursi pakirani kao JAR također su održiva opcija.

Blade ih automatski izlaže pod / webjars / staza.

Na primjer, uvezimo Bootstrap u pom.xml:

 org.webjars bootstrap 4.2.1 

Kao rezultat toga, bit će dostupan pod //localhost:9000/webjars/bootstrap/4.2.1/css/bootstrap.css

6. HTTP zahtjev

Od Blade se ne temelji na specifikaciji servleta, objekti poput svog sučelja Zahtjev i njegova klasa HttpRequest malo se razlikuju od onih na koje smo navikli.

6.1. Parametri obrasca

Kada čita parametre obrasca, Blade izvrsno koristi Java-ove Neobvezno u rezultatima metoda upita (sve metode u nastavku vraćaju Neobvezno objekt):

  • upit (naziv niza)
  • queryInt (naziv niza)
  • queryLong (naziv niza)
  • queryDouble (naziv niza)

Dostupni su i sa zamjenskom vrijednošću:

  • String upit (naziv niza, zadana vrijednost niza)
  • int queryInt (naziv niza, int defaultValue)
  • long queryLong (naziv niza, duga zadana vrijednost)
  • double queryDouble (naziv niza, dvostruko zadana vrijednost)

Parametar obrasca možemo pročitati kroz automatizirano svojstvo:

@PostRoute ("/ save") javni void formParams (korisničko ime niza @Param) {// ...} 

Ili iz Zahtjev objekt:

@PostRoute ("/ save") public void formParams (zahtjev za zahtjevom) {String username = request.query ("username", "Baeldung"); } 

6.2. JSON podaci

Pogledajmo sada kako se JSON objekt može preslikati u POJO:

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

POJO (označeno Lombokom radi čitljivosti):

naziv javne klase {@Getter @Setter privatni niz; @Getter @Setter privatna stranica s nizovima; } 

Ponovno, vrijednost je dostupna kao ubrizgano svojstvo:

@PostRoute ("/ users") javna void bodyParams (korisnik @BodyParam korisnika) {// ...} 

I iz Zahtjev:

@PostRoute ("/ users") javna void bodyParams (zahtjev zahtjeva) {String bodyString = request.bodyToString (); } 

6.3. OSTALI Parametri

RESTFul parametri u lijepim URL-ovima poput localhost: 9000 / korisnik / 42 također su prvorazredni građani:

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

Kao i obično, možemo se osloniti na Zahtjev objekt po potrebi:

@GetRoute ("/ user") javni void korisnik (zahtjev zahtjeva) {Integer id = request.pathInt ("id"); } 

Očito je da je ista metoda dostupna za Dugo i Niz vrste također.

6.4. Vezanje podataka

Blade podržava parametre vezivanja JSON i Form i automatski ih spaja na objekt modela:

@PostRoute ("/ users") javna void bodyParams (Korisnički korisnik) {} 

6.5. Atributi zahtjeva i sjednice

API za čitanje i pisanje objekata u a Zahtjev i a Sjednica su kristalno jasni.

Metode s dva parametra, koja predstavljaju ključ i vrijednost, su mutatori koje možemo koristiti za pohranu naših vrijednosti u različitim kontekstima:

Sjednica sesije = request.session (); request.attribute ("request-val", "Some Request value"); session.attribute ("session-val", 1337); 

S druge strane, iste metode koje prihvaćaju samo ključni parametar su pristupnici:

Niz requestVal = request.attribute ("request-val"); Niz sessionVal = session.attribute ("session-val"); // To je cijeli broj 

Zanimljiva značajka je njihov generički povrat tipa T, koji nas spašava potrebe za lijevanjem rezultata.

6.6. Zaglavlja

Zaglavlja zahtjeva, naprotiv, mogu se pročitati samo iz zahtjeva:

Niz header1 = request.header ("a-header"); Niz header2 = request.header ("a-safe-header", "sa zadanom vrijednošću"); Mapa svihHeaders = request.headers (); 

6.7. Komunalije

Sljedeće korisne metode također su dostupne iz kutije i toliko su očite da ne trebaju dodatna objašnjenja:

  • logički isIE ()
  • logički isAjax ()
  • Vrsta sadržaja stringa ()
  • String userAgent ()

6.8. Čitanje kolačića

Da vidimo kako Zahtjev objekt pomaže nam u radu s kolačićima, posebno kada čitamo Neobvezno:

Izborni cookieRaw (naziv niza); 

Možemo ga dobiti i kao Niz navođenjem zadane vrijednosti koja će se primijeniti ako kolačić ne postoji:

Nizni kolačić (naziv niza, zadana vrijednost niza); 

Napokon, ovako možemo čitati sve kolačiće odjednom (tipke su imena kolačića, vrijednosti su vrijednosti kolačića):

Mapa kolačića = request.cookies (); 

7. HTTP odgovor

Analogno onome što je učinjeno s Zahtjev, možemo dobiti referencu na Odgovor objektom jednostavnim deklariranjem kao parametar metode usmjeravanja:

@GetRoute ("/") javna praznina (odgovor na odgovor) {} 

7.1. Jednostavan izlaz

Jednostavni izlaz pozivatelju možemo poslati putem jedne od praktičnih metoda izlaza, zajedno s 200 HTTP kodom i odgovarajućim Content-Typeom.

Prvo, možemo poslati običan tekst:

response.text ("Pozdrav svijetu!");

Drugo, možemo izraditi HTML:

response.html ("");

Treće, na isti način možemo generirati XML:

response.xml ("Pozdrav svijetu!");

Konačno, možemo ispisati JSON pomoću a Niz:

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

Pa čak i iz POJO-a, iskorištavajući automatsku JSON pretvorbu:

Korisnik korisnik = novi korisnik ("Baeldung", "baeldung.com"); response.json (korisnik); 

7.2. Izlaz datoteke

Preuzimanje datoteke s poslužitelja ne može biti mršavije:

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

Prvi parametar postavlja ime datoteke koja će se preuzeti, dok drugi (a Datoteka objekt, ovdje konstruiran s a Niz) predstavlja put do stvarne datoteke na poslužitelju.

7.3. Prikazivanje predloška

Blade također može prikazivati ​​stranice putem mehanizma predložaka:

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

Zadani direktorij predložaka je src / main / resources / predlošci /, stoga će prethodni jednolinijski tražiti datoteku src / main / resources / templates / admin / users.html.

O tome ćemo saznati kasnije, u Predlošci odjeljak.

7.4. Preusmjeravanje

Preusmjeravanje znači slanje 302 HTTP koda u preglednik, zajedno s URL-om koji slijedi s drugim GET-om.

Možemo preusmjeriti na drugu rutu ili na vanjski URL:

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

7.5. Pisanje kolačića

U ovom trenutku trebali bismo se naviknuti na jednostavnost Bladea. Pogledajmo tako kako možemo napisati kolačić koji istječe u jedan redak koda:

response.cookie ("cookie-name", "Ovdje ima neke vrijednosti"); 

U stvari, uklanjanje kolačića jednako je jednostavno:

response.removeCookie ("naziv kolačića"); 

7.6. Ostale operacije

Napokon, Odgovor objekt pruža nam nekoliko drugih metoda za izvođenje operacija poput pisanja zaglavlja, postavljanja tipa sadržaja, postavljanja statusnog koda itd.

Kratko ćemo pogledati neke od njih:

  • Status odgovora (int status)
  • Zaglavlja karte ()
  • Odgovor nije pronađen ()
  • Mapa kolačića ()
  • Response contentType (String contentType)
  • prazno tijelo (podaci @NonNull byte [])
  • Zaglavlje odgovora (naziv niza, vrijednost niza)

8. WebHooks

WebHook je presretač putem kojeg možemo izvoditi kôd prije i nakon izvršavanja metode usmjeravanja.

WebHook možemo stvoriti jednostavnom implementacijom WebHook funkcionalno sučelje i nadjačavanje prije() metoda:

@FunctionalInterface javno sučelje WebHook {boolean before (RouteContext ctx); zadana logička vrijednost nakon (RouteContext ctx) {return true; }} 

Kao što vidimo, nakon() je zadana metoda, stoga ćemo je poništiti samo kada je to potrebno.

8.1. Presretanje svakog zahtjeva

The @Grah napomena govori okviru za skeniranje klase s IoC spremnikom.

WebHook označen njime radit će globalno presrećući zahtjeve na svaki URL:

@Bean javna klasa BaeldungHook implementira WebHook {@Override public boolean before (RouteContext ctx) {System.out.println ("[BaeldungHook] pozvan prije metode rute"); povratak istinit; }} 

8.2. Sužavanje na URL

Također možemo presresti određene URL-ove kako bismo izvršili kod samo oko tih metoda rute:

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

8.3. Middlewares

Middlewares je prioritet WebHooks koji se izvršava prije bilo kojeg standardnog WebHooka:

javna klasa BaeldungMiddleware implementira WebHook {@Override public boolean before (RouteContext context) {System.out.println ("[BaeldungMiddleware] pozvan prije metode rute i druge WebHooks"); povratak istinit; }} 

Jednostavno ih treba definirati bez znaka @Grah bilješku, a zatim se deklarativno registrira putem koristiti():

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

Uz to, Blade dolazi sa sljedećim ugrađenim Middlewaresom povezanim sa sigurnošću, čija bi imena trebala biti sama po sebi razumljiva:

  • BasicAuthMiddleware
  • CorsMiddleware
  • XssMiddleware
  • CsrfMiddleware

9. Konfiguracija

U Bladeu je konfiguracija potpuno neobavezna, jer sve po dogovoru funkcionira odmah. Međutim, možemo prilagoditi zadane postavke i uvesti nove atribute unutar src / main / resources / application.properties datoteka.

9.1. Čitanje konfiguracije

Konfiguraciju možemo čitati na različite načine, sa ili bez navođenja zadane vrijednosti u slučaju da postavka nije dostupna.

  • Tijekom pokretanja:
Blade.of () .on (EventType.SERVER_STARTED, e -> {Neobvezna verzija = WebContext.blade (). Env ("app.version");}) .start (App.class, args); 
  • Unutar rute:
@GetRoute ("/ some-route") public void someRoute () {Autori niza = WebContext.blade (). Env ("app.authors", "Nepoznati autori"); } 
  • U prilagođenom učitavaču, implementacijom BladeLoader sučelje, nadjačavanje opterećenje() metodu i označavanje razreda s @Grah:
@Bean javna klasa LoadConfig implementira BladeLoader {@Override public void load (Blade blade) {Neobvezna verzija = WebContext.blade (). Env ("app.version"); Autori nizova = WebContext.blade (). Env ("app.authors", "Nepoznati autori"); }} 

9.2. Atributi konfiguracije

Nekoliko postavki koje su već konfigurirane, ali spremne za prilagodbu, grupirane su po vrstama i navedene na ovoj adresi u tablicama s tri stupca (ime, opis, zadana vrijednost). Također se možemo pozvati na prevedenu stranicu, obraćajući pažnju na to da prijevod pogrešno koristi velika slova imena postavki. Stvarne postavke su u potpunosti malim slovima.

Grupiranje postavki konfiguracije po prefiksu čini ih odjednom čitljivima na karti, što je korisno kada ih ima mnogo:

Okoliš okoliš = blade.environment (); Map map = environment.getPrefix ("app"); Verzija niza = map.get ("verzija"). ToString (); Autori niza = map.get ("autori", "Nepoznati autori"). ToString (); 

9.3. Rukovanje više okruženja

Prilikom postavljanja naše aplikacije u drugo okruženje, možda ćemo trebati odrediti različite postavke, na primjer one povezane s vezom baze podataka. Umjesto ručne zamjene primjena.svojstva datoteka, Blade nam nudi način za konfiguriranje aplikacije za različita okruženja. Jednostavno možemo zadržati primjena.svojstva sa svim razvojnim postavkama, a zatim stvoriti druge datoteke u istoj mapi, poput svojstva-prod. svojstva, koji sadrži samo one postavke koje se razlikuju.

Tijekom pokretanja tada možemo odrediti okruženje koje želimo koristiti, a okvir će spojiti datoteke pomoću najspecifičnijih postavki iz svojstva-prod. svojstvai sve ostale postavke prema zadanim postavkama primjena.svojstva datoteka:

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

10. Predlošci

Predlošci u Bladeu modularni su aspekt. Iako integrira vrlo osnovni mehanizam predložaka, za svaku profesionalnu upotrebu Pogledi trebali bismo se osloniti na vanjski mehanizam predloška. Tada možemo odaberite motor od dostupnih u spremištu blade-template-engine na GitHub-u, koji su FreeMarker, Jetbrick, Kamenčić, i Brzina, ili čak stvaranje omota za uvoz drugog predloška koji nam se sviđa.

Bladeov autor predlaže Jetbrick, još jedan pametni kineski projekt.

10.1. Korištenje zadanog stroja

Zadani predložak djeluje raščlanjivanjem varijabli iz različitih konteksta kroz ${} notacija:

10.2. Priključivanje vanjskog motora

Prelazak na drugi mehanizam predložaka povjetarac je! Jednostavno uvozimo ovisnost (omota Blade-a) motora:

 com.bladejava blade-template-jetbrick 0.1.3 

U ovom je trenutku dovoljno napisati jednostavnu konfiguraciju koja će uputiti okvir da koristi tu knjižnicu:

@Bean javna klasa TemplateConfig implementira BladeLoader {@Override public void load (Blade blade) {blade.templateEngine (new JetbrickTemplateEngine ()); }} 

Kao rezultat, sada svaka datoteka pod src / main / resources / predlošci / bit će raščlanjen s novim motorom, čija sintaksa izvan opsega ovog vodiča.

10.3. Omotavanje novog motora

Omotavanje novog mehanizma predloška zahtijeva stvaranje jedne klase koja mora implementirati TemplateEngine sučelje i nadjačati prikazati () metoda:

void render (ModelAndView modelAndView, Writer Writer) baca TemplateException; 

U tu svrhu možemo pogledati kod stvarnog omotača Jetbrick kako bismo dobili ideju što to znači.

11. Sječa drva

Blade koristi slf4j-api kao sučelje za bilježenje.

Uključuje i već konfiguriranu implementaciju evidentiranja, tzv log-log. Stoga ne trebamo ništa uvoziti; djeluje onako kako jest, jednostavnim definiranjem a Drvosječa:

privatni statički konačni org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger (LogExample.class); 

11.1. Prilagođavanje integriranog zapisničara

U slučaju da želimo izmijeniti zadanu konfiguraciju, trebamo podesiti sljedeće parametre kao Svojstva sustava:

  • Razine zapisivanja (mogu biti „praćenje“, „otklanjanje pogrešaka“, „informacije“, „upozorenje“ ili „pogreška“):
# Root Logger com.blade.logger.rootLevel = info # Prilagođena razina pakiranja paketa com.blade.logger.somepackage = debug # Razina prilagođene evidencije klase com.blade.logger.com.baeldung.sample.SomeClass = trace 
  • Prikazane informacije:
# Datum i vrijeme com.blade.logger.showDate = false # Uzorak datuma i vremena com.blade.logger.datePattern = yyyy-MM-dd HH: mm: ss: SSS Z # Naziv teme com.blade.logger.showThread = true # Ime instance zapisa zapisnika com.blade.logger.showLogName = true # Samo zadnji dio FQCN-a com.blade.logger.shortName = true 
  • Drvosječa:
# Put com.blade.logger.dir =. / Logs # Name (zadano prema trenutnom imenu aplikacije) com.blade.logger.name = sample 

11.2. Izuzimajući integrirani zapisnik

Iako je već konfigurirani integrirani zapisnik vrlo zgodan za pokretanje našeg malog projekta, lako bismo mogli završiti u slučaju da druge knjižnice uvezu vlastitu implementaciju zapisivanja. U tom slučaju možemo ukloniti integrirani kako bismo izbjegli sukobe:

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

12. Prilagođavanja

12.1. Rukovanje prilagođenim iznimkama

Rukovatelj iznimkama također je ugrađen prema zadanim postavkama u okvir. Ispisuje iznimku na konzolu i ako app.devMode je pravi, trag steka također je vidljiv na web stranici.

Međutim, s iznimkom se možemo nositi na specifičan način definiranjem a @Grah produžujući DefaultExceptionHandler razred:

@Bean javna klasa GlobalExceptionHandler proširuje DefaultExceptionHandler {@Override public void handle (Izuzetak e) {if (e instanceof BaeldungException) {BaeldungException baeldungException = (BaeldungException) e; Niz msg = baeldungException.getMessage (); WebContext.response (). Json (RestResponse.fail (msg)); } else {super.handle (e); }}} 

12.2. Stranice prilagođenih pogrešaka

Slično tome, pogreške 404 nije pronađeno i 500 Interna pogreška poslužitelja obrađuju se kroz zadane zadane stranice.

Možemo prisiliti okvir da koristi naše vlastite stranice tako što ćemo ih prijaviti u primjena.svojstva datoteka sa sljedećim postavkama:

mvc.view.404 = my-404.html mvc.view.500 = my-500.html 

Svakako, te HTML stranice moraju biti smještene pod src / main / resources / predlošci mapu.

Unutar 500, osim toga, možemo dohvatiti i iznimku poruka i stackTrace kroz njihove posebne varijable:

    500 Interna pogreška poslužitelja 

Dogodila se sljedeća pogreška: "$ {message}"

 $ {stackTrace} 

13. Planirani zadaci

Još jedna zanimljiva značajka okvira je mogućnost raspoređivanja izvršenja metode.

To je moguće bilježenjem metode a @Grah razred s @Raspored napomena:

@Bean public class ScheduleExample {@ Schedule (name = "baeldungTask", cron = "0 * / 1 * * *?") Public void runScheduledTask () {System.out.println ("Ovo je planirani zadatak koji se izvodi jednom u minuti . "); }} 

Zapravo, koristi klasične izraze cron kako bi specificirao Datum vrijeme koordinate. O njima možemo pročitati više u Vodiču za izraze Cron.

Kasnije bismo mogli iskoristiti statičke metode Upravitelj zadataka klase za izvođenje operacija na planiranim zadacima.

  • Dohvatite sve zakazane zadatke:
Popis svihScheduledTasks = TaskManager.getTasks (); 
  • Dohvatite zadatak po imenu:
Zadatak myTask = TaskManager.getTask ("baeldungTask"); 
  • Zaustavite zadatak po imenu:
boolean closed = TaskManager.stopTask ("baeldungTask"); 

14. Događaji

Kao što je već viđeno u odjeljku 9.1, moguće je preslušati određeni događaj prije pokretanja nekog prilagođenog koda.

Blade nudi sljedeće događaje iz kutije:

public enum EventType {SERVER_STARTING, SERVER_STARTED, SERVER_STOPPING, SERVER_STOPPED, SESSION_CREATED, SESSION_DESTROY, SOURCE_CHANGED, ENVIRONMENT_CHANGED} 

Iako je prvih šest lako pogoditi, zadnja dva trebaju neke savjete: OKRUŽENJE_MIJENJENO omogućuje nam izvršenje radnje ako se konfiguracijska datoteka promijeni kada poslužitelj radi. IZMJENI IZVOR, umjesto toga, još nije implementiran i postoji samo za buduću upotrebu.

Pogledajmo kako možemo staviti vrijednost u sesiju kad god je kreirana:

Blade.of () .on (EventType.SESSION_CREATED, e -> {Sesija sesije = (Sesija) e.attribute ("sesija"); session.attribute ("ime", "Baeldung");}) .start (App .razred, argumenti); 

15. Provedba sjednice

Govoreći o sesiji, njezina zadana implementacija pohranjuje vrijednosti sesije u memoriju.

Stoga bismo se možda htjeli prebaciti na drugu implementaciju kako bismo osigurali predmemoriju, postojanost ili nešto drugo. Uzmimo za primjer Redis. Prvo bismo trebali stvoriti svoj RedisSession omot primjenom Sjednica sučelje, kao što je prikazano u dokumentima za HttpSession.

Tada bi trebalo biti samo davanje okvira do znanja da ga želimo koristiti. To možemo učiniti na isti način na koji smo to učinili za mehanizam prilagođenih predložaka, s jedinom razlikom što zovemo sessionType () metoda:

@Bean javna klasa SessionConfig implementira BladeLoader {@Override public void load (Blade blade) {blade.sessionType (new RedisSession ()); }} 

16. Argumenti naredbenog retka

Pri pokretanju Bladea iz naredbenog retka postoje tri postavke koje možemo odrediti za promjenu njegovog ponašanja.

Prvo, možemo promijeniti IP adresu koja je prema zadanim postavkama lokalna 0.0.0.0 povratna petlja:

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

Drugo, također možemo promijeniti priključak koji je prema zadanim postavkama 9000:

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

Konačno, kao što se vidi u odjeljku 9.3, možemo promijeniti okruženje da dopustimo drugačije aplikacija-XXX.svojstva datoteku za čitanje preko zadane, koja je primjena.svojstva:

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

17. Pokretanje u IDE-u

Bilo koji moderni Java IDE sposoban je igrati Blade projekt bez potrebe za dodacima Maven. Pokretanje Blade-a u IDE-u posebno je korisno kada se pokreću Blade Demos, primjeri napisani izričito za prikaz funkcionalnosti okvira. Svi oni nasljeđuju roditeljsku pom, pa je lakše pustiti IDE da radi posao, umjesto da ih ručno doradite da se pokreću kao samostalne aplikacije.

17.1. Zasjeniti

U Eclipseu je dovoljno kliknuti projekt desnom tipkom miša i pokrenuti Pokreni se kao Java aplikacija, odaberite naš App predavanja i pritisnite u redu.

Eclipseova konzola, međutim, neće ispravno prikazivati ​​ANSI boje, umjesto toga izlijeva njihove kodove:

Srećom, instaliranje proširenja ANSI Escape u konzoli ispravno rješava problem:

17.2. IntelliJ IDEA

IntelliJ IDEA radi s ANSI bojama iz kutije. Stoga je dovoljno stvoriti projekt, desnim klikom na App datoteku i pokrenite Pokrenite "App.main ()" (što je ekvivalentno pritisku Ctrl + Shift + F10):

17.3. Visual Studio kôd

Također je moguće koristiti VSCode, popularni IDE koji nije usmjeren na Java, prethodno instaliranjem Java Extension Pack-a.

Pritiskom Ctrl + F5 će tada pokrenuti projekt:

18. Zaključak

Vidjeli smo kako pomoću Bladea stvoriti malu MVC aplikaciju.

Cjelokupna dokumentacija dostupna je samo na kineskom jeziku. Iako je raširen uglavnom u Kini, zahvaljujući kineskom podrijetlu, autor je nedavno preveo API i na GitHubu na engleskom jeziku dokumentirao osnovne funkcionalnosti projekta.

Kao i uvijek, izvorni kod primjera možemo pronaći na GitHubu.


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