- 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 - 创建应用程序章节中所做的那样编译并运行应用程序。如果应用程序一切正常,这将产生以下结果。