Usmjeravanje u aplikacijama za reprodukciju na Javi

1. Pregled

Usmjeravanje je uobičajeni koncept koji se pojavljuje u većini okvira za web razvoj, uključujući Spring MVC.

Ruta je URL obrazac koji se preslikava na rukovatelj. Rukovatelj može biti fizička datoteka, kao što je materijal koji se može preuzeti u web aplikaciji ili klasa koja obrađuje zahtjev, poput upravljača u MVC aplikaciji.

U ovom uputstvu istražit ćemo aspekt usmjeravanja u razvoju web aplikacija s Play Frameworkom.

2. Postavljanje

Prvo ćemo morati stvoriti Java Play aplikaciju. Pojedinosti o tome kako postaviti Play Framework na stroju dostupni su u našem uvodnom članku.

Na kraju postavljanja trebali bismo imati aktivnu aplikaciju Play kojoj možemo pristupiti iz preglednika.

3. HTTP usmjeravanje

Pa kako Play zna s kojim se kontrolerom treba obratiti kad god pošaljemo HTTP zahtjev? Odgovor na ovo pitanje leži u app / conf / routes konfiguracijska datoteka.

Playov usmjerivač prevodi HTTP zahtjeve u akcijske pozive. HTTP zahtjevi smatraju se događajima u MVC arhitekturi a usmjerivač na njih reagira savjetujući se s mrežom rute datoteka za koji kontroler i koju radnju u tom kontroleru treba izvršiti.

Svaki od ovih događaja opskrbljuje usmjerivač s dva parametra: stazom zahtjeva sa svojim nizom upita i HTTP metodom zahtjeva.

4. Osnovno usmjeravanje s igrom

Da bi usmjerivač radio svoj posao, konf / rute datoteka mora definirati preslikavanje HTTP metoda i URI obrazaca kako bi se prikladne akcije kontrolora:

GET / controllers.HomeController.index GET / assets / * kontrolori datoteka.Assets.versioned (put = "/ public", datoteka: Asset)

Sve datoteke ruta moraju također mapirati statičke resurse u usmjeravanje / javno mapa dostupna klijentu na /imovina krajnja točka.

Primijetite sintaksu definiranja HTTP ruta i HTTP metode prostor URI uzorak prostor djelovanje kontrolera.

5. URI uzorci

U ovom ćemo odjeljku malo objasniti URI obrasce.

5.1. Statički URI uzorci

Prva tri URI uzorka gore su statična. To znači da se mapiranje URL-ova u resurse događa bez daljnje obrade u radnjama kontrolera.

Sve dok se poziva metoda kontrolera, ona vraća statički resurs čiji je sadržaj određen prije zahtjeva.

5.2. Dinamički URI uzorci

Zadnji URI obrazac gore je dinamičan. To znači da su radnji kontrolera koja servisira zahtjev na tim URI-ima potrebne neke informacije iz zahtjeva da bi se odredio odgovor. U gore navedenom slučaju očekuje naziv datoteke.

Uobičajeni slijed događaja je da usmjerivač prima događaj, odabire put iz URL-a, dekodira svoje segmente i prosljeđuje ih kontroleru.

Parametri puta i upita zatim se ubrizgavaju u radnju regulatora kao parametri. To ćemo pokazati na primjeru u sljedećim odjeljcima.

6. Napredno usmjeravanje s igrom

U ovom ćemo dijelu detaljno razmotriti napredne mogućnosti usmjeravanja pomoću dinamičkih URI uzoraka.

6.1. Jednostavni parametri puta

Parametri jednostavne putanje su neimenovani parametri u URL-u zahtjeva koji se pojavljuju nakon hosta i porta i raščlanjuju se prema redoslijedu pojavljivanja.

Iznutra usmjeravanje reprodukcije / aplikacija / HomeController.java, kreirajmo novu akciju:

javni pozdrav rezultata (naziv niza) {return ok ("Zdravo" + ime); }

Želimo biti u mogućnosti odabrati parametar puta s URL-a zahtjeva i preslikati ga na ime varijable.

Usmjerivač će dobiti te vrijednosti iz konfiguracije rute.

Pa, otvorimo play-routing / conf / routes i stvorite mapiranje za ovu novu akciju:

GET / greet /: kontrolori imena.HomeController.greet (naziv: String)

Primijetite kako usmjeravač obavještavamo da je naziv segment dinamičke staze sa sintaksom dvotačke, a zatim ga prosljeđujemo kao parametar pozivu akcije pozdrava.

Sad, hajdemo učitati // locahost: 9000 / greet / john u pregledniku, a nas će dočekati ime:

Pozdrav John

Tako se dogodi da ako je naš parametar akcije tipa stringa, možemo ga proslijediti tijekom poziva za akciju bez navođenja vrste parametra, iako to nije isto za druge vrste.

Začinimo svoje /pozdraviti krajnja točka s podacima o dobi.

Natrag na HomeControllerPozdravnu akciju, promijenit ćemo je u:

javni rezultat Pozdrav (Ime niza, int starost) {return ok ("Pozdrav" + ime + ", imate" + dob + "godine"); }

I put do:

GET / greet /: name /: age controllers.HomeController.greet (name: String, age: Integer)

Primijetite i sintaksu Scala za deklariranje varijable, dob: Cijeli broj. U Javi bismo koristili Cijela dob sintaksa. Play Framework izgrađen je u Scali. Slijedom toga, postoji puno sintakse scala.

Učitajmo // localhost: 9000 / greet / john / 26:

Pozdrav john, imaš 26 godina

6.2. Zamjenski znakovi u parametrima puta

U našoj datoteci za konfiguraciju ruta, posljednje mapiranje je:

GET / assets / * kontrolori datoteka.Assets.versioned (path = "/ public", datoteka: Asset)

U dinamičnom dijelu staze koristimo zamjenski znak. Ono što poručujemo Playu je da bilo koja vrijednost zamjenjuje *datoteka u stvarnom zahtjevu treba raščlaniti u cjelini, a ne dekodirati kao u drugim slučajevima parametara puta.

U ovom primjeru, kontroler je ugrađen, Imovina, koji omogućuje klijentu preuzimanje datoteka s usmjeravanje / javno mapu. Kad opterećujemo //localhost:9000/assets/images/favicon.png, trebali bismo vidjeti sliku ikone za reprodukciju u pregledniku jer je ona prisutna u / javno / slike mapu.

Stvorimo vlastiti primjer akcije u HomeController.java:

javni rezultat IntroduMe (podaci niza) {String [] clientData = data.split (","); return ok ("Vaše ime je" + clientData [0] + ", vi ste" + clientData [1] + "godina"); }

Primijetite da u ovoj akciji primamo jedan parametar String i primjenjujemo našu logiku za njegovo dekodiranje. U ovom je slučaju logika podijeliti zarez Niz u niz. Prije smo ovisili o usmjerivaču koji će nam dekodirati te podatke.

S zamjenskim znakovima mi smo svoji na svome. Nadamo se da će klijent ispraviti našu sintaksu prilikom prosljeđivanja ovih podataka. U idealnom slučaju, trebali bismo provjeriti dolazni niz prije nego što ga upotrijebimo.

Stvorimo put do ove akcije:

GET / * kontroleri podataka.HomeController.introduceMe (podaci)

Učitajte URL // localhost: 9000 / john, 26. Ovo će ispisati:

Zovete se John, imate 26 godina

6.3. Redovni izraz u parametrima puta

Kao i zamjenski znakovi, za dinamički dio možemo koristiti regularne izraze. Dodajmo akciju koja prima broj i vraća mu kvadrat:

javni Rezultat squareMe (Long num) {return ok (num + "Kvadrat je" + (num * num)); }

Sada ćemo dodati njegovu rutu:

GET / kvadrat / $ num kontroleri.HomeController.squareMe (num: Long)

Postavimo ovu rutu ispod Upoznaj me put za uvođenje novog koncepta. S ovom konfiguracijom usmjeravanja možemo se nositi samo s rutama gdje je dio regularnog izraza pozitivan cijeli broj.

Sada, ako smo stavili rutu kako je navedeno u prethodnom odlomku, i učitavamo // localhost: 9000 / kvadrat / 2, trebali bismo nas pozdraviti s ArrayIndexOutOfBoundsException:

Ako provjerimo zapisnike pogrešaka u konzoli poslužitelja, shvatit ćemo da je poziv za akciju zapravo izveden Upoznaj me radnja nego kvadratMe akcijski. Kao što je ranije rečeno o zamjenskim znakovima, mi smo svoji na svome i nismo provjerili dolazne podatke.

Umjesto niza razdvojenog zarezom, Upoznaj me metoda pozvana je nizom "kvadrat / 2“. Posljedično, nakon što smo ga podijelili, dobili smo niz veličine jedan. Pokušaj dosezanja indeksa 1 zatim bacio iznimku.

Naravno, očekivali bismo da će poziv biti preusmjeren na kvadratMe metoda. Zašto je preusmjeren na Upoznaj me? Razlog je Play značajka koju ćemo sljedeći nazvati Prioritet usmjeravanja.

7. Prioritet usmjeravanja

Ako postoji sukob između ruta kao što postoji između kvadratMe i Upoznaj me, onda Play odabire prvu rutu redoslijedom deklaracije.

Zašto postoji sukob? Zbog staze konteksta zamjenskog znaka /*podaci odgovara bilo kojem URL-u zahtjeva osim osnovne putanje /. Tako svaka ruta čiji URI obrazac koristi zamjenske znakove trebala bi se pojaviti zadnja po redu.

Sada promijenimo redoslijed deklaracije ruta tako da Upoznaj me ruta dolazi nakon kvadratMe i ponovno učitajte:

2 na kvadrat je 4

Pokušajte učitati snagu regularnih izraza u ruti // locahost: 9000 / kvadrat / -1, usmjerivač neće uspjeti podudarati se s kvadratMe ruta. Umjesto toga, podudarat će se Upoznaj me, i dobit ćemo ArrayIndexOutOfBoundsException opet.

Ovo je zbog -1 ne podudara se s navedenim regularnim izrazom, kao ni bilo koji abecedni znak.

8. Parametri

Do ovog trenutka pokrivali smo sintaksu deklariranja vrsta parametara u datoteci ruta.

U ovom ćemo odjeljku pogledati više opcija koje su nam dostupne kada se bavimo parametrima u rutama.

8.1. Parametri s fiksnim vrijednostima

Ponekad ćemo za parametar htjeti koristiti fiksnu vrijednost. Ovo je naš način da kažemo Playu da koristi navedeni parametar puta ili ako je kontekst zahtjeva put /, zatim upotrijebite određenu fiksnu vrijednost.

Drugi način na koji se može gledati je imati dvije krajnje točke ili staze konteksta koje vode do iste radnje kontrolera - s tim da jedna krajnja točka zahtijeva parametar iz URL-a zahtjeva, a zadana je druga za slučaj da spomenuti parametar odsustvuje.

Da bismo to demonstrirali, dodajte a pisac() akcija na HomeController:

javni Pisac rezultata () {return ok ("Usmjeravanje u igri Baeldunga"); }

Pod pretpostavkom da ne želimo uvijek da naš API vrati a Niz:

Usmjeravanje u igri Baeldunga

Želimo je kontrolirati slanjem imena autora članka zajedno sa zahtjevom, a zadana vrijednost je fiksna vrijednost Baeldung samo ako zahtjev nema Autor parametar.

Pa dalje promijenimo pisac akcija dodavanjem parametra:

javni pisac rezultata (autor niza) {return ok ("REST API with Play by" + autor); }

Pogledajmo i kako ruti dodati parametar fiksne vrijednosti:

GET / pisači kontrolora.HomeController.writer (autor = "Baeldung") GET / pisači /: autori kontrolera.HomeController.writer (autor: String)

Primijetite kako sada imamo dvije odvojene rute koje sve vode do HomeController.index radnja umjesto jedne.

Kad sada učitavamo // localhost: 9000 / pisac iz preglednika dobivamo:

Usmjeravanje u igri Baeldunga

A kad opterećujemo // localhost: 9000 / pisac / john, dobivamo:

Usmjeravanje u Playu od Johna

8.2. Parametri sa zadanim vrijednostima

Osim fiksnih vrijednosti, parametri mogu imati i zadane vrijednosti. Obje pružaju zamjenske vrijednosti parametrima radnje regulatora u slučaju da zahtjev ne pruža potrebne vrijednosti.

Razlika između njih je ta fiksne vrijednosti koriste se kao zamjenske za parametre puta, dok se zadane vrijednosti koriste kao zamjenske za parametre upita.

Parametri puta su oblika // localhost: 9000 / param1 / param2 a parametri upita su oblika // localhost: 9000 /? param1 = value1¶m2 = value2.

Druga je razlika u sintaksi deklariranja njih dvije u ruti. Parametri fiksne vrijednosti koriste operator dodjele kao u:

autor = "Baeldung"

Iako zadane vrijednosti koriste drugu vrstu dodjele:

autor? = "Baeldung"

Koristimo ?= operator koji uvjetno dodjeljuje Baeldung do Autor u slučaju Autor utvrđeno je da ne sadrži vrijednost.

Da bismo imali potpunu demonstraciju, kreirajmo HomeController.writer akcijski. Recimo, osim imena autora koje je parametar puta, želimo proslijediti i autora iskaznica kao parametar upita koji bi trebao biti zadan na 1 ako nije proslijeđen u zahtjevu.

Promijenit ćemo se pisac akcija za:

javni pisac rezultata (autor niza, int id) {return ok ("Usmjeravanje u reprodukciji prema:" + autor + "ID:" + id); }

i pisac rute do:

GET / pisači kontrolora.HomeController.writer (author = "Baeldung", id: Int? = 1) GET / writer /: author controllers.HomeController.writer (autor: String, id: Int? = 1)

Učitava se // localhost: 9000 / pisac mi vidimo:

Usmjeravanje u igri: Baeldung ID: 1

Udaranje // localhost: 9000 / writer? id = 10 daje nam:

Usmjeravanje u igri: Baeldung ID: 10

Što o tome // localhost: 9000 / pisac / john?

Usmjeravanje u Playu od: john ID: 1

I konačno, // localhost: 9000 / writer / john? id = 5 vraća:

Usmjeravanje u Playu od: john ID: 5

9. Zaključak

U ovom smo članku istražili pojam usmjeravanja u aplikacijama Play. Također imamo članak o izgradnji RESTful API-ja s Play Framework-om, gdje se koncepti usmjeravanja u ovom vodiču primjenjuju u praktičnom primjeru.

Kao i obično, izvorni kod za ovu lekciju dostupan je na GitHubu.


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