【问题标题】:selected item in selectonemenu is always nullselectonemenu 中的选定项始终为空
【发布时间】:2013-12-19 15:56:19
【问题描述】:

我正在尝试使用<p:dataTable> 来显示从<p:selectOneMenu> 列表中选择的对象的内容。

<p:selectOneMenu> 已正确填充选项。然而:

  1. 当我从<p:selectOneMenu> 中选择一个项目时,<p:dataTable> 未更新
  2. 服务器日志显示#{MB.selectedDatabase}的值为null
  3. #{MB.setSelectedDatabase()} 永远不会被调用。

XHTML:

<h:form id="form">
    <h:messages id="messages" />
    <p:panelGrid columns="2">
        <p:outputLabel value="Data:" />
        <p:selectOneMenu   immediate="true" id="customDatas" value="#{MB.selectedDatabase}"  >          
            <p:ajax execute="customDatas" render="infos" listener="#{MB.whatIsSelected()}"  />
            <f:selectItem itemLabel="Select Data" itemValue="" />  
            <f:selectItems value="#{MB.datas}" var="data" itemLabel="#{data.name}" itemValue="#{data.id}"/>                                         
        </p:selectOneMenu>                                           
    </p:panelGrid>               
    <p:dataTable value="#{MB.selectedDatabase.infos}" var="item" id="infos"  >              
        <p:column >
            <f:facet name="header">
                <h:outputText value="Info"/>
            </f:facet>
            <h:outputText value="#{item.info}"/>
        </p:column>                   
    </p:dataTable>                 
</h:form>

来自我的 sessionScoped Bean 的部分代码:

 public Data selectedDatabase;

 public void whatIsSelected(){
    logger.log(Level.SEVERE, "Selected data is : {0}", selectedDatabase.getName());
    infoBusinessLocal.getinfosbydata(selectedDatabase);
 }

 public Data getSelectedDatabase() {
    return selectedDatabase;
 }

 public void setSelectedDatabase(Data selectedDatabase) {
    logger.log(Level.SEVERE, "Set selectedDB is invoked");
    this.selectedDatabase = selectedDatabase;
 }

【问题讨论】:

  • 您需要编写一个Converter 以便能够从生成的html String 转换为您想要的对象。您还可以获得为您执行此操作的第三方库,有一个 look

标签: jsf-2 primefaces selectonemenu


【解决方案1】:

带有 Pojo 类的 SelectOneMenu 需要页面和托管 bean 之间的 JSf 转换器。转换器将字符串从页面转换为托管 bean 中的对象。

@FacesConverter("dataConverter")
public class DataConverter implements Converter {

    @Override
    public Object getAsObject(FacesContext context, UIComponent component,
            String value) {
        //return proper object, value is the string on the page
    }

    @Override
    public String getAsString(FacesContext arg0, UIComponent arg1, Object obj) {
        //return the string value of object which will be presented on the page
    }

}

将转换器属性添加到 SelectOneMenu

<p:selectOneMenu   immediate="true" id="customDatas" value="#{MB.selectedDatabase}"  converter="dataConverter"> 

另请参阅

BalusC SelectOneMenu tutorial

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-18
    • 1970-01-01
    • 2012-06-12
    • 1970-01-01
    • 2018-10-01
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多