JSF ManagedBean ManagedProperty

时间:2020-02-23 14:33:44  来源:igfitidea点击:

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