- JSF 教程
- JSF - 首頁
- JSF - 概述
- JSF - 環境設定
- JSF - 架構
- JSF - 生命週期
- JSF - 第一個應用程式
- JSF - 託管 Bean
- JSF - 頁面導航
- JSF - 基本標籤
- JSF - Facelet 標籤
- JSF - 轉換器標籤
- JSF - 驗證器標籤
- JSF - DataTable
- JSF - 複合元件
- JSF - Ajax
- JSF - 事件處理
- JSF - JDBC 整合
- JSF - Spring 整合
- JSF - 表示式語言
- JSF - 國際化
- JSF 有用資源
- JSF - 快速指南
- JSF - 有用資源
- JSF - 討論
JSF - 託管 Bean
託管 Bean 是一個註冊到 JSF 的普通 Java Bean 類。換句話說,託管 Bean 是由 JSF 框架管理的 Java Bean。託管 Bean 包含 getter 和 setter 方法、業務邏輯,甚至是一個支援 Bean(一個包含所有 HTML 表單值的 Bean)。
託管 Bean 充當 UI 元件的模型。可以從 JSF 頁面訪問託管 Bean。
在JSF 1.2中,託管 Bean 必須在 JSF 配置檔案(如 facesconfig.xml)中註冊。從JSF 2.0開始,可以使用註解輕鬆地註冊託管 Bean。這種方法將 Bean 及其註冊儲存在一個位置,因此更容易管理。
使用 XML 配置
<managed-bean> <managed-bean-name>helloWorld</managed-bean-name> <managed-bean-class>com.tutorialspoint.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.tutorialspoint.test.Message</managed-bean-class> <managed-bean-scope>request</managed-bean-scope> </managed-bean>
使用註解
@ManagedBean(name = "helloWorld", eager = true)
@RequestScoped
public class HelloWorld {
@ManagedProperty(value = "#{message}")
private Message message;
...
}
@ManagedBean 註解
@ManagedBean 將 Bean 標記為託管 Bean,其名稱在 name 屬性中指定。如果未指定 name 屬性,則託管 Bean 名稱將預設為完整限定類名的類名部分。在本例中,它將是 helloWorld。
另一個重要的屬性是eager。如果 eager = "true",則在第一次請求託管 Bean 之前建立它,否則使用“延遲”初始化,其中只有在請求時才會建立 Bean。
作用域註解
作用域註解將作用域設定為託管 Bean 將被放置到的作用域。如果未指定作用域,則 Bean 將預設為請求作用域。下表簡要討論了每個作用域。
| 序號 | 作用域和描述 |
|---|---|
| 1 | @RequestScoped Bean 的生命週期與 HTTP 請求-響應的生命週期相同。它在 HTTP 請求時建立,並在與 HTTP 請求關聯的 HTTP 響應完成時銷燬。 |
| 2 | @NoneScoped Bean 的生命週期與單個 EL 評估相同。它在 EL 評估時建立,並在 EL 評估後立即銷燬。 |
| 3 | @ViewScoped Bean 的生命週期與使用者在瀏覽器視窗/選項卡中與同一 JSF 檢視互動的時間相同。它在 HTTP 請求時建立,並在使用者回發到其他檢視時銷燬。 |
| 4 | @SessionScoped Bean 的生命週期與 HTTP 會話的生命週期相同。它在會話中涉及此 Bean 的第一個 HTTP 請求時建立,並在 HTTP 會話失效時銷燬。 |
| 5 | @ApplicationScoped Bean 的生命週期與 Web 應用程式的生命週期相同。它在應用程式中涉及此 Bean 的第一個 HTTP 請求時建立(或在 Web 應用程式啟動併為 @ManagedBean 中的 eager=true 屬性設定時),並在 Web 應用程式關閉時銷燬。 |
| 6 | @CustomScoped Bean 的生命週期與為此作用域建立的自定義 Map 中的 Bean 條目相同。 |
@ManagedProperty 註解
JSF 是一個簡單的靜態依賴注入 (DI) 框架。使用@ManagedProperty 註解,可以在另一個託管 Bean 中注入託管 Bean 的屬性。
示例應用程式
讓我們建立一個測試 JSF 應用程式來測試託管 Bean 的上述註解。
| 步驟 | 描述 |
|---|---|
| 1 | 在JSF - 建立應用程式章節中說明的com.tutorialspoint.test包下,建立一個名為helloworld的專案。 |
| 2 | 修改HelloWorld.java,如下所述。保持其餘檔案不變。 |
| 3 | 在com.tutorialspoint.test包下建立Message.java,如下所述。 |
| 4 | 編譯並執行應用程式以確保業務邏輯按要求工作。 |
| 5 | 最後,將應用程式構建成 war 檔案,並將其部署到 Apache Tomcat Web 伺服器。 |
| 6 | 使用以下步驟中說明的適當 URL 啟動 Web 應用程式。 |
HelloWorld.java
package com.tutorialspoint.test;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.RequestScoped;
@ManagedBean(name = "helloWorld", eager = true)
@RequestScoped
public class HelloWorld {
@ManagedProperty(value = "#{message}")
private Message messageBean;
private String message;
public HelloWorld() {
System.out.println("HelloWorld started!");
}
public String getMessage() {
if(messageBean != null) {
message = messageBean.getMessage();
}
return message;
}
public void setMessageBean(Message message) {
this.messageBean = message;
}
}
Message.java
package com.tutorialspoint.test;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
@ManagedBean(name = "message", eager = true)
@RequestScoped
public class Message {
private String message = "Hello World!";
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
home.xhtml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<title>JSF Tutorial!</title>
</head>
<body>
#{helloWorld.message}
</body>
</html>
完成所有更改後,讓我們像在 JSF - 建立應用程式章節中所做的那樣編譯並執行應用程式。如果應用程式一切正常,這將產生以下結果。