h:selectOneListBox无法正常工作

时间:2013-06-23 15:59:39

标签: jsf jsf-2 mojarra

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

<h:selectOneListbox style="width: 231px; height: 27px;position:absolute;left:400px;top:325px;" value="#{PatientsSearch.selectedDoctor}">
    <f:selectItems value="#{PatientsSearch.doctors}" var="d" itemLabel="#{d.name}" itemValue="#{d.name}" />
</h:selectOneListbox>

当我运行应用程序时,我可以看到正在填充的列表(即,正确检索了PatientsSearch.doctors),因此我可以从selectOneListbox中选择一个项目。在我选择了所需的项目后,该表单上的任何内容都无法正常工作。所有其他按钮似乎都处于空闲状态,它们不再对点击做出反应。但是,如果从selectOneListbox中没有选择任何内容,则所有按钮都按预期工作(即它们在托管bean中触发它们的回调)。

我调试了应用程序并注意到,确实在选择列表中的项目后,单击表单上其他按钮的回调时不会触发。 同样在调试器中,我从未看到 setSelectedDoctor()被调用(参见上面的代码片段),如我所料。

我正在使用JSF的Mojarra 2.0.1实现。

我在这里缺少什么?


更新:这是整个表单:

    <h:form style="width: 876px; background-color: #FED981; padding-left: 60px; padding-top: 30px; margin-left: 80px; margin-top: 40px; color: #804000; font-style: normal; font-family: Verdana, Arial, Sans-Serif">
    <h:outputLabel style="position:absolute;left:200px;top:100px;" value="New appointment:"></h:outputLabel>
    <br>
    <br>
    <h:inputText style="width: 259px;position:absolute;left:200px;top:120px;" binding="#{PatientsSearch.inputText1}" valueChangeListener="#{PatientsSearch.lookForName}" immediate="true" id="inputText1" />
    <h:commandButton value ="Search patients by name:" style="width: 173px;position:absolute;left:465px;top:120px;" action="#{PatientsSearch.getPatientsByName}">
        <f:param name="day" value="#{request.getParameter('day')}" />
        <f:param name="month" value="#{request.getParameter('month')}" />
        <f:param name="year" value="#{request.getParameter('year')}" />  
    </h:commandButton>

    <br>
    <h:panelGroup id="pn_DETAILS_GRP" style="overflow:auto;position:absolute;top:155px;left:200px;width:300px;height:150px;solid black">
        <h:dataTable id="tb_USER_DETAILS" border="1" var="patient" value="#{PatientsSearch.patients}" style="width:300px;height:150px" rowClasses="oddRow, evenRow">
        <h:column id="name">
        <f:facet name="header">
        <h:outputText value="Name" style="font-size:10pt"/>
        </f:facet>
        <h:outputText value="#{patient.name}" style="font-size:8pt"/>
        </h:column>
        <h:column id="phone">
        <f:facet name="header">
        <h:outputText value="Phone" style="font-size:10pt"/>
        </f:facet>
        <h:outputText value="#{patient.phoneMobile}" style="font-size:8pt"/>
        </h:column>
        <h:column>
        <h:inputHidden id="patientId" value="#{patient.id}" />
        </h:column>
        </h:dataTable>
    </h:panelGroup>

    <h:inputHidden id="testId"  />

    <br><br><br>
    <h:outputLabel value="Choose doctor:" style="width: 200px;position:absolute;left:200px;top:325px;"></h:outputLabel>
    <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}" itemValue="#{d.name}" />
    </h:selectOneListbox>
    <br><br><br>
    <h:commandButton value="Schedule" style="position:absolute;left:200px;top:430px;" action="#{PatientsSearch.scheduleAppointment}">
        <f:param name="day" value="#{request.getParameter('day')}" />
        <f:param name="month" value="#{request.getParameter('month')}" />
        <f:param name="year" value="#{request.getParameter('year')}" /> 
    </h:commandButton>

</h:form>

1 个答案:

答案 0 :(得分:0)

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

  1. 保持您拥有的所有内容,将#{PatientsSearch.selectedDoctor} getter / setter更改为String类型。
  2. 在辅助bean中创建SelectItem列表,并将#{PatientsSearch.selectedDoctor} getter / setter更改为String类型。您还可以删除itemValueitemLabel,因为支持bean已经为列表组件提供了就绪对象。
  3. itemValue更改f:selectItems属性并创建自定义转换器
  4. 我更喜欢第二种,因为它更好地分离了视图。它应该像这样改变:

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