Jsf 如何将SelectCheckBox菜单中的选定值传递给my bean?

Jsf 如何将SelectCheckBox菜单中的选定值传递给my bean?,jsf,primefaces,selectcheckboxmenu,Jsf,Primefaces,Selectcheckboxmenu,我正在使用JSF2.2.8和primefaces 6.0,我有一个SelectCheckBox菜单,我想在bean中检索所选的值 SelectCheckBox菜单是从数据库中填充的,但是当我选择属性并且不保存任何内容时,它不会调用save函数 这是我的SelectCheckBox菜单 <p:outputLabel for="ressource" value="Ressource"/>

我正在使用JSF2.2.8和primefaces 6.0,我有一个SelectCheckBox菜单,我想在bean中检索所选的值

SelectCheckBox菜单是从数据库中填充的,但是当我选择属性并且不保存任何内容时,它不会调用save函数

这是我的SelectCheckBox菜单

                          <p:outputLabel for="ressource" value="Ressource"/>
                        <h:panelGroup >         
                         <p:selectCheckboxMenu id="ressource" label="Ressource" value="#{affectationBean.selectedRessource}"  multiple="true">
                                <f:selectItems value="#{affectationBean.ressources}" var="r" itemLabel="#{r.nom}" itemValue="r.idt_ressource" />
                            </p:selectCheckboxMenu>
                         </h:panelGroup>
                        <p:commandButton icon="ui-icon-save"  actionListener="#{affectationBean.save}" value="Save" update="@affectation" ajax="false" style="display:inline-block;margin-top:5px"/>

下面是selectedRessource和actionListener保存的声明

    private Long [] selectedRessource;
    // Getters setters and Construct


    public void save(){

    for(int i=0 ;i<selectedRessource.length;i++){
    system.out.println("id ===> " + selectedRessource[i]);
    } 
private Long[]selectedRessource;
//Getters设置器和构造
公共作废保存(){

对于(int i=0;i问题在于
p:commandButton
,您有3个选项

更改您的方法:

public void save(ActionEvent actionEvent){...}
更改您的操作侦听器值:

actionListener="#{affectationBean.save()}"
或者将按钮更改为使用
操作

action="#{affectationBean.save}"
我的建议是: 首先确保所有内容都在h:form标签内。 不需要设置multiple=true,因为此标记不接受此属性 我通过以下修改进行了测试,并在我的bean中获得了所选的多个值。唯一的区别是我对itemLabel和itemValue使用相同的值,但在您的情况下,它是object。我也使用primefaces 6,甚至不需要将actionListner更改为action。它正在按原样工作。


免责声明:这是一种解决方法。它不是永久性的解决方案,但允许您使用SelectCheckBox菜单并继续工作

这个组件有一个问题,它阻止它在提交时将值传递给支持bean

由于某些原因,应包含所选值的数组在提交时被清除。因此,我创建了一个额外的数组,我没有在标记中声明该数组,并在每次更改事件时更新该数组。然后在提交时,这些值仍然存在。请参阅以下内容:

BackingBean.java

private String[] sCodes;
private String[] sCodes2; //extra array, not in form.xhtml

public void updateCodes()
    {       
        sCodes2 = sCodes; //keeps the values in the other array
    }

public void doSend() throws IOException
    {
log.trace("selected codes: {} selected codes2 length: {}", sCodes.length, sCodes2.length);
    }
form.xhtml

<p:selectCheckboxMenu id="codeCtl" value="#{bean.SCodes}" label="Codes" filter="true" filterMatchMode="startsWith" panelStyle="width:250px">
<f:selectItems value="#{bean.menuCodes}" />
<p:ajax event="change" listener="#{bean.updateCodes()}" />                                        
</p:selectCheckboxMenu>
<p:commandButton value="submit" actionListener="#{bean.doSend}" id="ctlSubmit" update="appform"/>


这是一个奇怪的解决方案,很可能是一个范围“问题”的解决方案。我已经研究并测试了该解决方案,该解决方案解决了问题,并允许在开发人员解决问题之前使用SelectCheckBox菜单。我不认为你有理由否决Kukeltje。你没有说明这是一个解决方案,并且不是一个真正的解决方案。如果你说这只是一个解决方案,因为真正的原因是未知的,我不会投反对票。我这样做的原因是,我认为没有人应该使用它作为解决方案。让我感到奇怪的是,你说“直到开发人员解决问题”…如果你用codi解决问题,我会认为你是/a开发人员ng…我是我雇主的开发者,但不是PF项目的开发者。对于PF,我是用户,但我仍然通过测试他们的代码(通过使用它)来提供价值并指出问题。我本可以简单地使用我的变通方法,而不用花时间打印出来,但我认为这样做会有所帮助。我编辑了我的问题,希望你删除你的反对票Kukeltje。但不清楚你要解决的问题是什么。PrimeFaces代码中没有任何东西需要修复关于这一点(我不知道github中有什么问题,你也没有提供)。如果你没有提供一个真正完整的例子,也没有提供版本信息(最初的问题是关于6.0的,后来被6.1、6.2和7.0取代)很难相信这是PrimeFaces中的一个bug,因为这是一个非常基本的功能。我个人仍然认为您的代码中存在一个范围问题,它创建了一个特定的行为,您为此创建了此解决方案。可能重复
<p:selectCheckboxMenu id="codeCtl" value="#{bean.SCodes}" label="Codes" filter="true" filterMatchMode="startsWith" panelStyle="width:250px">
<f:selectItems value="#{bean.menuCodes}" />
<p:ajax event="change" listener="#{bean.updateCodes()}" />                                        
</p:selectCheckboxMenu>
<p:commandButton value="submit" actionListener="#{bean.doSend}" id="ctlSubmit" update="appform"/>