04.受/托管(Managed)Bean

Managed Bean (Backing Bean)

受管(託管) Bean 是一個 POJO(Plain Old Java Object,簡單的傳統 Java 物件),可用於存儲資料,並由容器(例如,GlassFish 服務器)使用 JSF 框架來管理。
  • POJO 本質上是一個 Java 類別,包含了一個無參數的公共建構函數,並且該類遵循其屬性的 JavaBeans 命名約定。


特點


  1. 又名 Backing Bean
  2. 是一個普通的 JavaBean 組件
  3. 用以製作與 JSF UI 組件間的動態內容
    1. JSF 組件可存取它的成員(屬性和方法)


JSR 299 CDI


http://www.cn-java.com/www1/?action-viewnews-itemid-55539

Weld並不需要完整的應用服務器。它可以運行在Servlet容器內如Jetty 6.1或是Tomcat 6,同時也能用於Java SE 5.0+。
新的Managed Bean規範是JSR-299的工作成果(在規範的早期草案中我們稱之為「簡單Web Bean」)。簡單Web Bean支持依賴注入、EL名字與攔截器,但卻沒有EJB那些編程約束。

最後的結果是:CDI可以用在普通的Java類(現在叫做「Managed Bean」)以及EJB上。現在的EJB可以看作是一種特殊的Managed Bean,只不過有一些額外的編程約束和功能。這種編程模型能夠極大地降低新用戶學習EE的曲線。 

我認為EE平台的未來發展方向是逐漸將EJB特有的功能通用化,將其應用在所有的Managed Bean上。舉個例子,為何不是所有的Managed Bean都支持@TransactionAttribute和@RolesAllowed呢?簡直沒有道理嘛。

然而EJB在為消息傳輸定義端點、遠程與異步方法調用、定時器等領域還是有一席之地的。在這些情況下,EJB生命週期模型還是非常有意義的。 

CDI來源於Red Hat的開源Seam框架,從廣義上來講,它將Seam的編程模型標準化為Java EE 6的編程模型。CDI實現了Java EE 6的3個主要目的。首先,它提供了聲明的方式來管理綁定到上下文組件的範圍、狀態與生命週期。其次,它為平台提供了標準化、註解驅動、類型安全的依賴注入框架,方式類似於Google Guice。最後,它為Java EE平台的擴展開發提供了Service Provider Interface(SPI)。






編寫(2者可選)


  1. 在 faces-config.xml 中完整的宣告
  2. 在 POJO java class 中以 @ManagedBean 註釋型別宣告
按照約定,託管 bean 的名稱與類名相同,類名的第一個字母被轉換為小寫。也可以使用 ManagedBean 註釋的 name 屬性顯式地指定一個託管 bean,比如:@ManagedBean(name = "place")。
從 faces-config.xml 中移除託管 bean 聲明將極大地減少 XML,但是在 JSF 2 中,通過使用註釋(如我對託管 bean 所做的一樣)或是約定(比如 JSF 2 的簡化的導航處理),幾乎可以去掉所有的 XML 內容。

  • Note: 不建議兩者混合使用,將會無法使用@ManagedProperty進行Injection

IDE Tools








Managed Bean 生命週期


Default: request



Setter / Getter


xhtml file:

<h:commandBotton value="Submit" action="#{wisdomFish.name}" />

<h:outputText value="#{wisdomFish.name}" />