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中。