JSF ManagedBean ManagedProperty
JSF ManagedBean是一个Java类,JSF页面可以访问该Java类以检索UI字段的值。
JSF ManagedBean
可以使用@ManagedBean批注创建JSF托管Bean。
如果在@ManagedBean批注之后未指定名称属性,则表明托管bean的名称与类名相同。
如果指定了名称,则它是具有在属性中指定的名称的托管bean。
还有其他一些注释,它们指定了可与托管Bean一起使用的范围属性。
@ SessionScoped:指示Bean在整个会话中都有效
@ RequestScoped:该bean对http请求有效。
@ ApplicationScoped:Bean有效,只要Web应用程序有效。
现在,创建一个名为Car.java的托管bean,如下所示。
package com.theitroad.jsf.beans;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
@ManagedBean
@SessionScoped
public class Car {
private String cname = "Santro";
private String color = "blue";
private String Id = "S1";
private String model = "S-800";
private String regno = "S4567";
private String description;
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getRegno() {
return regno;
}
public void setRegno(String regno) {
this.regno = regno;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public String getId() {
return Id;
}
public void setId(String Id) {
this.Id = Id;
}
}
在上面的代码中,由于我们在@ManagedBean批注之后未使用任何name属性,因此创建了一个名为Car的托管bean。
@SessionScope用于指示Bean在整个会话中都是有效的。
Car bean基本上包含汽车的字段,例如颜色,id,描述,模型和regno以及用于这些字段的getter和setter方法。
现在创建" viewdetails.xhtml",它是汽车详细信息的视图。
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="https://www.w3.org/1999/xhtml"
xmlns:h="https://xmlns.jcp.org/jsf/html">
<h:head>
<title>Car Details</title>
</h:head>
<h:body>
Car Id:#{car.id}
<br>
<br>
Car Name:#{car.cname}
<br>
<br>
Car color:#{car.color}
<br>
<br>
Car Model:#{car.model}
<br>
<br>
Car Registration Number:#{car.regno}
</h:body>
</html>
现在运行该应用程序,它将在浏览器中产生以下输出。
注入JSF托管Bean
通过@ManagedProperty批注,我们可以将一个托管bean注入另一个托管bean中。
让我们看一个如何注入托管bean的示例。
如下创建名为Car_gen.java的托管bean。
package com.theitroad.jsf.beans;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.RequestScoped;
@ManagedBean(name = "car_gen", eager = true)
@RequestScoped
public class Car_gen {
@ManagedProperty(value = "#{alto_car}")
private Alto alto;
private String description;
public Car_gen() {
}
public String getDescription() {
description = alto.getDescription();
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Alto getAlto() {
return alto;
}
public void setAlto(Alto alto) {
this.alto = alto;
}
}
其中名为alto_car的bean被注入了@ManagedProperty注释。
在getter方法中,我们调用alto的getDescription方法来从alto托管bean中获取值。
#{alto_car}表示注入了名为alto_car的托管bean,正如我们在Alto.java类的@ManagedBean注解的name属性中所指定的那样。
" eager = true"表示在第一次请求该受管bean之前创建了该受管bean。
接下来,创建名为Alto.java的bean,如下所示。
package com.theitroad.jsf.beans;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
@ManagedBean(name = "alto_car", eager = true)
@RequestScoped
public class Alto {
private String description = "Alto has power windows";
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
该托管bean包含带有初始化值的description字段,并具有getter和setter方法。
现在,我们创建一个名为car_gen.xhtml的JSF页面来进行绑定。
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="https://www.w3.org/1999/xhtml"
xmlns:h="https://java.sun.com/jsf/html">
<h:head>
<title>Alto Description</title>
</h:head>
<h:body>
#{car_gen.description}
</h:body>
</html>
我们从" car_gen" bean中获取描述值,该描述值进一步从女低音中获取。
这是可能的,因为Alto bean已被注入到通用的car_gen bean中。

