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