Soru JSF2 - EJB veya ManagedBean tarafından destekleniyor mu?


JSF2'yi öğrendiğim gibi, destek bileşenlerinin ne olması gerektiğinden emin değilim. Tasarım açısından bakıldığında, EJB'ler arasındaki fark nedir? @ManagedBeans?

Sonunda JPA kullanacağım, dolayısıyla EJB iş katmanları için doğal bir seçim. EJB'yi doğrudan JSF'den kullanmak iyi bir uygulamadır (açıklandığı gibi) İşte)?

Şu anda kullanmaya doğru yaşıyorum @ManagedBeans iş katmanına erişmesi gerekmeyen bileşenler (ör., görüntü yardımcıları) veya istek / oturum verileriyle ilgilenen bileşenler için. Diğer amaçlar için, ör. Bir ızgarada bir şey listelemek, doğrudan EJB'ye erişirim.

Bu iyi bir tasarım mı? Kullanayım mı @ManagedBeans Bazı durumlarda, sadece EJB'ye delege olsalar bile, temiz katman ayırma uğruna tüm destek fasulyeleri için?


18
2018-03-11 22:11


Menşei




Cevaplar:


Çok geçerli bir soru, ama cevabın cevabı projenize yönelik yaklaşımın "katılığına" bağlıdır. Her ikisi de bazı iş mantığı uygulamak gibi JSF destek fasulye ve EJB arasında gerçekten fazlalık var.

İçinde ideal JSF özelliklerinin kullanımı converters, rendered, validatorvb. could Gerçekten temiz iş mantığı kodu. Ancak uygulamada, sunumla ilgili bazı mantık genellikle sızar.

Bu sunumla ilgili mantık ideal olarak EJB'de olmamalıdır. Bu sunumla ilgili mantık yüz paketine bağlı olabilir, ancak gerekli değildir. Bu ne yapar Bu sunum ile ilgili ya da değil.

Birleşik bir bileşen modelinin bazı avantajları olsa da. Ve bu yaklaşımın Dikiş ve bahar. Her iki durumda da, deklarasyonlu işlem içeren ticari bileşen, vb. Doğrudan JSF'de kullanılabilir (Spring, EJB'yi kullanmaz fakat benzer bir model sağlar). Ancak EJB püresi, ikisini ayırmanız gerektiğini söylüyor.

Bana göre sonuçta projenin tadı ve büyüklüğü meselesi. JSF'de EJB kullanan küçük / orta ölçekli bir proje için iyi çalıştığını hayal edebiliyorum. Bu sıkılığın kritik olduğu daha büyük proje için, katmanları vidalamadığınızdan emin olun.


13
2018-03-12 07:28



Teşekkürler, biraz ışık saçıyor. Aslında, Spring'i zaten biliyorum ve bir değişim için Sun kümesini denemek istedim. İki fasülye türünü birbirinden ayırmaya çalışıyorum. EJB ve ManagedBeans arasındaki mantığı karıştırmaktan nefret ediyorum, bu yüzden ManagedBeans'ı yalnızca yardımcılar / giriş noktaları olarak ele almayı ve EJB'de tüm mantığı yapmayı düşünüyorum. Bu tür sorular söz konusu olduğunda, birleşik modelin bazı avantajları vardır. - Konrad Garus
Bu cevabı daha çok ilham verici buluyorum. Yine de öğrenecek çok şey var. - Konrad Garus
JSF 2.2 ile devam etmek yerine, CDI yerine kullanmak isteyeceksiniz @ManagedBean fasulye yapmak için biraz değişiklik gerektirecek @Named ve kapsamı değiştir. EJB'ler bazı harika işlevsellikler sunar ve siz olmak istediğiniz "saflık" konusunda size kalır. Genelde EJB'leri sayfalarımda kullanmaktan çekinmem. - John Yeary


Java EE 6'da çeşitli yönetilen çekirdekler arasında bir miktar örtüşme vardır: JSF yönetilen fasulye (@ ManagedBean), CDI tarafından yönetilen fasulye (@Named) ve EJB çekirdekleri (@Stateless, @Statefull, @Singleton).

Görünüm katmanında @ManagedBean ile yapıştırmak için herhangi bir avantaj görmüyorum. @Named'in CDI varyantı, aynı ve daha fazlasını yapabilir, örneğin; dönüşüm kapsamına erişim sağlar.

Mevcut düşünce, sonunda EJB bileşen modelinin bir CDI ek açıklamaları seti olarak yeniden donatılacağı gibi görünüyor. Özellikle uzman grup üyesi Reza Rahman buna sık sık işaret ediyor. Bakınız örn. Java EE 6'da Bağımlılık Enjeksiyonu - Bölüm 1 

Şimdilik bu olmadı, bu nedenle EJB çekirdekleri, özellikle de JPA kalıcılık için kullanıldığında iş mantığını yerleştirmek için en kolay yer olmaya devam ediyor.

Yine de, CDI EJB, IMHO yetenekleri elde edip etmeyecek olsun ya da olmasın, "destekleyici" kavramı için ayrı bir fasulye ve "iş mantığı" için ayrı bir fasulye kullanmak için hala en iyi uygulamadır.

Destek çekirdeği, model nesneleri ve hizmetlere (EJB'ler) bazı referanslar içeren, gerçekten ince olabilir. Destek fasulyesinin Eylem Yöntemleri, neredeyse doğrudan hizmetlere delege verebilir, ancak bunların katma değeri kullanıcıya geri bildirim sağlayarak (Başarı veya başarısızlık üzerine FacesMessages ekleyerek) ve küçük UI modifikasyonları yapmaktır (örneğin, bazı iletişim pencerelerini görüntüleyen bir false ayarlayarak). .

Hizmetler (iş mantığı) herhangi bir sunum hakkında hiçbir şey bilmemelidir. JSF destekli fasulye, JAX-RS, Servlets, bağımsız Java SE uzak istemcileri veya her ne olursa olsun aynı şekilde kullanılabilirler.

Bütün fasülyeler CDI fasülyesi olsa bile, bu, bu temel sorumluluk bölümünü değiştirmez.


8
2017-12-19 15:19



Not; David Geary ve Cay Horstmann bununla ilgili şu sözlere değiniyor: “JSF sayfalarında kullanılabilecek iki farklı mekanizma, CDI fasülyesi ve JSF tarafından yönetilen fasulye için tarihsel bir kazadır. Uygulama Tomcat gibi düz bir sunucu runner üzerinde çalışmalıdır "(bkz. Core JavaServer Faces, sayfa 40) - Arjan Tijms


İlginç yazı, bunu bilmiyordu. Ancak, bana bu yazı JSF yönetilen fasulye doğru bir rant daha çok gibi kokuyor. Ayrıca EJB'yi JSF ile sıkı sıkıya birleştirir. Küçük (kişisel) uygulamalarda ilginç olabilir, ancak muhtemelen EJB'ler üzerinde tam kontrole sahip olmak istediğiniz gerçek dünyadaki SOA uygulamalarında bulunmaz.

Ne için kullanacağına gelince, ben sadece yapışırdım @ManagedBean Bir JSF modelini belirtmek için - bir veya daha fazla özel JSF görünümüne bağlıdır. Mükemmel kullanabilirsiniz @EJBJSF olmayan özel iş mantığı ve / veya veri modelleri için. Enjekte edebilirsin @EJBbir JSF modelinde var ve bunu eylem yöntemlerinde ve belki de alıcılar / belirleyicilerde devrediyorsunuz, ancak diğer yolu yuvarlak yapmamalısınız, yani JSF modelini bir @EJBBu sıkı bir bağlantıya yol açar ve @EJBJSF içeriğinin dışında kullanılamaz. Şimdiye kadar, tasarımınız kulağa hiçbir şey aktarmayacağınız sürece iyi geliyor. javax.faces paketinde @EJB sınıf.


3
2018-03-11 23:12



JSF modeli, doğrulayıcılar, istek işleme - emin. Sadece @ ManagedBean'da ve @EJB'deki tüm mantıksal mantığa ne dersiniz? Sıkı eşleştirme anlamına gelmez: @ManagedBean, sunum katmanının bir parçası olarak kabul edilir, ancak her şeyin bunlardan geçmesi gerekmez. Hala @EJB'den JSF'ye bağımlılıkları önleyebilir ve uzak servislere erişebilirim. Sadece iki (örtüşen?) Fasulye türleri arasında ayrım yapmaya çalışıyorum. - Konrad Garus


EJB'yi XHTML'nizden çağırarak, görünüm ve iş katmanındaki uygulama seçimi arasında sıkı bir bağlantı kuruyorsunuz.

EJB'yi çağırmak için yönetilen bir fasülye kullanırsanız [veya hatta bir iş temsilcisine koyun], katmanınızı (XHTML) etkilemeden iş katmanınızı tamamen Spring'e dönüştürebilirsiniz.

Teknik olarak mümkün ve sizin için çok kolay (JSR 299) EJB'yi yönetilen fasülye olarak kullanabiliyorsunuz ve muhtemelen bu satıcıların yapman gerekeni - spesifikasyonlara yapıştırabilirsiniz. Ama bu doğru bir şey mi? - Yok hayır.


2
2018-03-19 12:53



ManagedBean'a EJB'yi nasıl enjekte edebilirim? - Koray Tugay