Jsf 2.0填充h:selectOneMenu来访问页面

时间:2010-09-08 22:19:40

标签: java jsf jsf-2

我是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");
    }
}
  1. 编辑Netbeans 6.8(JSF 2.0默认配置向导)
  2. 没有例外错误
  3. 永远不要运行构造函数PersonBean(我放置一个断点,永不停止)
  4. 还有其他方法可以填充选择以加载页面
  5. 这是完整的代码:

    的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;
        }
    }
    

4 个答案:

答案 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个选择:

  1. 在您的JSF页面中通过#{PersonBean}重命名#{Person}

  2. 在托管bean中将@ManagedBean(name = "Person")重命名为@ManagedBean(name = "PersonBean")

  3. 删除bean名称并使用默认的JSF命名约定。即只需使用@ManagedBean而不使用name并在您的JSF页面中使用#{personBean}(实质上,bean的类名称为第一个字符小写)。

  4. 首选备选方案3。