JSF 1.2 生命周期理解:执行ValueChangeListener#2

3
我正在使用JSF v1.2开发应用程序。这与BalusC回答的一个问题(我几天前标记为已解决)有点类似。

JSF 1.2生命周期理解:在InvokeApplication阶段执行ValueChangeListener方法

这次没有dataTable,只有一个带有dropdownpanelgrid的表单,其中包含一些outputText。根据用户选择的dropdown值,必须填充panelGrid中存在的某些outputText字段。

以下是下拉列表的代码:

<h:selectOneMenu id="drpDownLoans" value="#{loanBean.loanId }" valueChangeListener="#{loanBean.getLoanDetails }"  onchange="submit()">
        <f:selectItem itemLabel="--Select--" itemValue="0"/>
        <f:selectItems value="#{loanBean.availableLoans }"/>
    </h:selectOneMenu>  

在更改下拉框的值时,我希望从数据库中填充一些outputText,以下是代码:
<h:panelGrid columns="2">
        <h:outputLabel id="lblLoanId" value="Loan Id"></h:outputLabel>
        <h:outputText id="txtLoanId" value="#{loanBean.loanId }"></h:outputText>
        <h:outputLabel id="lblROI" value="Rate of Interest (% pa)"></h:outputLabel>
        <h:outputText id="txtROI" value="#{loanBean.rateOfInterest }"></h:outputText>
        <h:outputLabel id="lblNOI" value="No. of Installments (months))"></h:outputLabel>
        <h:outputText id="txtNOI" value="#{loanBean.noOfInstallments }"></h:outputText>
    </h:panelGrid>

以下是在LoanBean.java中执行的代码:
public void getLoanDetails(ValueChangeEvent event){
    Integer value = (Integer)event.getNewValue();
    DataService service = new DataService();
    LoanBean loanBean = service.getLoanDetails(value);
    this.setLoanId(loanBean.getLoanId());
    this.setRateOfInterest(loanBean.getRateOfInterest());
    this.setNoOfInstallments(loanBean.getNoOfInstallments());
}

代码完美运行,但不知道为什么 :(
我的理解:应该显示整数默认值0和字符串默认值null。
为什么?

form元素中同时存在dropdownoutputText。当下拉列表值发生变化时,提交表单,然后将panelGrid中的字段值设置为默认值,即对于integer,组件#submittedValue将为0,而对于String,它将为null。由于我没有任何转换器/验证器,因此integer的组件#Value也将为0,而String将为null。然后将执行ValueChangeEvent,并且根据从数据库获取的值将所有值设置为panelGrid内容。然后在第4阶段,应基于在Convertor/Validator之后设置的component#value将在第3阶段通过db查询设置的这些值重置为其默认值,因此对于integer,它应该为0,而对于String,它应该为null。那么为什么值被正确填充而不是默认值?

我在生命周期事件的概念上又卡住了:( 请指出我对此的误解。


据我理解,您的问题与生命周期无关。您想根据从SelectOneMenu选择的项目填充h:panel。我说得对吗? - erencan
1个回答

1
TLDR: 这些字段是只读的。
虽然您的panelGrid绑定到可变的loanBean,但panelGrid仅使用输出组件(javax.faces.component.UIOutput的子类),这些组件根据定义是只读的。它们没有处理请求值的方法(即UIInput.setSubmittedValue、UIInput.getSubmittedValue和UIInput.setValue)。实际上,当您提交表单时,请求不包括从OutputText组件解码的任何值。
因此,在ValueChangeListener过程中,您无需进行任何技巧 - 可以安全地更新模型值,而不必担心应用模型值阶段会被覆盖。

UIInput Javadoc: http://docs.oracle.com/cd/E17802_01/j2ee/j2ee/javaserverfaces/1.2/docs/api/javax/faces/component/UIInput.html

调试阶段: http://www.ibm.com/developerworks/java/tutorials/j-jsf2/section7.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接