JSF - 托管 Bean
Managed Bean 是向 JSF 注册的常规 Java Bean 类。换句话说,Managed Beans 是由 JSF 框架管理的 Java bean。托管 bean 包含 getter 和 setter 方法、业务逻辑,甚至支持 bean(一个 bean 包含所有 HTML 表单值)。
托管 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 = "true",则在第一次请求之前创建托管 bean,否则使用“惰性”初始化,其中仅在请求时才创建 bean。
范围注释
范围注释设置托管 bean 将放置的范围。如果未指定范围,则 bean 将默认为请求范围。下表简要讨论了每个范围。
序列号 | 范围和描述 |
---|---|
1 | @RequestScoped 只要 HTTP 请求-响应存在,Bean 就存在。它根据 HTTP 请求创建,并在与 HTTP 请求关联的 HTTP 响应完成时销毁。 |
2 | @NoneScoped Bean 的生命周期与单个 EL 评估一样长。它是在 EL 评估时创建的,并在 EL 评估后立即销毁。 |
3 | @ViewScoped 只要用户与浏览器窗口/选项卡中的同一 JSF 视图交互,Bean 就存在。它根据 HTTP 请求创建,并在用户回发到不同视图时被销毁。 |
4 | @SessionScoped 只要 HTTP 会话存在,Bean 就存在。它在会话中第一个涉及此 bean 的 HTTP 请求时创建,并在 HTTP 会话失效时被销毁。 |
5 | @ApplicationScoped Bean 的生命周期与 Web 应用程序的生命周期相同。它在应用程序中第一个涉及此 bean 的 HTTP 请求时创建(或者当 Web 应用程序启动并且在 @ManagedBean 中设置 eager=true 属性时),并在 Web 应用程序关闭时销毁。 |
6 | @自定义范围 只要为此范围创建的自定义映射中的 Bean 条目存在,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; } }
消息.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; } }
首页.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 - 创建应用程序”一章中所做的那样编译并运行该应用程序。如果您的应用程序一切正常,这将产生以下结果。