我是JSF 2.0中的新手,我在JSF 1.1和1.2中工作,我在Managed bean的页面的构造函数中填充了selectOneMenu。当用户访问页面时,填充列表。以下示例。我把它放在JSF 2.0中但不起作用,selectOneMenu显示为空。
<h:selectOneMenu id="cboStatus" value="#{PersonBean.idStatus}">
<f:selectItems value="#{PersonBean.status}"/>
</h:selectOneMenu>
在构造函数的托管bean中我放了:
public class PersonBean {
private SelectItem[] status=new SelectItem[0];
public PersonBean () {
detallePersonas= new ArrayList();
status= new SelectItem[3];
status[0]=new SelectItem("S","Single");
status[1]=new SelectItem("M","Married");
status[2]=new SelectItem("D","Divorced");
}
}
这是完整的代码:
的index.xhtml
<?xml version='1.0' encoding='UTF-8' ?>
<!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"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head>
<title>Person</title>
</h:head>
<h:body>
<h:form id="frmPerson">
<h:outputLabel id="lblStatus" value="Status:"/>
<h:selectOneMenu id="cboStatus" value="#{PersonBean.idStatus}">
<f:selectItems value="#{PersonBean.status}"/>
</h:selectOneMenu>
</h:form>
</h:body>
</html>
PersonBean.java
package com.prueba.backingbean;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.model.SelectItem;
/**
*
* @author Administrador
*/
@ManagedBean(name = "Person")
@ViewScoped
public class PersonBean {
private String idStatus;
private SelectItem[] status = new SelectItem[0];
public PersonBean() {
status = new SelectItem[3];
status[0] = new SelectItem("S", "Single");
status[1] = new SelectItem("M", "Married");
status[2] = new SelectItem("D", "Divorced");
}
/**
* @return the idStatus
*/
public String getIdStatus() {
return idStatus;
}
/**
* @param idStatus the idStatus to set
*/
public void setIdStatus(String idStatus) {
this.idStatus = idStatus;
}
/**
* @return the status
*/
public SelectItem[] getStatus() {
return status;
}
/**
* @param status the status to set
*/
public void setStatus(SelectItem[] status) {
this.status = status;
}
}
答案 0 :(得分:2)
private Map<String,String>status = new HashMap<String,String>();
.......
status.put("S", "Single");
status.put("M", "Married");
status.put("D", "Divorced");
在JSF PAGE中:
<h:selectOneMenu value="#{personBean.idStatus}" >
<f:selectItems value="#{personBean.status}"/>
</h:selectOneMenu>
答案 1 :(得分:1)
它应该是“personBean”而不是“PersonBean”(第一个字母应该是小写)。您还需要getter for status(getStatus()
)和setter / getter for idStatus(setIdStatus()
/ getIdStatus()
)。他们在吗?
答案 2 :(得分:0)
您是否尝试使用List而不是SelectItems数组。 下面的代码可能会对您有所帮助。
private List<SelectItem> status = new ArrayList<SelectItem>();
status.add(new SelectItem("S","Single"));
status.add(new SelectItem("M","Married"));
status.add(new SelectItem("D","Divorced"));
/*
SETTER / GETTER
*/
答案 3 :(得分:0)
看这里:
@ManagedBean(name = "Person")
@ViewScoped
public class PersonBean {
您已将托管bean名称声明为Person
。所以它在JSF EL中可用#{Person}
。但是你试图以#{PersonBean}
的形式访问它。因为这样的bean不存在,所以菜单保持为空。
你有3个选择:
在您的JSF页面中通过#{PersonBean}
重命名#{Person}
。
在托管bean中将@ManagedBean(name = "Person")
重命名为@ManagedBean(name = "PersonBean")
。
删除bean名称并使用默认的JSF命名约定。即只需使用@ManagedBean
而不使用name
并在您的JSF页面中使用#{personBean}
(实质上,bean的类名称为第一个字符小写)。
首选备选方案3。