【问题标题】:Jsf 2.0 Populate h:selectOneMenu to access pageJsf 2.0 填充 h:selectOneMenu 以访问页面
【发布时间】:2010-09-08 22:19:40
【问题描述】:

我是 JSF 2.0 的新手,我曾在 JSF 1.1 和 1.2 中工作,我在托管 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. 还有其他方法可以填充选择以加载页面

这是完整的代码:

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

【问题讨论】:

    标签: java jsf jsf-2


    【解决方案1】:
              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>
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        看这里:

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

        您已将托管 bean 名称声明为 Person。所以它在 J​​SF EL 中以#{Person} 的形式提供。然而,您正试图以#{PersonBean} 的身份访问它。因为这样的 bean 不存在,所以菜单保持为空。

        您有 3 个选择:

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

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

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

        选项 3 是首选。

        【讨论】:

        • OK 正在工作。谢谢你们。尤其是对 BalusC。
        【解决方案4】:

        您是否尝试过使用 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
        */
        

        【讨论】:

        • 不,两种方式都同样有效。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-06-14
        • 2012-09-12
        • 1970-01-01
        • 1970-01-01
        • 2011-08-05
        • 2013-09-25
        • 2011-04-14
        相关资源
        最近更新 更多