如果我想在JSF 2.0中創建多個託管bean實例,在同一範圍內的不同名稱下,我該如何繼續?理想情況下,我想equivilant到(例如):在JSF 2.0中創建託管bean的多個實例的正確方法是什麼
@ManagedBeans({name="myManagedBean1",name="myManagedBean2"})
@RequestScoped
public class MyManagedBean {
}
謝謝..
如果我想在JSF 2.0中創建多個託管bean實例,在同一範圍內的不同名稱下,我該如何繼續?理想情況下,我想equivilant到(例如):在JSF 2.0中創建託管bean的多個實例的正確方法是什麼
@ManagedBeans({name="myManagedBean1",name="myManagedBean2"})
@RequestScoped
public class MyManagedBean {
}
謝謝..
你不能。這在技術上也沒有多大意義。您可能正在尋找針對特定功能需求的錯誤方向的解決方案。
你最好打賭是有一個父母的豆,並有那些「多個豆」作爲孩子。
@ManagedBean
@RequestScoped
public class Parent {
private Child child1;
private Child child2;
// ...
}
,這樣就可以通過#{parent.child1}
和#{parent.child2}
訪問它。您當然也可以使用List<Child>
屬性,或者甚至使用Map<String, Child>
來更靈活。
與faces-config.xml
但是可以定義多個不同名稱的bean類。不過,我不明白這有什麼用處。
謝謝。這個需求來自所討論的託管bean,它們爲自定義組件支持bean,這些自定義組件在頁面上有一些綁定到UIComponents的字段。因此(罕見的情況下),我需要多個相同類型的支持bean的多個實例,用於多個相同的組件,在這種情況下是UI對話框。我認爲你的解決方案可能是這種情況,但這會導致無法使用@PostConstruct等生命週期註釋。謝謝! – Dave 2010-09-14 16:25:37
您**可以**創建ManagedBean的多個實例(覆蓋ManagedBeanELResolver的* getValue *)。他們將使用相同的BeanBuilder和BeanManager進行構建,他們只是在beanName上有所不同。如果您的解決方案有必要,我不知道。在一些罕見的情況下,我會說是的。 – Manuel 2012-10-18 20:01:02
@手冊:當然有可能。主要答案僅適用於使用JSF 2.0註釋來完成目標,完全如OP所述。請注意,答案的最後一段指出,在使用舊的「faces-config.xml」方式時可以定義多個實例。爲此,您不需要破解JSF impl特定的類。 – BalusC 2012-10-18 20:06:27
在你的情況下,你應該使用faces-config.xml。在沒有ManagedBean和RequestScope註釋的情況下實現您的bean。所以你的bean不會成爲默認的託管bean。您可以根據需要使用不同的名稱,不同的範圍和至少不同的屬性來實例化儘可能多的managedBean。 例如:
<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>
不要以爲描述符是邪惡和註解來實現你的代碼的唯一途徑。
一種可能性是讓您的類抽象並將其子類化爲儘可能多的命名實例,您可以將其留空。這也可以幫助你分離未來的託管bean功能,這些功能實際上只涉及其中一種情況。
您將不得不將@ManagedBean(和範圍)註釋移動到所有的子類,遺憾的是,即使它是@Inherited。對於目前版本的Mojarra atleast,其他人我不知道。
對於我上面的用例,我決定採用這種方法,因爲每個不同的網頁都有不同的初始情況,例如。謝謝。 – user3586195 2015-11-16 17:50:09
我認爲JSF 2.0註釋應該和faces-config.xml一樣強大,它與bean的創建有關。我一直在JSF 1.2中使用同一類的多個bean,但遺憾的是JSF2.0並沒有通過註釋來克服這個特性。 – Puche 2011-03-29 07:41:02