2010-09-08 31 views
1

我是JSF 2.0中的新手,我在JSF 1.1和1.2中工作,并且在Managed bean页面的构造函数中填充selectOneMenu。用于访问用户访问页面列表时填充。下面的例子。我把它放在JSF 2.0中,但不起作用,selectOneMenu显示为空。Jsf 2.0填充h: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"); 
    } 
} 
  1. 主编Netbeans的6.8(JSF 2.0缺省配置向导)
  2. 没有异常错误
  3. 不要运行构造PersonBean(我把一个断点,永不停止)
  4. 还有其他方法来填充选择来加载页面

这是完整的代码:

的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

看吧:

@ManagedBean(name = "Person") 
@ViewScoped 
public class PersonBean { 

你声明的托管bean名称Person。所以它在JSF EL中可用,如#{Person}。但是,您试图以#{PersonBean}的身份访问它。由于这种bean不存在,菜单保持空白。

你已经有3个选项:

  1. 在JSF页面中通过重命名#{Person}#{PersonBean}。在您的托管bean中将@ManagedBean(name = "Person")重命名为@ManagedBean(name = "PersonBean")

  2. 摆脱bean名称并使用默认的JSF命名约定。即只需使用@ManagedBean而不使用name,并在您的JSF页面中使用#{personBean}(本质上,该bean的类名带有小写的第一个字符)。

选项3是优选的。

+0

好的正在工作。谢谢你们。特别是对BalusC。 – NestorInc 2010-09-11 20:44:01

+0

不客气。 – BalusC 2010-09-11 21:01:42

1

它应该是 “personBean”,而不是“PersonBean “(第一个字母应该是小写)。您还需要getter的状态(getStatus())和idStatus的设置者/获取者(setIdStatus()/getIdStatus())。他们在吗?

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 
*/ 
+0

不,这两种方式都同样有效。 – BalusC 2010-09-09 14:05:11

+0

这是完整的代码。请帮助我 – NestorInc 2010-09-10 01:11:22

2
  private Map<String,String>status = new HashMap<String,String>(); 
      ....... 
      status.put("S", "Single"); 
      status.put("M", "Married"); 
      status.put("D", "Divorced"); 

在JSF页面:

  <h:selectOneMenu value="#{personBean.idStatus}" > 

      <f:selectItems value="#{personBean.status}"/>     

     </h:selectOneMenu>