JSF - 托管 Bean

托管 Bean 是使用 JSF 注册的常规 Java Bean 类。换句话说,托管 Bean 是由 JSF 框架管理的 Java Bean。托管 Bean 包含 getter 和 setter 方法、业务逻辑,甚至支持 Bean(包含所有 HTML 表单值的 Bean)。

托管 Bean 用作 UI 组件的模型。托管 Bean 可从 JSF 页面访问。

在 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 将默认为请求范围。下表简要讨论了每个范围。

S.No 范围和说明
1

@RequestScoped

Bean 的存在时间与 HTTP 请求-响应的存在时间相同。它在 HTTP 请求时创建,并在与 HTTP 请求相关的 HTTP 响应完成时销毁。

2

@NoneScoped

Bean 的存在时间与单个 EL 评估的时间相同。它在 EL 评估时创建,并在 EL 评估后立即销毁。

3

@ViewScoped

只要用户在浏览器窗口/选项卡中与同一 JSF 视图交互,Bean 就会存在。它在 HTTP 请求时创建,并在用户回发到其他视图后销毁。

4

@SessionScoped

只要 HTTP 会话存在,Bean 就会存在。它在会话中第一次涉及此 bean 的 HTTP 请求时创建,并在 HTTP 会话无效时销毁。

5

@ApplicationScoped

只要 Web 应用程序存在,Bean 就会存在。它在应用程序中第一次涉及此 bean 的 HTTP 请求时创建(或者当 Web 应用程序启动并在 @ManagedBean 中设置 eager=true 属性时),并在 Web 应用程序关闭时销毁。

6

@CustomScoped

只要为此范围创建的自定义 Map 中的 bean 条目存在,Bean 就会存在。

@ManagedProperty 注解

JSF 是一个简单的静态依赖注入 (DI) 框架。使用 @ManagedProperty 注解,可以将托管 bean 的属性注入另一个托管 bean。

示例应用程序

让我们创建一个测试 JSF 应用程序来测试托管 bean 的上述注解。

步骤 描述
1 在 com.tutorialspoint.test 包下创建一个名为 helloworld 的项目,如 JSF - 创建应用程序 一章中所述。
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 - 创建应用程序章节中一样编译并运行应用程序。如果您的应用程序一切正常,这将产生以下结果。

JSF Managed Beans