Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf h:selectOneListBox不工作_Jsf_Jsf 2_Mojarra - Fatal编程技术网

Jsf h:selectOneListBox不工作

Jsf h:selectOneListBox不工作,jsf,jsf-2,mojarra,Jsf,Jsf 2,Mojarra,我有一个带有表单的简单JSF应用程序,其中一个控件是selectOneListbox: 根据注释,问题在于{d.name}的类型与{PatientsSearch.selectedDoctor}的类型不同。在这种情况下,有两种解决方案: 保持所有内容不变,将{PatientsSearch.selectedDoctor}getter/setter更改为字符串类型。 在支持bean中创建SelectItem列表,并将{PatientsSearch.selectedDoctor}getter/sette

我有一个带有表单的简单JSF应用程序,其中一个控件是selectOneListbox:


根据注释,问题在于{d.name}的类型与{PatientsSearch.selectedDoctor}的类型不同。在这种情况下,有两种解决方案:

保持所有内容不变,将{PatientsSearch.selectedDoctor}getter/setter更改为字符串类型。 在支持bean中创建SelectItem列表,并将{PatientsSearch.selectedDoctor}getter/setter更改为字符串类型。您还可以删除itemValue和itemLabel,因为支持bean已经为列表组件提供了ready对象。 从f:selectItems中更改itemValue属性并创建自定义转换器 我更喜欢第二个,因为它能更好地分隔视图。应该这样修改:

<h:selectOneListbox style="width: 231px; height: 27px;position:absolute;left:400px;top:325px;" value="#{PatientsSearch.selectedDoctor}" size="1">
    <f:selectItems value="#{PatientsSearch.doctors}" var="d" itemLabel="#{d.name}" />
    <f:converter convertId="doctorConverter" />
</h:selectOneListbox>
@FacesConverter(value="doctorConverter")
public class DoctorConverter implements Converter {

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        // Your code, select doctor from value ID for example.
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        // Your code, return doctor ID from value.
    }
}

您应该添加表单的其他部分,包括按钮。乍一看,这可能是一个转换的验证错误,你有一个h:消息的地方吗?在这个表单中没有按钮?所有其他按钮似乎都处于空闲状态,它们不再对单击做出反应。哪一个?{PatientsSearch.selectedDoctor}和{d.name}的getter/setter是什么?您好,您可以看到整个表单-我在上面添加了它。有两个按钮,只有在我没有在selectOneListbox中选择任何项目时,它们才能正常工作。否则不会触发它们的回调。两个按钮都将发送all表单,这是您想要的吗?当您选择医生时,我怀疑有转换错误,{PatientsSearch.selectedDoctor}和{d.name}字符串?d.name是字符串,PatientsSearch.selectedDoctor是医生类型。因此,问题很可能与后者有关。我会把它做成一个字符串并检查。这就是你怀疑的问题所在,对吧?谢谢Alexandre,你说的很有道理,但它似乎比这更复杂。如果我使用itemValue={d},那么情况会比以前更糟:其他按钮甚至第一次都不起作用。另一种方法是将所有内容都设置为字符串,即selectedDoctor,然后按钮似乎可以工作,但选择看起来很奇怪-所有Doctor对象似乎都是序列化和串联的,这就是我在selectedDoctor变量中得到的结果。看起来好像名单上所有的医生都是同时被选中的。这太疯狂了,我相信我会放弃这个愚蠢的计划selectOneListbox@Sorin-AlexandruCristescu不幸的是,我把你放在了错误的方向上,你实际上需要一个转换器作为修改后的答案。是的,我想我可以不用转换器来做这件事。但是像这样也没关系,我会试试看,它必须起作用。。。。谢谢。你知道为什么我解释的绳子没用吗?我不需要转换器。@Sorin AlexandruCristescu它实际上取决于您想要如何处理所选数据,例如,如果您只需要名称,您可以保留itemValue={d.name},只需将{PatientsSearch.selectedDoctor}更改为字符串类型。但我认为这不好。转换器所做的唯一一件事,就是把你的对象还给你,这是一个很好的想法,所以你只需要做一次转换器,无论你需要什么,你都不会被卡住。当然,我明白你的意思。但是,使用d.name并将selectedDoctor作为字符串的第一部分不起作用:当我从selectOneListbox中选择某个内容时,selectedDoctor被设置为整个医生列表是一个字符串序列化形式,而不仅仅是我选择的名称。这太疯狂了,我不知道为什么。
<h:selectOneListbox style="width: 231px; height: 27px;position:absolute;left:400px;top:325px;" value="#{PatientsSearch.selectedDoctor}" size="1">
    <f:selectItems value="#{PatientsSearch.doctors}" var="d" itemLabel="#{d.name}" />
    <f:converter convertId="doctorConverter" />
</h:selectOneListbox>
@FacesConverter(value="doctorConverter")
public class DoctorConverter implements Converter {

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        // Your code, select doctor from value ID for example.
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        // Your code, return doctor ID from value.
    }
}