Як правільна выбраць вобласць bean?

Я заўважыў, што існуюць розныя вобласці bean, такія як:

 @RequestScoped @ViewScoped @FlowScoped @SessionScoped @ApplicationScoped 

Якая мэта кожнага? Як выбраць прыдатную вобласць для майго bean?

347
11 авг. зададзены Valter Silva 11 жнів. 2011-08-11 22:44 '11 у 22:44 2011-08-11 22:44
@ 2 адказаў

ўвядзенне

Ён уяўляе вобласць дзеяння (час жыцця) bean. Гэта прасцей зразумець, калі вы знаёмыя з "пад прыкрыццём", працуючы з базавым вэб-дадаткам сэрвлета: Як працуюць сэрвлета? Стварэнне, сеансы, агульныя зменныя і шматструменнасць .


@Request/View/Flow/Session/ApplicationScoped

A @RequestScoped Bean жыве да таго часу, пакуль адзін цыкл HTTP-запыту-адказу (звярніце ўвагу, што запыт Ajax лічыцца адзінкавым HTTP-запыт таксама). A @ViewScoped Bean жыве да таго часу, пакуль вы ўзаемадзейнічаеце з адным і тым жа прадстаўленнем JSF з дапамогай postbacks, якія выклікаюць метады дзеянняў, якія вяртаюць null / void без навігацыі / перанакіраванні. A @FlowScoped Bean жыве да таго часу, пакуль вы праглядаеце паказаную калекцыю уяўленняў, зарэгістраваных у файле канфігурацыі патоку. A @SessionScoped Bean жыве да таго часу, пакуль усталяваны сеанс HTTP. @ApplicationScoped Bean жыве да таго часу, пакуль выконваецца вэб-дадатак. Звярніце ўвагу, што CDI @Model у асноўным ўяўляе сабой стэрэатып для @Named @RequestScoped , таму ўжываюцца тыя ж правілы.

Якая вобласць выбару залежыць толькі ад даных (стану), якія bean захоўвае і ўяўляе. Выкарыстоўвайце @RequestScoped для простых і неаяксных формаў / прэзентацый. Выкарыстоўвайце @ViewScoped для багатых дынамічных уяўленняў з падтрымкай ajax (ajaxbased validation, rendering, dialogs і г.д.). Выкарыстоўвайце @FlowScoped для шаблону "майстар" ( "апытальнік") для збору ўваходных дадзеных, размеркаваных па некалькіх старонках. Выкарыстоўвайце @SessionScoped для канкрэтных дадзеных кліента, такіх як карыстацкія налады карыстальніка і карыстальніка (мова і г.д.). Выкарыстоўвайце @ApplicationScoped для даных / канстант прыкладання, такіх як якія расчыняюцца спісы, якія з'яўляюцца аднолькавымі для ўсіх, або кіраваныя beans без якіх-небудзь зменных асобніка і якія маюць толькі метады.

Парушэнне дадзеных @ApplicationScoped Bean для дадзеных сеансу / прагляду / запыту зробіць іх даступнымі для ўсіх карыстальнікаў, таму хто-небудзь яшчэ можа бачыць адзін аднаго, што проста няправільна. Парушэнне дадзеных @SessionScoped Bean для прагляду / запыту з прывязкай дазволіць зрабіць яго даступным для ўсіх ўкладак / вокнаў у адным сеансе браўзэра, таму ў канчатковага карыстальніка могуць узнікнуць неадпаведнасці пры ўзаемадзеянні з кожным прадстаўленнем пасля пераключэння паміж укладкамі, якія з'яўляюцца дрэннымі для Карыстацкі вопыт. Пры злоўжыванні дадзенымі @RequestScoped Bean для прагляду з бачнымі дадзенымі можна было б паўторна праглядзець дадзеныя з вобласцю бачнасці да значэння па змаўчанні для кожнай асобнай (ajax) зваротнай перадачы, выклікаючы, магчыма, непрацуючыя формы ( гл. Таксама пункты 4 і 5 тут ). Злоўжыванне @ViewScoped Bean для дадзеных запыту, сеансу або прыкладання і злоўжыванне дадзенымі @SessionScoped Bean для прыкладанняў з ахопам прыкладання не ўплывае на кліента, але яно неапраўдана займае памяць сервера і з'яўляецца неэфектыўным.

Звярніце ўвагу, што вобласць ўжывання не павінна выбірацца ў залежнасці ад наступстваў для прадукцыйнасці, калі ў вас сапраўды недастаткова памяці і вы жадаеце цалкам застацца без грамадзянства; вам трэба будзе выкарыстоўваць выключна @RequestScoped Beans і скриптировать з параметрамі запыту для падтрымання стану кліента. Таксама зьвярніце ўвагу, што калі ў вас ёсць адна старонка JSF з дадзенымі з рознай ступенню дакладнасці, то гэта цалкам справядліва для размяшчэння іх у асобным падтрымцы beans ў вобласці, якая адпавядае вобласці дадзеных. можа проста звяртацца адзін да аднаго праз @ManagedProperty ў выпадку кіраванага JSF beans або @Inject ў выпадку кіраванага CDI beans.

Гл. Таксама:


border=0

@CustomScoped/NoneScoped/Dependent

Ён не згадваецца ў вашым пытанні, але (спадчына) JSF таксама падтрымлівае @CustomScoped і @NoneScoped , якія рэдка выкарыстоўваюцца ў рэальным свеце. @CustomScoped павінен спасылацца на карыстацкую рэалізацыю Map<K, Bean> ў некаторай больш шырокай вобласці, якая перавызначыць Map#put() і / або Map#get() , каб мець больш дробназярністы кантроль над стварэннем і / або знішчэннем bean.

JSF @NoneScoped і CDI @Dependent ў асноўным жыве пакуль адзіная EL-адзнака на bean. Уявіце форму ўваходу ў сістэму з двума палямі ўводу, якія спасылаюцца на ўласцівасць bean, і кнопку каманды, якія спасылаюцца на дзеянне bean, такім чынам, у агульнай складанасці тры EL-выразы, тады эфектыўна будуць створаны тры асобніка. Адзін з імем карыстальніка, адным з якіх з'яўляецца набор пароляў і адзін, на якім выклікаецца дзеянне. Звычайна вы хочаце выкарыстоўваць гэтую вобласць дзеяння толькі на beans, якая павінна жыць да таго часу, пакуль bean, дзе яна будзе ўведзена. Таму, калі а @NoneScoped або @Dependent ўводзіцца ў @SessionScoped , тады ён будзе жыць да таго часу, пакуль @SessionScoped Bean.

Гл. Таксама:


border=0

Аб'ём флэш-памяці

Як і ў мінулым, JSF таксама падтрымлівае флэш-вобласць. Ён падтрымліваецца кароткім жывым печывам, які звязаны з уводам дадзеных у галіне сеансу. Перад перанакіраваннем ў адказе HTTP будзе ўсталяваны файл cookie са значэннем, якое адназначна звязана з уводам дадзеных у галіне сеансу. Пасля перасылкі будзе правярацца наяўнасць печыва файла вобласці бачнасці і запіс дадзеных, звязаная з файлам cookie, будзе выдаленая з вобласці сеансу і змешчана ў вобласць запыту перанакіраванне запыту. Нарэшце, cookie будзе выдалены з адказу HTTP. Такім чынам, перанакіраванне запыт мае доступ да дадзеных з запытам, якія былі падрыхтаваны ў першапачатковым запыце.

Гэта фактычна недаступна як кіраваная вобласць bean, г.зн. няма такой рэчы, як @FlashScoped . Вобласць флэш-памяці даступная толькі ў выглядзе карты праз ExternalContext#getFlash() у кіраваных beans і #{flash} ў EL.

Гл. Таксама:

444
11 авг. адказ дадзены BalusC 11 жнів. 2011-08-11 22:50 '11 а 22:50 2011-08-11 22:50

Па стане на JSF 2.x ёсць 4 Bean Галіне:

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

Сфера ахопу сеансу: сфера дзеяння сеансу захоўваецца з моманту ўстанаўлення сеансу да завяршэння сеансу. Сесія завяршаецца калі вэб-дадатак выклікае метад invalidate на HttpSession, або калі ён скончыцца.

RequestScope: Вобласць запыту недаўгавечная. Ён пачынаецца, калі HTTP-запыт адпраўляецца і заканчваецца пасля адпраўкі адказу для кліента. Калі вы размесціце кіраваны Bean ў галіне запыту, новы асобнік ствараецца з кожным запытам. Варта разгледзець запыт калі вас турбуе кошт захоўвання вобласці сеансу.

ApplicationScope: Вобласць прыкладання захоўваецца на працягу ўсяго вэб-прыкладанні. Гэтая вобласць размяркоўваецца паміж усімі запытаў і ўсіх сесій. Вы змяшчаеце кіраваны beans ў вобласць прымянення, калі адзін Bean павінен быць агульным для ўсіх асобнікі вэб-прыкладанні. Bean ствараецца, калі ён спачатку запытваецца любым карыстальнікам прыкладання, і ён застаецца ў жывых пакуль вэб-прыкладанне не будзе выдаленае з сервера прыкладанняў.

ViewScope: У JSF 2.0 была дададзеная вобласць прагляду. A Bean вобласць бачнасці захоўваецца, пакуль адна і тая ж старонка JSF паўторна адлюстроўваецца. (JSF спецыфікацыя выкарыстоўвае тэрмін term для старонкі JSF.) Як толькі карыстач перамяшчаецца на іншую старонку, Bean выходзіць за межы вобласці.

Абярыце вобласць дзеяння, заснаваную на вашых патрабаваннях.

border=0

Крыніца: Core Java Server Faces 3rd Edition Дэвіда Гіры і Кей Хорстманна [Старонка №. 51 - 54] 2019

115
16 июля '13 в 20:18 2013-07-16 20:18 адказ дадзены Kishor Prakash 16 ліпеня '13 ў 20:18 2013/07/16 20:18

Іншыя пытанні па пазнаках або Задайце пытанне