我的应用程序使用的是jsf v1.2。这是一个类似于这个线程(由balusc回答)的问题,几天前我将其标记为已回答。
JSF 1.2 Life Cycle understanding: Executing the ValueChangeListener method in InvokeApplication phase
这次没有,只有一个adataTable和adropdown包含一些panelgrid的表单。根据用户选择的outputText值,必须填充dropdown中的一些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>

在更改下拉值时;我想从数据库中填充一些panelGrid,下面是代码:
<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)的默认值
为什么
outputTextdropdown都存在于outputText元素中。当表单在下拉值更改时提交时,form中的字段值设置为默认值,即对于panelGrid,component submittedValue将为integer,对于0,它将为String。由于我没有任何转换器/验证器,组件值也将null表示0integer表示null。然后执行String并根据从数据库中获取的值将所有值设置为ValueChangeEvent内容。然后,在第4阶段,db hit在第3阶段设置的所有这些值都应根据在转换器/验证器之后设置的组件值重置为其默认值,因此对于panelGrid应为0,对于integer应为null。那么为什么要正确地填充值而不是默认值呢?
再一次在概念上停留在生命周期事件上:(请指出我在错误理解中遗漏了什么。)

最佳答案

tldr:字段是只读的
当您的panelGrid绑定到可更改的loanBean时,panelGrid仅使用定义为只读的输出组件(属于javax.faces.component.UIOutput的子类)。它们没有处理请求值的方法(即UIInput.setSubmittedValueUIInput.getSubmittedValueUIInput.setValue)。事实上,当提交表单时,请求不包含来自OutputText组件的解码值。
因此,您不需要在ValueChangeListener过程中耍花招-更新模型值是安全的,而不必担心apply model value阶段会被覆盖。
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

10-08 01:12