Blade - En komplet vejledning

1. Oversigt

Blade er en lille Java 8+ MVC-ramme, bygget fra bunden med nogle klare mål i tankerne: at være selvstændig, produktiv, elegant, intuitiv og super hurtig.

Mange forskellige rammer inspirerede dets design: Node's Express, Python's Flask og Golang's Macaron / Martini.

Blade er også en del af et ambitiøst større projekt, Let's Blade. Det inkluderer en heterogen samling af andre små biblioteker, fra Captcha-generation til JSON-konvertering, fra skabeloner til en simpel databaseforbindelse.

I denne vejledning fokuserer vi dog kun på MVC.

2. Kom godt i gang

Lad os først og fremmest oprette et tomt Maven-projekt og tilføje den nyeste Blade MVC-afhængighed i pom.xml:

 com.bladejava blade-mvc 2.0.14.FRIGIVELSE 

2.1. Bundling af en bladapplikation

Da vores app oprettes som en JAR, har den ikke en / lib mappe, som i en WAR. Som et resultat fører dette os til problemet med, hvordan vi leverer blade-mvc JAR sammen med enhver anden JAR, vi muligvis har brug for, til vores app.

De forskellige måder at gøre dette på, hver med fordele og ulemper, forklares i vejledningen Sådan oprettes en eksekverbar JAR med Maven.

For enkelhedens skyld vi bruger Maven Assembly Plugin teknik, som eksploderer enhver JAR, der importeres i pom.xml og derefter bundter alle klasser sammen i en enkelt uber-JAR.

2.2. Kørsel af en bladapplikation

Blade er baseret på Netty, en fantastisk asynkron begivenhedsdrevet netværksapplikationsramme. Derfor har vi ikke brug for nogen ekstern applikationsserver eller servletcontainer for at køre vores Blade-baserede applikation; JRE vil være nok:

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

Derefter vil applikationen være tilgængelig på // localhost: 9000 URL.

3. Forståelse af arkitekturen

Arkitekturen i Blade er meget ligetil:

Det følger altid den samme livscyklus:

  1. Netty modtager en anmodning
  2. Middlewares udføres (valgfrit)
  3. WebHooks udføres (valgfrit)
  4. Routing udføres
  5. Svaret sendes til klienten
  6. Ryd op

Vi udforsker ovenstående funktioner i de næste sektioner.

4. Routing

Kort sagt er routing i MVC den mekanisme, der bruges til at skabe en binding mellem en URL og en controller.

Blade tilbyder to typer ruter: en grundlæggende og en kommenteret.

4.1. Grundlæggende ruter

Grundlæggende ruter er beregnet til meget lille software som mikrotjenester eller minimale webapplikationer:

Blade.of () .get ("/ basic-routes-example", ctx -> ctx.text ("GET called")) .post ("/ basic-routes-example", ctx -> ctx.text (" POST kaldet ")) .put (" / basic-routes-example ", ctx -> ctx.text (" PUT called ")) .delete (" / basic-routes-example ", ctx -> ctx.text (" SLET kaldes ")) .start (App.class, args); 

Navnet på den metode, der bruges til at registrere en rute, svarer til HTTP-verbet, der vil blive brugt til at videresende anmodningen. Så simpelt som det.

I dette tilfælde returnerer vi en tekst, men vi kan også gengive sider, som vi vil se senere i denne vejledning.

4.2. Kommenterede ruter

Bestemt for mere realistiske brugssager kan vi definere alle de ruter, vi har brug for ved hjælp af annoteringer. Vi skal bruge separate klasser til det.

Først og fremmest skal vi oprette en controller gennem @Sti kommentar, som scannes af Blade under opstarten.

Vi skal derefter bruge ruteanmeldelsen relateret til den HTTP-metode, vi vil opfange:

@Path public class RouteExampleController {@GetRoute ("/ routes-example") public String get () {return "get.html"; } @ PostRoute ("/ ruter-eksempel") offentlig strengindlæg () {returner "post.html"; } @ PutRoute ("/ ruter-eksempel") offentlig String put () {returner "put.html"; } @DeleteRoute ("/ ruter-eksempel") offentlig Sletning af streng () {returner "delete.html"; }} 

Vi kan også bruge det enkle @Rute kommentar og angiv HTTP-metoden som parameter:

@Route (værdi = "/ et andet ruteeksempel", metode = HttpMethod.GET) offentlig String anotherGet () {returner "get.html"; } 

På den anden side, Hvis vi ikke lægger nogen metodeparameter, opfanger ruten hvert HTTP-opkald til den URLuanset verbet.

4.3. Parameterinjektion

Der er flere måder at videregive parametre til vores ruter. Lad os udforske dem med nogle eksempler fra dokumentationen.

  • Formularparameter:
@GetRoute ("/ home") public void formParam (@Param String name) {System.out.println ("name:" + name); } 
  • Restful parameter:
@GetRoute ("/ brugere /: uid") offentlig ugyldig restfulParam (@PathParam Heltal uid) {System.out.println ("uid:" + uid); } 
  • Parameter for upload af fil:
@PostRoute ("/ upload") offentlig ugyldig filParam (@MultipartParam FileItem fileItem) {byte [] file = fileItem.getData (); } 
  • Sidehovedparameter:
@GetRoute ("/ header") public void headerParam (@HeaderParam String referer) {System.out.println ("Referer:" + referer); } 
  • Cookie-parameter:
@GetRoute ("/ cookie") offentlig ugyldig cookieParam (@CookieParam String myCookie) {System.out.println ("myCookie:" + myCookie); } 
  • Kropsparameter:
@PostRoute ("/ bodyParam") offentlig ugyldig bodyParam (@BodyParam brugerbruger) {System.out.println ("bruger:" + bruger.toString ()); } 
  • Value Object parameter, kaldet ved at sende dets attributter til ruten:
@PostRoute ("/ voParam") offentlig ugyldig voParam (@Param brugerbruger) {System.out.println ("bruger:" + bruger.toString ()); } 

5. Statiske ressourcer

Blade kan også tjene statiske ressourcer, hvis det er nødvendigt, ved blot at placere dem inde i / ressourcer / statisk folder.

F.eks src / main / resources / static / app.css vil være tilgængelig på //localhost:9000/static/app.css.

5.1. Tilpasning af stierne

Vi kan indstille denne adfærd ved at tilføje en eller flere statiske stier programmatisk:

blade.addStatics ("/ brugerdefineret-statisk"); 

Det samme resultat opnås gennem konfiguration ved at redigere filen src / main / resources / application.properties:

mvc.statics = / brugerdefineret-statisk 

5.2. Aktivering af ressourcelisten

Vi kan tillade en liste over indholdet af en statisk mappe, en funktion er som standard slået fra af sikkerhedsmæssige årsager:

blade.showFileList (sand); 

Eller i konfigurationen:

mvc.statics.show-list = sandt 

Vi kan nu åbne // localhost: 9000 / brugerdefineret-statisk / for at vise indholdet af mappen.

5.3. Brug af WebJars

Som det ses i introduktionen til WebJars-tutorial, er statiske ressourcer pakket som JAR også en levedygtig mulighed.

Blade udsætter dem automatisk under / webjars / sti.

Lad os for eksempel importere Bootstrap i pom.xml:

 org.webjars bootstrap 4.2.1 

Som et resultat vil den være tilgængelig under //localhost:9000/webjars/bootstrap/4.2.1/css/bootstrap.css

6. HTTP-anmodning

Siden Blade er ikke baseret på Servlet-specifikationen, objekter som dens grænseflade Anmodning og dens klasse HttpForespørgsel er lidt anderledes end dem, vi er vant til.

6.1. Formularparametre

Når du læser formparametre, bruger Blade stor Java-programmer Valgfri i resultaterne af forespørgselsmetoderne (alle nedenstående metoder returnerer en Valgfri objekt):

  • forespørgsel (strengnavn)
  • queryInt (strengnavn)
  • queryLong (strengnavn)
  • queryDouble (strengnavn)

De fås også med en reserveværdi:

  • Strengeforespørgsel (strengnavn, streng standardværdi)
  • int queryInt (String name, int defaultValue)
  • long queryLong (String name, long defaultValue)
  • double queryDouble (String name, double defaultValue)

Vi kan læse en formularparameter gennem den automatiserede ejendom:

@PostRoute ("/ save") offentlig ugyldig formParams (@Param String brugernavn) {// ...} 

Eller fra Anmodning objekt:

@PostRoute ("/ gem") offentlig ugyldig formParams (anmodning om anmodning) {String brugernavn = request.query ("brugernavn", "Baeldung"); } 

6.2. JSON-data

Lad os nu se på, hvordan et JSON-objekt kan kortlægges til en POJO:

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

POJO (kommenteret med Lombok for læsbarhed):

offentlig klasse bruger {@Getter @Setter privat strengnavn; @Getter @Setter privat streng websted; } 

Igen er værdien tilgængelig som den injicerede ejendom:

@PostRoute ("/ brugere") offentlig ugyldig bodyParams (@BodyParam brugerbruger) {// ...} 

Og fra Anmodning:

@PostRoute ("/ brugere") offentlig ugyldig bodyParams (anmodning om anmodning) {String bodyString = request.bodyToString (); } 

6.3. RESTfulde parametre

RESTFul-parametre i smukke webadresser som localhost: 9000 / bruger / 42 er også førsteklasses borgere:

@GetRoute ("/ user /: id") offentlig ugyldig bruger (@PathParam Integer id) {// ...} 

Som sædvanligt kan vi stole på Anmodning objekt efter behov:

@GetRoute ("/ bruger") offentlig ugyldig bruger (Anmodningsanmodning) {Heltal id = anmodning.pathInt ("id"); } 

Det er klart, at den samme metode er tilgængelig for Lang og Snor typer også.

6.4. Databinding

Blade understøtter både JSON- og Form-bindingsparametre og vedhæfter dem automatisk til modelobjektet:

@PostRoute ("/ brugere") offentlig ugyldig bodyParams (brugerbruger) {} 

6.5. Attributter for anmodning og session

API til læsning og skrivning af objekter i en Anmodning og en Session er krystalklare.

Metoderne med to parametre, der repræsenterer nøgle og værdi, er de mutatorer, vi kan bruge til at gemme vores værdier i de forskellige sammenhænge:

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

På den anden side er de samme metoder, der kun accepterer nøgleparameteren, accessorerne:

String requestVal = request.attribute ("anmodnings-værdi"); Streng sessionVal = session.attribute ("session-val"); // Det er et heltal 

Et interessant træk er deres generiske returtype T, der sparer os for behovet for at kaste resultatet.

6.6. Overskrifter

Forespørgselsoverskrifter kan tværtimod kun læses fra anmodningen:

String header1 = request.header ("a-header"); String header2 = request.header ("a-safe-header", "med en standardværdi"); Kort allHeaders = request.headers (); 

6.7. Hjælpeprogrammer

Følgende hjælpemetoder er også tilgængelige ud af kassen, og de er så tydelige, at de ikke behøver yderligere forklaringer:

  • boolsk isIE ()
  • boolsk isAjax ()
  • String contentType ()
  • String userAgent ()

6.8. Læsning af cookies

Lad os se, hvordan Anmodning objekt hjælper os med at håndtere cookies, specielt når vi læser Valgfri:

Valgfri cookieRaw (strengnavn); 

Vi kan også få det som en Snor ved at angive en standardværdi, der skal anvendes, hvis en cookie ikke findes:

String cookie (String name, String defaultValue); 

Endelig er det sådan, hvordan vi kan læse alle cookies på én gang (nøgler er cookies 'navne, værdier er Cookies 'værdier):

Kortcookies = anmodning. Cookies (); 

7. HTTP-svar

Analogt med hvad der blev gjort med Anmodning, kan vi få en henvisning til Respons objekt ved blot at erklære det som en parameter for routing-metoden:

@GetRoute ("/") offentligt ugyldigt hjem (svarsvar) {} 

7.1. Enkel output

Vi kan nemt sende en simpel output til den, der ringer op gennem en af ​​de praktiske outputmetoder sammen med en 200 HTTP-kode og den relevante indholdstype.

For det første kan vi sende en almindelig tekst:

respons.text ("Hej verden!");

For det andet kan vi producere en HTML:

respons.html ("");

For det tredje kan vi ligeledes generere en XML:

respons.xml ("Hej verden!");

Endelig kan vi output JSON ved hjælp af en Snor:

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

Og selv fra en POJO, der udnytter den automatiske JSON-konvertering:

Brugerbruger = ny bruger ("Baeldung", "baeldung.com"); response.json (bruger); 

7.2. Filoutput

Download af en fil fra serveren kunne ikke være slankere:

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

Den første parameter indstiller navnet på den fil, der skal downloades, mens den anden (a Fil objekt, her konstrueret med en Snor) repræsenterer stien til den faktiske fil på serveren.

7.3. Skabelongengivelse

Blade kan også gengive sider gennem en skabelonmotor:

respons.render ("admin / brugere.html"); 

Skabelonens standardmappe er src / main / ressourcer / skabeloner /, derfor vil den tidligere one-liner kigge efter filen src / main / resources / templates / admin / users.html.

Vi lærer mere om dette senere i Skabeloner afsnit.

7.4. Omdiriger

En omdirigering betyder at sende en 302 HTTP-kode til browseren sammen med en URL til at følge med en anden GET.

Vi kan omdirigere til en anden rute eller til en ekstern URL:

respons.redirect ("/ målrute"); 

7.5. Skrivning af cookies

Vi skal være vant til Blades enkelhed på dette tidspunkt. Lad os således se, hvordan vi kan skrive en ikke-udløbende cookie i en enkelt kodelinje:

response.cookie ("cookie-name", "Nogle værdi her"); 

Det er lige så simpelt at fjerne en cookie:

response.removeCookie ("cookie-name"); 

7.6. Andre operationer

Endelig blev Respons objekt giver os adskillige andre metoder til at udføre operationer som at skrive overskrifter, indstilling af indholdstype, indstilling af statuskode og så videre.

Lad os se hurtigt på nogle af dem:

  • Svarstatus (int-status)
  • Kortoverskrifter ()
  • Svar ikke fundet ()
  • Kortcookies ()
  • Svar indholdType (streng indholdType)
  • tomrumsdel (@NonNull byte [] data)
  • Svarhoved (strengnavn, strengværdi)

8. WebHooks

En WebHook er en interceptor, gennem hvilken vi kan køre kode før og efter udførelsen af ​​en routingsmetode.

Vi kan oprette en WebHook ved blot at implementere WebHook funktionel grænseflade og tilsidesættelse af Før() metode:

@FunctionalInterface offentlig grænseflade WebHook {boolsk før (RouteContext ctx); standard boolsk efter (RouteContext ctx) {return sand; }} 

Som vi kan se, efter() er en standardmetode, og derfor tilsidesætter vi den kun, når det er nødvendigt.

8.1. Aflytning af enhver anmodning

Det @Bønne annotation fortæller rammen om at scanne klassen med IoC Container.

En WebHook, der er kommenteret med den, fungerer derfor globalt og opfanger anmodninger til hver URL:

@Bean public class BaeldungHook implementerer WebHook {@Override public boolean before (RouteContext ctx) {System.out.println ("[BaeldungHook] kaldet før Route-metode"); returner sandt; }} 

8.2. Indskrænkning til en URL

Vi kan også opfange specifikke webadresser for kun at udføre kode omkring disse rutemetoder:

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

8.3. Mellemværker

Middlewares prioriteres WebHooks, som bliver udført før enhver standard WebHook:

offentlig klasse BaeldungMiddleware implementerer WebHook {@Override public boolean before (RouteContext context) {System.out.println ("[BaeldungMiddleware] kaldet før Route-metode og andre WebHooks"); returner sandt; }} 

De skal simpelthen defineres uden @Bønne kommentar, og derefter registreret erklærende gennem brug():

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

Derudover kommer Blade med følgende sikkerhedsrelaterede indbyggede Middlewares, hvis navne skal være selvforklarende:

  • BasicAuthMiddleware
  • CorsMidleware
  • XssMiddleware
  • CsrfMiddleware

9. Konfiguration

I Blade er konfigurationen helt valgfri, fordi alt fungerer ud af kassen efter konvention. Vi kan dog tilpasse standardindstillingerne og introducere nye attributter inden i src / main / resources / application.properties fil.

9.1. Læsning af konfigurationen

Vi kan læse konfigurationen på forskellige måder med eller uden at angive en standardværdi, hvis indstillingen ikke er tilgængelig.

  • Under opstart:
Blade.of () .on (EventType.SERVER_STARTED, e -> {Valgfri version = WebContext.blade (). Env ("app.version");}) .start (App.class, args); 
  • Inde i en rute:
@GetRoute ("/ some-route") offentlig ugyldig someRoute () {Stringforfattere = WebContext.blade (). Env ("app.authors", "Ukendte forfattere"); } 
  • I en brugerdefineret læsser ved at implementere BladeLoader interface, der tilsidesætter belastning() metode og kommentere klassen med @Bønne:
@Bean public class LoadConfig implementerer BladeLoader {@Override public void load (Blade blade) {Valgfri version = WebContext.blade (). Env ("app.version"); Stringforfattere = WebContext.blade (). Env ("app.authors", "Ukendte forfattere"); }} 

9.2. Konfigurationsattributter

De forskellige indstillinger, der allerede er konfigureret, men klar til at blive tilpasset, er grupperet efter type og anført på denne adresse i tre-kolonnetabeller (navn, beskrivelse, standardværdi). Vi kan også henvise til den oversatte side og være opmærksomme på, at oversættelsen fejlagtigt verserer indstillingenes navne. De virkelige indstillinger er helt små bogstaver.

Gruppering af konfigurationsindstillinger efter præfiks gør dem læsbare på én gang på et kort, hvilket er nyttigt, når der er mange af dem:

Miljømiljø = blad. Miljø (); Kortkort = miljø.getPrefix ("app"); String version = map.get ("version"). ToString (); Stringforfattere = map.get ("forfattere", "Ukendte forfattere"). ToString (); 

9.3. Håndtering af flere miljøer

Når vi distribuerer vores app til et andet miljø, skal vi muligvis angive forskellige indstillinger, for eksempel dem, der er relateret til databaseforbindelsen. I stedet for manuelt at udskifte application.properties fil, giver Blade os en måde at konfigurere appen til forskellige miljøer. Vi kan simpelthen holde application.properties med alle udviklingsindstillingerne og derefter Opret andre filer i den samme mappe, ligesom ansøgningsprodukt. ejendomme, der kun indeholder de indstillinger, der adskiller sig.

Under opstarten kan vi derefter specificere det miljø, vi vil bruge, og rammen fletter filerne ved hjælp af de mest specifikke indstillinger fra ansøgningsprodukt. ejendomme, og alle de andre indstillinger fra standardindstillingen application.properties fil:

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

10. Skabeloner

Templating i Blade er et modulært aspekt. Mens det integrerer en meget grundlæggende skabelonmotor, skal vi stole på en ekstern skabelonmotor til enhver professionel brug af visningerne. Det kan vi så vælg en motor blandt de tilgængelige i blad-template-motorer lager på GitHub, som er FreeMarker, Jetbrick, Rullestenog Hastighedeller endda oprette en indpakning for at importere en anden skabelon, vi kan lide.

Blades forfatter foreslår Jetbrick, et andet smart kinesisk projekt.

10.1. Brug af standardmotoren

Standardskabelonen fungerer ved at analysere variabler fra forskellige sammenhænge gennem ${} notation:

10.2. Tilslutning af en ekstern motor

Det er en leg at skifte til en anden skabelonmotor! Vi importerer simpelthen afhængigheden af ​​(bladets indpakning af) motoren:

 com.bladejava blade-skabelon-jetbrick 0.1.3 

På dette tidspunkt er det nok at skrive en simpel konfiguration for at instruere rammen om at bruge dette bibliotek:

@Bean public class TemplateConfig implementerer BladeLoader {@Override public void load (Blade blade) {blade.templateEngine (new JetbrickTemplateEngine ()); }} 

Som et resultat, nu hver fil under src / main / ressourcer / skabeloner / vil blive analyseret med den nye motor, hvis syntaks ligger uden for omfanget af denne tutorial.

10.3. Indpakning af en ny motor

Indpakning af en ny skabelonmotor kræver oprettelse af en enkelt klasse, som skal implementere TemplateEngine interface og tilsidesætte gengive () metode:

ugyldig gengivelse (ModelAndView modelAndView, forfatterforfatter) kaster TemplateException; 

Til dette formål kan vi se på koden til den aktuelle Jetbrick-indpakning for at få en idé om, hvad det betyder.

11. Logning

Blade bruger slf4j-api som logningsgrænseflade.

Det inkluderer også en allerede konfigureret logning implementering, kaldet klinge-log. Derfor behøver vi ikke importere noget; det fungerer som det er ved simpelthen at definere et Logger:

privat statisk endelig org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger (LogExample.class); 

11.1. Tilpasning af den integrerede logger

Hvis vi vil ændre standardkonfigurationen, skal vi indstille følgende parametre som Systemegenskaber:

  • Logningsniveauer (kan være "spor", "fejlretning", "info", "advare" eller "fejl"):
# Root Logger com.blade.logger.rootLevel = info # Pakke Brugerdefineret logningsniveau com.blade.logger.somepackage = debug # Klasse brugerdefineret logningsniveau com.blade.logger.com.baeldung.sample.SomeClass = spor 
  • Viste oplysninger:
# Dato og tid com.blade.logger.showDate = falsk # Dato og klokkeslæt mønster com.blade.logger.datePattern = åååå-MM-dd HH: mm: ss: SSS Z # Trådnavn com.blade.logger.showThread = true # Logger Instance Name com.blade.logger.showLogName = true # Kun den sidste del af FQCN com.blade.logger.shortName = true 
  • Logger:
# Sti com.blade.logger.dir =. / Logs # Navn (det er som standard det aktuelle app.navn) com.blade.logger.name = prøve 

11.2. Ekskluderet den integrerede logger

Selvom det allerede er konfigureret at have en integreret logger er meget praktisk at starte vores lille projekt, kan vi let ende i det tilfælde, hvor andre biblioteker importerer deres egen logningimplementering. Og i så fald er vi i stand til at fjerne den integrerede for at undgå konflikter:

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

12. Tilpasninger

12.1. Håndtering af brugerdefineret undtagelse

En undtagelsesbehandler er også indbygget som standard i rammen. Det udskriver undtagelsen fra konsollen, og hvis app.devMode er rigtigt, er stacksporingen også synlig på websiden.

Vi kan dog håndtere en undtagelse på en bestemt måde ved at definere en @Bønne udvide DefaultExceptionHandler klasse:

@Bean public class GlobalExceptionHandler udvider DefaultExceptionHandler {@Override public void handle (Exception e) {if (e instanceof BaeldungException) {BaeldungException baeldungException = (BaeldungException) e; Streng msg = baeldungException.getMessage (); WebContext.response (). Json (RestResponse.fail (msg)); } andet {super.handle (e); }}} 

12.2. Brugerdefinerede fejlsider

Tilsvarende er fejlene 404 Ikke fundet og 500 - Intern serverfejl håndteres gennem tynde standardsider.

Vi kan tvinge rammen til at bruge vores egne sider ved at erklære dem i application.properties fil med følgende indstillinger:

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

Bestemt skal disse HTML-sider placeres under src / main / ressourcer / skabeloner folder.

Inden for 500-en kan vi desuden hente undtagelsen besked og stackTrace gennem deres specielle variabler:

    500 intern serverfejl 

Følgende fejl opstod : "$ {besked}"

 $ {stackTrace} 

13. Planlagte opgaver

Et andet interessant træk ved rammen er muligheden for at planlægge udførelsen af ​​en metode.

Det er muligt ved at kommentere metoden til a @Bønne klasse med @Tidsplan kommentar:

@Bean public class ScheduleExample {@Schedule (name = "baeldungTask", cron = "0 * / 1 * * *?") Public void runScheduledTask () {System.out.println ("Dette er en planlagt opgave, der kører en gang i minuttet . "); }} 

Faktisk bruger den de klassiske cron-udtryk til at specificere Dato tid koordinater. Vi kan læse mere om dem i A Guide to Cron Expressions.

Senere vil vi muligvis udnytte de statiske metoder til Jobliste klasse til at udføre operationer på de planlagte opgaver.

  • Få alle de planlagte opgaver:
Liste allScheduledTasks = TaskManager.getTasks (); 
  • Få en opgave ved navn:
Opgave myTask = TaskManager.getTask ("baeldungTask"); 
  • Stop en opgave ved navn:
boolsk lukket = TaskManager.stopTask ("baeldungTask"); 

14. Begivenheder

Som allerede set i afsnit 9.1 er det muligt at lytte efter en bestemt begivenhed, før du kører en brugerdefineret kode.

Blade leverer følgende begivenheder ud af kassen:

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

Mens de første seks er lette at gætte, har de sidste to brug for nogle tip: MILJØ_ÆNDRET giver os mulighed for at udføre en handling, hvis en konfigurationsfil ændres, når serveren er oppe. SOURCE_CHANGEDer i stedet endnu ikke implementeret og er der kun til fremtidig brug.

Lad os se, hvordan vi kan sætte en værdi i sessionen, når den oprettes:

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

15. Implementering af sessionen

Når vi taler om sessionen, gemmer standardimplementeringen sessionsværdier i hukommelsen.

Vi vil således muligvis skifte til en anden implementering for at give cache, vedholdenhed eller noget andet. Lad os f.eks. Tage Redis. Vi skal først oprette vores RedisSession indpakning ved at implementere Session interface, som vist i dokumentationen til HttpSession.

Derefter ville det kun være et spørgsmål om at fortælle rammen, at vi vil bruge den. Vi kan gøre dette på samme måde som for den tilpassede skabelonmotor, med den eneste forskel, at vi kalder sessionType () metode:

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

16. Kommandolinjeargumenter

Når du kører Blade fra kommandolinjen, er der tre indstillinger, vi kan specificere for at ændre dens adfærd.

For det første kan vi ændre IP-adressen, som som standard er den lokale 0.0.0.0 loopback:

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

For det andet kan vi også ændre porten, som som standard er 9000:

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

Endelig, som det ses i afsnit 9.3, kan vi ændre miljøet til at lade et andet applikations-XXX.egenskaber fil, der skal læses over den standardfil, som er application.properties:

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

17. Kører i IDE

Enhver moderne Java IDE er i stand til at spille et Blade-projekt uden engang at have brug for Maven-plugins. At køre Blade i en IDE er især nyttigt, når du kører Blade Demos, eksempler skrevet udtrykkeligt for at fremvise rammens funktionaliteter. De arver alle en forælderpom, så det er lettere at lade IDE udføre arbejdet i stedet for manuelt at tilpasse dem til at blive kørt som enkeltstående apps.

17.1. Formørkelse

I Eclipse er det nok at højreklikke på projektet og starte Kør som Java-applikation, vælg vores App klasse, og tryk på Okay.

Eclipse's konsol viser dog ikke ANSI-farver korrekt og hælder deres koder i stedet:

Heldigvis løser problemet for godt ved at installere ANSI Escape in Console-udvidelsen:

17.2. IntelliJ IDEA

IntelliJ IDEA arbejder med ANSI-farver ud af kassen. Derfor er det nok at oprette projektet, højreklik på App fil, og start Kør 'App.main ()' (hvilket svarer til at trykke på Ctrl + Skift + F10):

17.3. Visual Studio-kode

Det er også muligt at bruge VSCode, en populær ikke-Java-centreret IDE, ved tidligere at installere Java Extension Pack.

Trykker på Ctrl + F5 vil derefter køre projektet:

18. Konklusion

Vi har set, hvordan vi bruger Blade til at oprette en lille MVC-applikation.

Hele dokumentationen er kun tilgængelig på kinesisk. På trods af at den hovedsagelig er udbredt i Kina takket være dets kinesiske oprindelse, har forfatteren for nylig oversat API'en og dokumenteret kernefunktionaliteterne i projektet på engelsk på GitHub.

Som altid kan vi finde kildekoden til eksemplet over på GitHub.


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