Route Patterns
Reittimallit käytetään määrittämään, miten URL-osoitteet vastaavat tiettyihin näkymiin, mukaan lukien dynaamiset ja valinnaiset segmentit, säännönmukaiset lausekkeet ja jokerimerkit. Reittimallit mahdollistavat kehyksen URL-osoitteiden täsmäyttämisen, parametrien erottamisen ja URL-osoitteiden dynaamisen luomisen. Ne näyttelevät kriittistä roolia sovelluksen navigoinnin ja komponenttien renderöinnin jäsentelyssä selaimen sijainnin perusteella.
Reittimallin syntaksi
Reittimallit webforJ:ssä ovat erittäin joustavia ja tukevat seuraavia ominaisuuksia:
- Nimetyt parametrid: Merkitään muodossa
:paramName
, ne ovat pakollisia, ellei niitä ole merkitty valinnaisiksi. - Valinnaiset parametrit: Merkitään muodossa
:paramName?
, ne voidaan jättää pois URL-osoitteesta. - Jokerimerkki segmentit: Edustettuna merkillä
*
, ne sieppaavat kaikki jäljelle jäävät URL-segmentit. - Säännönmukaisen lausekkeen rajoitukset: Rajoituksia voidaan lisätä vain nimettyihin parametreihin (esimerkiksi
:id<[0-9]+>
).
Esimerkki reittimallin määrittelyistä
@Route("asiakas/:id<[0-9]+>/nimeltä/:nimi/*")
public class AsiakasNäkymä extends Composite<Div> implements DidEnterObserver {
@Override
public void onDidEnter(DidEnterEvent event, ParametersBag parameters) {
int id = parameters.getInt("id").orElse(0);
String nimi = parameters.getAlpha("nimi").orElse("Tuntematon");
String extra = parameters.getAlpha("*").orElse("");
String tulos =
"Asiakas ID: " + id + "-" +
"Nimi: " + nimi + "-" +
"*: " + extra;
console().log(tulos);
}
}
Tässä esimerkissä:
:id<[0-9]+>
sieppaa numeerisen asiakas-ID:n.:nimi
sieppaa nimen.*
sieppaa kaikki ylimääräiset polkusegmentitnimeltä/:nimi
jälkeen.
Nimetyt parametrit
Nimetyt parametrit määritellään etuliitteellä kaksoispiste :
parametrin nimen edessä mallissa. Ne ovat pakollisia, ellei niitä ole merkitty valinnaisiksi. Nimetyt parametrit voivat myös sisältää säännönmukaisen lausekkeen rajoitukset arvojen validoimiseksi.
Esimerkki:
@Route("tuote/:id")
public class TuoteNäkymä extends Composite<Div> {
// Komponenttilogiikka tähän
}
Tämä malli vastaa URL-osoitteita, kuten /tuote/123
, jossa id
on 123
.
Valinnaiset parametrit
Valinnaiset parametrit merkitään lisäämällä ?
parametrin nimen jälkeen. Nämä segmentit eivät ole pakollisia ja ne voidaan jättää pois URL-osoitteesta.
Esimerkki:
@Route("tilaus/:id?<[0-9]+>")
public class TilausNäkymä extends Composite<Div> implements DidEnterObserver {
@Override
public void onDidEnter(DidEnterEvent event, ParametersBag parameters) {
parameters.getInt("id").ifPresentOrElse(
id -> console().log("Tilaus ID: " + id),
() -> console().log("Tilaus ID:tä ei annettu")
);
}
}
Tämä malli vastaa sekä /tilaus/123
sisältäen numeerisen arvon, että /tilaus
, jolloin numeerista arvoa voidaan jättää pois, kun /tilaus
syötetään.
Säännönmukaisen lausekkeen rajoitukset
Voit soveltaa säännönmukaisen lausekkeen rajoituksia parametreihin lisäämällä ne kulmasulkeisiin <>
. Tämä mahdollistaa tiukempien vastaavuus sääntöjen määrittämisen parametreille.
Esimerkki:
@Route("tuote/:koodi<[A-Z]{3}-[0-9]{4}>")
public class TuoteNäkymä extends Composite<FlexLayout> implements DidEnterObserver {
@Override
public void onDidEnter(DidEnterEvent event, ParametersBag parameters) {
parameters.get("koodi").ifPresentOrElse(
koodi -> console().log("Tuotekoodi: " + koodi),
() -> console().error("Tuotekoodia ei löytynyt"));
}
}
Tämä malli vastaa vain tuotekoodeja, jotka ovat muodossa ABC-1234
. Esimerkiksi /tuote/XYZ-5678
sopii, mutta /tuote/abc-5678
ei sovi.
Jokerimerkki segmentit
Jokerimerkkejä voidaan käyttää koko polun sieppaamiseen tietyn reittisegmentin jälkeen, mutta ne voivat olla vain mallin viimeinen segmentti, ratkaisten kaikki jäljellä olevat arvot URL-osoitteessa. Parempaa luettavuutta varten jokerimerkki segmenttejä voidaan nimetä. Kuitenkin, toisin kuin nimetyillä parametreilla, jokerimerkki segmenteillä ei voi olla rajoituksia.
Esimerkki:
@Route("tiedostot/:polku*")
public class TiedostoHallintaNäkymä extends Composite<Div> implements DidEnterObserver {
@Override
public void onDidEnter(DidEnterEvent event, ParametersBag parameters) {
parameters.get("polku").ifPresentOrElse(
polku -> console().log("TiedostoHallintaNäkymä: " + polku),
() -> console().log("TiedostoHallintaNäkymä: Ei polkuparametria")
);
}
}
Tämä malli vastaa mitä tahansa URL-osoitetta, joka alkaa /tiedostot
ja sieppaa loput polusta jokerimerkkinä.
Reittien prioriteetti
Kun useat reitit vastaavat tiettyä URL-osoitetta, reitin prioriteetti määrittää, mikä reitti valitaan ensin. Tämä on erityisen hyödyllistä, kun kaksi tai useampi reitti päällekkäin niiden polkumalleissa, ja tarvitset keinon hallita, mikä niistä saa etusijan. Prioriteettiattribuutti on käytettävissä sekä @Route
että @RouteAlias
-annotaatioissa.
Miten prioriteettijärjestelmä toimii
Prioriteettiattribuutti sallii reitittimen määrittää sen järjestyksen, jossa reittejä arvioidaan, kun useat reitit voisivat vastata tiettyä URL-osoitetta. Reitit lajitellaan niiden prioriteettiarvojen mukaan, ja korkeampi prioriteetti (alhaisemmat numeeriset arvot) vastaa ensin. Tämä varmistaa, että tarkemmat reitit saavat etusijan yleisempiin verrattuna.
Jos kaksi reittiä jakaa saman prioriteetin, reititin ratkaisee konfliktin valitsemalla ensin rekisteröidyn reitin. Tämä mekanismi varmistaa, että oikea reitti valitaan, jopa silloin, kun useat reitit päällekkäin niiden URL-malleissa.
Oletuksena kaikille reiteille annetaan prioriteetti 10
.
Esimerkki: Konfliktiset reitit
Kuvitellaan tilanne, jossa kaksi reittiä vastaavat samankaltaisia URL-malleja:
@Route(value = "tuotteet/:kategoria", priority = 9)
public class TuoteKategoriaNäkymä extends Composite<Div> implements DidEnterObserver {
@Override
public void onDidEnter(DidEnterEvent event, ParametersBag parameters) {
String kategoria = parameters.get("kategoria").orElse("tuntematon");
console().log("Näytetään kategoria: " + kategoria);
}
}
@Route(value = "tuotteet/:kategoria/:tuoteId?<[0-9]+>")
public class TuoteNäkymä extends Composite<Div> implements DidEnterObserver {
@Override
public void onDidEnter(DidEnterEvent event, ParametersBag parameters) {
String tuoteId = parameters.get("tuoteId").orElse("tuntematon");
console().log("Näytetään tuote: " + tuoteId);
}
}
Tässä on, miten prioriteettijärjestelmä auttaa ratkaisemaan konflikteja:
TuoteKategoriaNäkymä
vastaa URL-osoitteita, kuten/tuotteet/elektroniikka
.TuoteNäkymä
vastaa tarkempiin URL-osoitteisiin, kuten/tuotteet/elektroniikka/123
, jossa123
on tuote-ID.
Tässä tapauksessa molemmat reitit voisivat vastata URL-osoitteeseen /tuotteet/elektroniikka
. Kuitenkin, koska TuoteKategoriaNäkymä
:llä on korkeampi prioriteetti (prioriteetti = 9), se valitaan ensin, kun URL-osoitteessa ei ole tuoteId
:tä. URL-osoitteissa, kuten /tuotteet/elektroniikka/123
, TuoteNäkymä
valitaan tuoteId
parametrin vuoksi.