2010-09-14 57 views
6

JSF 2.0'da birden fazla yönetilen fasulye örneğini oluşturmak istiyorsanız, aynı kapsamda farklı adlar altında, nasıl devam etmeliyim?JSF 2.0'da yönetilen çekirdeklerin birden çok örneğini oluşturmanın doğru yolu nedir?

@ManagedBeans({name="myManagedBean1",name="myManagedBean2"}) 
@RequestScoped 
public class MyManagedBean { 

} 

Teşekkür ..

+0

JSF 2.0 ek açıklamalarının fason oluşturma ile ilişkili olarak faces-config.xml kadar güçlü olması gerektiğini düşünüyorum. JSF 1.2'de aynı sınıfın birden fazla fasulyesini kullanıyorum ve JSF2.0'ın bu özelliği ek açıklamalarla aşmaması üzücü bir durum. – Puche

cevap

10

Yapamazsınız: İdeal olarak, ben (örneğin) equivilant için istiyorum. Teknik olarak da mantıklı değil. Muhtemelen belirli işlevsel gereksinim için yanlış yönde bir çözüm arıyoruz.

En iyi bahsiniz, bir ana fasulyeye sahip olmak ve bu "çoklu fasulyelere" sahip olmaktır.

@ManagedBean 
@RequestScoped 
public class Parent { 
    private Child child1; 
    private Child child2; 
    // ... 
} 

böylece #{parent.child1} ve #{parent.child2} erişebilirsiniz söyledi. Ayrıca daha esnek olmak için List<Child> özelliğini veya Map<String, Child> modelini de kullanabilirsiniz.

faces-config.xml ile ancak farklı bir isimle birden fazla fasülye sınıfı tanımlamak mümkündür. Yine de, nasıl yararlı olduğunu göremiyorum.

+0

Teşekkürler. Bu gereksinim, yönetilen baklagillerin, sayfadaki UIComponents'lara bağlı bazı alanlara sahip olan özel bileşenler için fasulyeleri desteklemesinden kaynaklanıyor. Bu nedenle, (nadir durumlarda albiet), aynı bileşenlerin birçoğu için aynı tipteki bir çok çekirdeğe ihtiyacım var, bu durumda UI diyalogları. Çözümünüzün böyle olabileceğini düşündüm, ancak bu durumda bir kişi @PostConstruct gibi yaşam döngüsü ek açıklamalarını kullanamıyor. Teşekkürler! – Dave

+0

You **, ManagedBean öğesinin birden çok örneğini oluşturabilir (ManagedBeanELResolver'ın * getValue * değerini geçersiz kılar). Onlar aynı BeanBuilder ve BeanManager kullanarak inşa edilecek, onlar sadece beanName farklıdır. Çözümünüz için gerekliyse, bilmiyorum. Bazı nadir durumlarda, evet diyorum. – Manuel

+0

@Manual: Elbette mümkün. Ana yanıt tam olarak OP'nin istediği gibi, hedefe ulaşmak için JSF 2.0 ek açıklamalarını kullanmak için de geçerlidir. Yanıtın son paragrafının, eski 'faces- config.xml 'yolunu kullanırken birden çok örneği tanımlamanın mümkün olduğunu belirteceğini unutmayın. Bunun için JSF'nin belirli sınıfları kesmesine gerek yoktur. – BalusC

3

Sizin durumunuzda, faces-config.xml dosyasını kullanmalısınız. ManagedBean ve RequestScope ek açıklamaları olmadan fasulyenizi emdirin. Yani fasulyeniz varsayılan olarak yönetilen bir fasulye olmayacak. Farklı adlar, farklı kapsamlar ve kira fark özelliklerinde ihtiyaç duyduğunuz kadar yönetilebilir. Örneğin :

<managed-bean> 
    <managed-bean-name>MyManagedBean1</managed-bean-name> 
    <managed-bean-class>org.MyManagedBean</managed-bean-class> 
    <managed-bean-scope>session</managed-bean-scope> 
    <managed-property> 
     <property-name>value1</property-name> 
     <property-class>int</property-class> 
     <value>5</value> 
    </managed-property> 
    <managed-property> 
     <property-name>value2</property-name> 
     <property-class>int</property-class> 
     <value>2</value> 
    </managed-property> 
</managed-bean> 

<managed-bean> 
    <managed-bean-name>MyManagedBean2</managed-bean-name> 
    <managed-bean-class>org.MyManagedBean</managed-bean-class> 
    <managed-bean-scope>view</managed-bean-scope> 
    <managed-property> 
     <property-name>value1</property-name> 
     <property-class>int</property-class> 
     <value>30</value> 
    </managed-property> 
    <managed-property> 
     <property-name>value2</property-name> 
     <property-class>java.lang.String</property-class> 
     <value>project</value> 
    </managed-property> 
</managed-bean> 

tanımlayıcılar kötü ve ek açıklamalar kod uygulamak için tek yol olduğunu sanmıyorum.

3

Bir olasılık, sınıfınızı soyut hale getirmeniz ve ihtiyacınız olduğu kadar adlandırılmış örneklere alt sınıfı ayırmanızdır, boş bırakabilirsiniz. Bu ayrıca, yalnızca vakalardan yalnızca birini ilgilendiren gelecekteki yönetilen fasulye işlevlerini ayırmanıza yardımcı olacaktır.

@ManagedBean (ve kapsam) ek açıklamasını, @ Inherited olsa bile, tüm alt sınıflara üzerlerine taşımanız gerekecektir. Mojarra atleast'in şu anki versiyonu için, bilmiyorum.

+0

Yukarıdaki kullanım durumum için, her bir farklı web sayfası için farklı init durumları bulunduğundan bu yaklaşıma gitmeye karar verdim. Teşekkürler. – user3586195

İlgili konular