当前位置: 首页 > 文档资料 > JSF 入门教程 >

托管豆(Managed Beans)

优质
小牛编辑
137浏览
2023-12-01

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

托管bean用作UI组件的Model。 可以从JSF页面访问Managed 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>cn.xnip.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>cn.xnip.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

只要HTTP请求 - 响应存在,Bean就会存在。 它在HTTP请求时创建,并在与HTTP请求关联的HTTP响应完成时被销毁。

2

@NoneScoped

只要进行一次EL评估,Bean就会存在。 它是在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

Bean只要在自定义Map中的bean条目生效,该自定义Map就是为此范围创建的。

@ManagedProperty Annotation

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

示例应用

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

描述
1cn.xnip.test包下创建一个名为helloworld的项目,如JSF - Create Application一章中所述。
2修改HelloWorld.java ,如下所述。 保持其余文件不变。
3cn.xnip.test包下创建Message.java ,如下所述。
4编译并运行应用程序以确保业务逻辑按照要求运行。
5最后,以war文件的形式构建应用程序并将其部署在Apache Tomcat Webserver中。
6使用适当的URL启动Web应用程序,如下面的最后一步所述。

HelloWorld.java

package cn.xnip.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 cn.xnip.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