Farklı fasulye kapsamları olduğunu fark ettim:
@RequestScoped
@ViewScoped
@FlowScoped
@SessionScoped
@ApplicationScoped
Her birinin amacı nedir? Fasulyem için uygun bir kapsamı nasıl seçerim?
Farklı fasulye kapsamları olduğunu fark ettim:
@RequestScoped
@ViewScoped
@FlowScoped
@SessionScoped
@ApplicationScoped
Her birinin amacı nedir? Fasulyem için uygun bir kapsamı nasıl seçerim?
Yanıtlar:
Fasulyenin kapsamını (ömür boyu) temsil eder. Temel sunucu uygulaması web uygulamasının "kapakların altında" çalışmasına aşina olup olmadığınızı anlamak daha kolaydır: Sunucu uygulamaları nasıl çalışır? Örnekleme, oturumlar, paylaşılan değişkenler ve çoklu kullanım .
@Request/View/Flow/Session/ApplicationScoped
Bir @RequestScoped
çekirdek tek bir HTTP istek yanıt döngüsü kadar uzun yaşar (bir Ajax isteğinin tek bir HTTP isteği olarak sayıldığını unutmayın). Bir @ViewScoped
fasulye , herhangi bir gezinme / yönlendirme olmadan dönen null
/ void
olmayan eylem yöntemlerini çağıran geri gönderme yoluyla aynı JSF görünümü ile etkileşim kurduğunuz sürece yaşar . Bir @FlowScoped
akış, akış yapılandırma dosyasında kayıtlı belirtilen görünüm koleksiyonunda gezintiğiniz sürece yaşar. Bir @SessionScoped
fasulye köklü HTTP oturumu olarak yaşar. Bir @ApplicationScoped
fasulye uzun web uygulama çalışır gibi yaşar. CDI'nın @Model
temel olarak bir stereotip olduğunu unutmayın @Named @RequestScoped
, bu nedenle aynı kurallar geçerlidir.
Hangi kapsamın seçileceği yalnızca fasulyenin tuttuğu ve temsil ettiği verilere (duruma) bağlıdır. @RequestScoped
Basit ve ajax olmayan formlar / sunumlar için kullanın . Kullanım @ViewScoped
zenginler için dinamik görünüm (ajaxbased doğrulama, render, diyaloglar, vs) ajax özellikli. @FlowScoped
Birden çok sayfaya yayılmış giriş verisi toplama "sihirbazı" ("anket") şablonu için kullanın . @SessionScoped
Oturum açan kullanıcı ve kullanıcı tercihleri (dil vb.) Gibi istemciye özgü veriler için kullanın . @ApplicationScoped
Herkes için aynı olan açılır listeler veya herhangi bir örnek değişkeni olmayan ve yalnızca yöntemlere sahip olan yönetilen fasulye gibi uygulama çapında veri / sabitler için kullanın .
@ApplicationScoped
Oturum / görüntüleme / istek kapsamındaki veriler için bir çekirdeği kötüye kullanmak, verilerin tüm kullanıcılar arasında paylaşılmasını sağlar, böylece herkes birbirinin verilerini basit bir şekilde yanlış görebilir. @SessionScoped
Kapsamlı verileri görüntülemek / istemek için bir çekirdeği kötüye kullanmak, tek bir tarayıcı oturumunda tüm sekmeler / pencereler arasında paylaşılmasını sağlar, böylece son kullanıcı, kullanıcı deneyimi için kötü sekmeler arasında geçiş yaptıktan sonra her görünümle etkileşimde tutarsızlıklar yaşayabilir. @RequestScoped
Kapsamlı verileri görüntülemek için bir çekirdeğin kötüye kullanılması , görünüm kapsamındaki verilerin her bir (ajax) geri dönüşte varsayılan olarak yeniden başlatılmasını sağlayarak, muhtemelen çalışmayan formlara neden olur ( ayrıca bkz . Burada 4. ve 5. noktalar ). Bir @ViewScoped
çekirdeğin istek, oturum veya uygulama kapsamındaki veriler için kötüye kullanılması ve@SessionScoped
Uygulama kapsamındaki verilerin çekirdeği istemciyi etkilemez, ancak gereksiz yere sunucu belleğini işgal eder ve düz verimsizdir.
Gerçekten düşük bir bellek alanınız yoksa ve tamamen vatansız gitmek istemiyorsanız , kapsamın performans etkilerine göre seçilmemesi gerektiğini unutmayın ; @RequestScoped
istemcinin durumunu korumak için yalnızca fasulye kullanmanız ve istek parametreleriyle uğraşmanız gerekir . Ayrıca, farklı kapsamda veriler içeren tek bir JSF sayfanız olduğunda, bunları verilerin kapsamıyla eşleşen bir kapsama ayrı ayrı çekirdeklere yerleştirmenin tamamen geçerli olduğunu unutmayın. Fasulye sadece @ManagedProperty
JSF tarafından yönetilen fasulye veya @Inject
CDI tarafından yönetilen fasulye durumunda birbirlerine erişebilir .
@CustomScoped/NoneScoped/Dependent
Sorunuzda bahsedilmiyor, ancak (eski) JSF de gerçek dünyada nadiren kullanılan @CustomScoped
ve destekliyor @NoneScoped
. @CustomScoped
Özel bir başvurmalıdır Map<K, Bean>
geçersiz kılınan sahip bazı geniş kapsamda uygulanması Map#put()
ve / veya Map#get()
fasulye yaratılış üzerinde daha fazla ince taneli kontrole sahip ve / veya yok etmek sırasını.
JSF @NoneScoped
ve CDI @Dependent
temelde fasulye üzerinde tek bir EL değerlendirmesi kadar yaşar. Bir fasulye özelliğine atıfta bulunan iki giriş alanına ve bir fasulye eylemine atıfta bulunan bir komut düğmesine sahip bir giriş formu hayal edin, böylece toplam üç EL ifadesiyle etkili bir şekilde üç örnek oluşturulacaktır. Biri kullanıcı adı ayarlı, biri şifre ayarlı ve diğeri de eylemin çağrıldığı. Normalde bu kapsamı yalnızca enjekte edildiği fasulye kadar yaşayacak olan fasulye üzerinde kullanmak istersiniz. Yani a @NoneScoped
veya a @Dependent
içine enjekte edilirse @SessionScoped
, @SessionScoped
fasulye kadar yaşayacaktır .
Son olarak, JSF flaş kapsamını da destekler. Oturum kapsamındaki bir veri girişi ile ilişkili kısa yaşayan bir çerez tarafından desteklenir. Yönlendirmeden önce, HTTP yanıtında, oturum kapsamındaki veri girişiyle benzersiz bir şekilde ilişkilendirilmiş bir değere sahip bir çerez ayarlanır. Yönlendirmeden sonra, flash kapsam çerezinin varlığı kontrol edilecek ve çerezle ilişkili veri girişi oturum kapsamından kaldırılacak ve yönlendirilen isteğin istek kapsamına konulacaktır. Son olarak çerez HTTP yanıtından kaldırılacaktır. Bu şekilde, yeniden yönlendirilen istek, ilk istekte hazırlanan talep kapsamındaki verilere erişebilir.
Bu aslında yönetilen bir fasulye kapsamı olarak mevcut değildir, yani diye bir şey yoktur @FlashScoped
. Flaş kapsamı yalnızca ExternalContext#getFlash()
yönetilen fasulye ve EL'de harita olarak kullanılabilir #{flash}
.
@FlowScoped
(manuel olarak başlatmaya / durdurmaya gerek yoktur).
ViewAccesscoped
veWindowScoped
ViewScoped
MyFaces 2.2'de fasulye ile ilgili bir sorun var . Şu anda buradaViewScoped
yayınladığım fasulye ve Ajax ile ilgili bir sorunla karşılaşıyorum . MyFaces JIRA'da bu konuda bir tartışma var.
@RequestScoped
@SessionScoped
@ApplicationScoped
@ConversationScoped
açıkladığınız kapsamlar neden farklı?
JSF 2.3'ten bu yana, paket javax.faces.bean
paketinde tanımlanan tüm fasulye kapsamları , kapsamları CDI ile hizalamak için kullanımdan kaldırılmıştır. Dahası, sadece fasulyeniz @ManagedBean
ek açıklama kullanıyorsa geçerlidir . 2.3'ün altındaki JSF sürümlerini kullanıyorsanız, sondaki eski yanıta bakın.
JSF 2.3'ten JSF Destek Fasulyesinde kullanılabilecek kapsamlar şunlardır:
1@javax.enterprise.context.ApplicationScoped
.: Uygulama kapsamı, web uygulamasının tüm süresi boyunca devam eder. Bu kapsam tüm talepler ve tüm oturumlar arasında paylaşılmaktadır. Bu, tüm uygulama için verileriniz olduğunda kullanışlıdır.
2@javax.enterprise.context.SessionScoped
.: Oturum kapsamı, bir oturumun oluşturulduğu andan oturum sonlandırmasına kadar devam eder. Oturum bağlamı, aynı HTTP oturumunda gerçekleşen tüm istekler arasında paylaşılır. Bu, belirli bir oturum için belirli bir istemciye ait verileri kaydetmeyeceğinizde kullanışlıdır.
3@javax.enterprise.context.ConversationScoped
.: Konuşma kapsamı, fasulye yaşarken günlük olarak devam eder. Kapsam 2 yöntem sağlar: Conversation.begin()
ve Conversation.end()
. Bu yöntemler, bir fasulyenin ömrünü başlatmak veya bitirmek için açıkça çağrılmalıdır.
4@javax.enterprise.context.RequestScoped
.: Talep kapsamı kısa ömürlüdür. Bir HTTP isteği gönderildiğinde başlar ve yanıt istemciye geri gönderildikten sonra sona erer. Yönetilen bir çekirdeği istek kapsamına yerleştirirseniz, her istekle yeni bir örnek oluşturulur. Oturum kapsamı depolamasının maliyeti konusunda endişeleriniz varsa istek kapsamını dikkate almaya değer.
5@javax.faces.flow.FlowScoped
.: Akış kapsamı, Akış devam ettiği sürece devam eder. Akış, bir iş birimini tanımlayan bir dizi sayfa (veya görünüm) olarak tanımlanabilir. Kapsamı çizilen akış, kullanıcı Akış'ta gezintiği sürece etkindir.
6@javax.faces.view.ViewScoped
.: Aynı JSF sayfası yeniden görüntülenirken görünüm kapsamındaki bir fasulye devam eder. Kullanıcı farklı bir sayfaya gider gitmez, fasulye kapsam dışına çıkar.
Aşağıdaki eski yanıt, 2.3'ten önceki JSF sürümünü uygular
JSF 2.x itibariyle 4 Fasulye Kapsamı vardır:
- @SessionScoped
- @RequestScoped
- @ApplicationScoped
- @ViewScoped
Oturum Kapsamı: Oturum kapsamı , bir oturumun oluşturulduğu andan oturum sonlandırmasına kadar devam eder. Web uygulamasının HttpSession nesnesinde geçersiz kılma yöntemini çağırması veya zaman aşımına uğraması durumunda oturum sonlandırılır.
RequestScope: İstek kapsamı kısa ömürlüdür. Bir HTTP isteği gönderildiğinde başlar ve yanıt istemciye geri gönderildikten sonra sona erer. Yönetilen bir çekirdeği istek kapsamına yerleştirirseniz, her istekle yeni bir örnek oluşturulur. Oturum kapsamı depolamasının maliyeti konusunda endişeleriniz varsa istek kapsamını dikkate almaya değer.
ApplicationScope: Uygulama kapsamı, web uygulamasının tüm süresi boyunca devam eder. Bu kapsam tüm talepler ve tüm oturumlar arasında paylaşılmaktadır. Bir web uygulamasının tüm örnekleri arasında tek bir fasulye paylaşılması gerekiyorsa, yönetilen çekirdekleri uygulama kapsamına yerleştirirsiniz. Bean, uygulamanın herhangi bir kullanıcısı tarafından ilk istendiğinde oluşturulur ve web uygulaması uygulama sunucusundan kaldırılıncaya kadar canlı kalır.
ViewScope: Görünüm kapsamı JSF 2.0'da eklendi. Aynı JSF sayfası yeniden görüntülenirken görünüm kapsamındaki bir fasulye devam eder. (JSF belirtimi, bir JSF sayfası için terim görünümünü kullanır.) Kullanıcı farklı bir sayfaya gider gitmez, çekirdek kapsam dışına çıkar.
İhtiyacınıza göre kapsamı seçin.
Kaynak: Core Java Server Faces 3. Baskı by David Geary & Cay Horstmann [Sayfa no. 51-54]
invalidate()
?
FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
"çıkış fasulye" içinde çağrılmak demek.