Kaip pasirinkti tinkamą pupelių plotą?

Pastebėjau, kad yra įvairių pupelių sričių, pavyzdžiui:

 @RequestScoped @ViewScoped @FlowScoped @SessionScoped @ApplicationScoped 

Kas yra kiekvieno tikslo tikslas? Kaip pasirinkti tinkamą pupelių plotą?

347
11 авг. nustatė Valter Silva 11 rug. 2011-08-11 22:44 '11, 10:44 val. 2011-08-11 22:44
@ 2 atsakymai

Įvadas

Jis atspindi pupelių apimtį (trukmę). Tai lengviau suprasti, jei esate susipažinę su „slapta“, dirbančia su pagrindine serverio žiniatinklio programa: kaip veikia servletai ? Kūrimas, sesijos, bendri kintamieji ir daugiakalbė .


@Request/View/Flow/Session/ApplicationScoped

@RequestScoped pupelės gyvena tol, kol @RequestScoped vienas HTTP užklausos atsakymo ciklas (atkreipkite dėmesį, kad Ajax prašymas taip pat laikomas vienu HTTP prašymu). „ @ViewScoped pupelės gyvena tol, kol bendraujate su tuo pačiu JSF vaizdu, naudodami postbacks, skambinančias veiksmų metodais, kurie sugrįžta void be navigacijos / peradresavimo. „ @FlowScoped pupelės gyvena tol, kol matysite nurodytą vaizdų rinkinį, užregistruotą srauto konfigūracijos faile. @SessionScoped pupelės gyvena tol, kol @SessionScoped HTTP sesija. @ApplicationScoped pupelės gyvena tol, kol veikia žiniatinklio programa. Atkreipkite dėmesį, kad CDI @Model iš esmės yra „ @Named @RequestScoped stereotipas , taigi taikomos tos pačios taisyklės.

Kokia atrankos sritis priklauso tik nuo pupelių parduotuvių ir atstovaujamų duomenų (būsenos). Naudokite @RequestScoped paprastoms ir ne YAX formoms / pristatymams. Naudokite „ @ViewScoped kad @ViewScoped gauti turtingų dinaminių vaizdų su „ajax“ palaikymu („ajaxbased“ patvirtinimas, atvaizdavimas, dialogai ir pan.). Naudokite „ @FlowScoped “ pagrindiniam šablonui („klausimynui“) rinkti įvesties duomenis, platinamus keliuose puslapiuose. Naudokite @SessionScoped tam tikrus kliento duomenis, pvz., Vartotojo ir vartotojo nustatymus (kalbą ir kt.). Naudokite „ @ApplicationScoped norite naudoti duomenis / konstantas, pvz., Išskleidžiamuosius sąrašus, kurie yra vienodi visiems, arba valdomas pupeles be jokio pavyzdžio kintamojo ir turinčių tik metodus.

@ApplicationScoped pupelių duomenų pažeidimas sesijos / peržiūros / užklausos duomenims suteiks jį visiems naudotojams, todėl kiekvienas kitas gali matyti vieni kitus, o tai tiesiog neteisinga. @SessionScoped pupelių „ @SessionScoped “ peržiūrą / užklausą su juo, jis bus prieinamas visiems vienos naršyklės sesijos skirtukams / >@RequestScoped pupelių, kad galėtumėte peržiūrėti matomus duomenis, galėsite peržiūrėti duomenis, kurių apimtis priklauso nuo numatytosios reikšmės kiekvienam atskiram („ajax“) atgaliniam pranešimui, sukeldami galbūt ne darbo formas ( taip pat žr. 4 ir 5 punktus čia ). Piktnaudžiavimas „ @ViewScoped pupelėmis užklausai, sesijai ar taikomiesiems duomenims ir piktnaudžiavimui „ @SessionScoped pupelėmis programoms, kuriose taikoma programa, neturi įtakos klientui, tačiau ji be reikalo užima serverio atmintį ir yra neveiksminga.

Atkreipkite dėmesį, kad taikymo sritis neturėtų būti parinkta priklausomai nuo veiklos rezultatų, jei tikrai neturite pakankamai atminties ir norite visiškai likti be pilietybės; jums reikės naudoti tik @RequestScoped pupeles ir scenarijų su užklausos parametrais, kad išlaikytumėte kliento būseną. Taip pat atkreipkite dėmesį, kad kai turite vieną JSF puslapį su duomenimis su įvairaus tikslumo laipsniu, tai puikiai tinka, kai jie pateikiami atskirai paramai pupelių srityje, atitinkančioje duomenų sritį. gali tiesiog pasiekti vieni kitus per „ @ManagedProperty “ valdomų JSF pupelių arba „ @Inject “ atveju, jei valdomos CDI pupelės.

Taip pat žiūrėkite:


border=0

@CustomScoped/NoneScoped/Dependent

Jame jūsų klausimas nėra paminėtas, tačiau (palikimas) JSF taip pat palaiko @CustomScoped ir @NoneScoped , kurios retai naudojamos realiame pasaulyje. @CustomScoped turėtų remtis pasirinktiniu Map<K, Bean> įgyvendinimu tam tikroje platesnėje srityje, kuri iš naujo apibrėžė Map#put() ir / arba Map#get() , kad būtų daugiau smulkiau kontroliuojamos pupelių kūrimo ir (arba) sunaikinimo.

JSF @NoneScoped ir CDI @Dependent iš esmės gyvena vieninteliu pupelių EL balu. Pateikite prisijungimo formą su dviem įvesties laukais, kurie nurodo pupelių nuosavybę, ir komandų mygtuką, nurodantį veiksmų pupelę, todėl iš viso bus trys EL išraiškos. Vienas su naudotojo vardu, vienas iš jų yra slaptažodžių rinkinys ir vienas, kuriuo naudojamas veiksmas. Paprastai šią sritį norite naudoti tik pupelėms, kurios turėtų gyventi iki pupelių, kur jos yra įvestos. Todėl, jei į @NoneScoped įrašytas @NoneScoped arba @Dependent , tada jis bus gyvas iki @SessionScoped pupelių.

Taip pat žiūrėkite:


border=0

„Flash“ atminties dydis

Kaip ir anksčiau, JSF taip pat palaiko blykstės plotą. Jį palaiko trumpas tiesioginis slapukas, susijęs su duomenų įvedimu sesijos srityje. Prieš peradresuojant HTTP atsakymas bus nustatytas į slapuką, kurio vertė yra unikali su duomenų įvedimu sesijos srityje. Po peradresavimo bus tikrinamas taikymo srities failo slapuko buvimas ir su slapuku susietas duomenų įrašas bus pašalintas iš sesijos srities ir bus patalpintas į peradresuoto užklausos užklausos sritį. Galiausiai slapukas bus pašalintas iš HTTP atsakymo. Taigi peradresuotas prašymas turi prieigą prie duomenų su prašymu, kurie buvo parengti pradiniame prašyme.

Tai iš tikrųjų nėra valdomos srities pupelių, t. Y. Nėra tokio dalyko kaip @FlashScoped . Blykstės sritis yra tik žemėlapis per ExternalContext#getFlash() valdomose pupelėse ir #{flash} EL.

Taip pat žiūrėkite:

444
11 авг. Atsakymą pateikė BalusC 11 rug . 2011-08-11 22:50 '11 10:50 val. 2011-08-11 22:50

Nuo JSF 2.x yra 4 pupelių plotai:

  • @SessionScoped
  • @RequestScoped
  • @ApplicationScoped
  • @ViewScoped

Sesijos apimtis : sesijos apimtis yra palaikoma nuo sesijos sudarymo iki sesijos pabaigos. Sesija nutraukiama, jei žiniatinklio programa „HttpSession“ skambina negaliojančiu metodu arba baigiasi jo galiojimo laikas.

RequestScope: užklausos sritis yra trumpalaikė. Jis prasideda, kai HTTP užklausa išsiunčiama ir baigiasi pasibaigus atsakymo išsiuntimui klientui. Jei į užklausos sritį įdėjote valdomą pupelę, su kiekvienu prašymu sukuriamas naujas pavyzdys. Reikėtų apsvarstyti prašymą, jei esate susirūpinęs dėl sesijos srities saugojimo išlaidų.

„ApplicationScope“: taikomoji sritis yra palaikoma visoje interneto programoje. Ši sritis yra paskirstyta tarp visų užklausų ir visų sesijų. Jei pavienės pupelės turi būti bendros visoms žiniatinklio taikomosios programos egzemplioriams, galite tvarkyti pupeles. Pupelės sukuriamos, kai ją pirmą kartą prašo bet kuris programos naudotojas, ir jis lieka gyvas, kol žiniatinklio programa bus pašalinta iš programos serverio.

„ViewScope“: „JSF 2.0“ buvo pridėtas peržiūros > . Pupelių apimtis išsaugoma tol, kol bus rodomas tas pats JSF puslapis. (JSF specifikacijoje naudojamas terminas „JSF“ puslapis.) Kai vartotojas persikelia į kitą puslapį, pupelės išeina už taikymo srities ribų.

Pasirinkite taikymo sritį pagal savo poreikius.

border=0

Šaltinis: David Giri“ ir „Kay Horstmann“ „ Core Java Server Faces“ 3-asis leidimas [Page #. 51 - 54] 2019

115
16 июля '13 в 20:18 2013-07-16 20:18 atsakymą pateikė Kishor Prakash, liepos 16, 13, 20:18 2013-07-16 20:18