託管Bean是用JSF註冊的常規javabean類。換句話說,託管bean是由JSF框架管理的javabean。託管bean包含getter和setter方法、業務邏輯,甚至支持bean(bean包含所有HTML表單值)。
託管bean用作UI組件的模型。可以從JSF頁面訪問託管Bean。
在JSF 1.2中,託管bean必須在JSF配置文件(如facesconfig.xml)中註冊它。從JSF 2.0開始,託管bean可以很容易地使用注釋註冊。這種方法將bean及其註冊保存在一個地方,因此更易於管理。
Using XML Configuration
<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>
Using Annotation
@ManagedBean(name = "helloWorld", eager = true) @RequestScoped public class HelloWorld { @ManagedProperty(value = "#{message}") private Message message; ... }
@ManagedBean Annotation
@managed bean用name屬性中指定的名稱將bean標記爲託管bean。如果沒有指定name屬性,則託管bean名稱將默認爲完全限定類名的類名部分。在我們的情況下,那就是地獄。
另一個重要的屬性是急切。如果eager=「true」,則在首次請求之前創建託管bean,否則將使用「惰性」初始化,其中只有在請求時才會創建bean。
Scope Annotations
作用域注釋設置託管bean將被放置到的作用域。如果未指定作用域,則bean將默認爲請求作用域。下表簡要討論了每個範圍。
S.No | Scope & Description |
---|---|
1 | @請求範圍 Bean的生命周期與HTTP請求響應的生命周期一樣長。它根據HTTP請求創建,並在與HTTP請求關聯的HTTP響應完成時被銷毀。 |
2 | @非範圍 Bean的壽命與一個EL評估一樣長。它在EL評估後創建,並在EL評估後立即銷毀。 |
3 | @視域 只要用戶在瀏覽器窗口/選項卡中與同一個JSF視圖交互,Bean就會存在。它根據HTTP請求創建,並在用戶回發到其他視圖時被銷毀。 |
4 | @會議範圍 Bean的壽命與HTTP會話的壽命一樣長。它在會話中涉及此bean的第一個HTTP請求時創建,並在HTTP會話無效時被銷毀。 |
5 | @應用範圍 Bean的壽命與web應用程式的壽命一樣長。它是在應用程式中涉及這個bean的第一個HTTP請求時(或者當web應用程式啓動並且在@ManagedBean中設置eager=true屬性時)創建的,並在web應用程式關閉時被銷毀。 |
6 | @自定義範圍 Bean的生命周期與爲這個作用域創建的自定義映射中的Bean條目的生命周期一樣長。 |
@ManagedProperty Annotation
JSF是一個簡單的靜態依賴注入(DI)框架。使用@managed property注釋,可以在另一個託管bean中注入託管bean的屬性。
Example Application
讓我們創建一個測試JSF應用程式來測試託管bean的上述注釋。
Step | Description |
---|---|
1 | Create a project with a name helloworld under a package com.tutorialspoint.test as explained in the JSF - Create Application chapter. |
2 | Modify HelloWorld.java as explained below. Keep the rest of the files unchanged. |
3 | Create Message.java under a package com.tutorialspoint.test as explained below. |
4 | Compile and run the application to make sure business logic is working as per the requirements. |
5 | Finally, build the application in the form of war file and deploy it in Apache Tomcat Webserver. |
6 | Launch your web application using appropriate URL as explained below in the last step. |
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-創建應用程式一章中那樣編譯和運行應用程式。如果您的應用程式一切正常,這將產生以下結果。