托管豆(Managed Beans)
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的上述注释。
步 | 描述 |
---|---|
1 | 在cn.xnip.test包下创建一个名为helloworld的项目,如JSF - Create Application一章中所述。 |
2 | 修改HelloWorld.java ,如下所述。 保持其余文件不变。 |
3 | 在cn.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 - 创建应用程序章节中所做的那样。 如果您的应用程序一切正常,这将产生以下结果。