JSF 托管bean(Managed Bean)是JSF注冊的常規(guī)Java Bean類。托管bean包含getter和setter方法,業(yè)務(wù)邏輯。JSF托管bean作為UI組件的Model。 它存儲JSF xhtml頁面使用的數(shù)據(jù)。借助JSF框架,可以從JSF頁面訪問托管Bean。
在JSF 1.2中,我們必須在JSF配置文件(如faces-config.xml
)中注冊受管理的bean。
從JSF 2.0可以使用注解注冊管理bean。
以下代碼顯示如何使用JSF管理的bean進(jìn)行注冊 -
<managed-bean>
<managed-bean-name>helloWorld</managed-bean-name>
<managed-bean-class>com.yiibai.test.HelloWorld</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>message</managed-bean-name>
<managed-bean-class>com.yiibai.test.Message</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
以下代碼顯示了如何使用注解來注冊JSF托管的bean。
@ManagedBean(name = "helloWorld", eager = true)
@RequestScoped
public class HelloWorld {
@ManagedProperty(value="#{message}")
private Message message;
...
}
@ManagedBean
將bean標(biāo)識為名稱屬性中指定的名稱的托管bean。如果未指定name
屬性,那么托管bean名稱將默認(rèn)為簡單的類名稱,其中第一個(gè)字母小寫。 在我們的情況下是helloWorld
。
如果eager
設(shè)置為“true
”,則在請求之前創(chuàng)建托管bean。如果使用“lazy
”初始化,只有在請求時(shí)才會創(chuàng)建bean。
范圍注解設(shè)置受管Bean的范圍。如果未指定范圍,則bean將默認(rèn)為請求范圍。
我們可以將JSF bean范圍設(shè)置為以下列表。
@RequestScoped
bean只要HTTP請求響應(yīng)就行。它根據(jù)HTTP請求創(chuàng)建,并在與HTTP請求相關(guān)聯(lián)的HTTP響應(yīng)完成時(shí)被銷毀。@NoneScoped
bean與單個(gè)表達(dá)式語言(EL)求值時(shí)間一樣長。 在EL求值評估時(shí)創(chuàng)建,并在EL求值評估后被銷毀。
@ViewScoped
bean只要用戶在瀏覽器窗口中與同一JSF視圖進(jìn)行交互即可。 它根據(jù)HTTP請求創(chuàng)建,并在用戶導(dǎo)航到其他視圖時(shí)被銷毀。
@SessionScoped
bean只要HTTP會話生存。 它在第一個(gè)HTTP請求時(shí)創(chuàng)建,并在HTTP會話無效時(shí)被銷毀。
@ApplicationScoped
bean只要Web應(yīng)用程序生存。 它在第一個(gè)HTTP請求或Web應(yīng)用程序啟動(dòng)時(shí)創(chuàng)建,并且在@ManagedBean
中設(shè)置屬性eager = true
,并在Web應(yīng)用程序關(guān)閉時(shí)被銷毀。
@CustomScoped
bean只要在為此范圍創(chuàng)建的自定義Map中的bean的條目生效。
JSF是一個(gè)簡單的靜態(tài)依賴注入(DI)框架。 @ManagedProperty
注釋標(biāo)記被托管的bean的屬性以注入另一個(gè)受托管的Bean。