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

时间:2013-05-02 13:27:27

标签: java jsf jsf-1.2

我在我的应用程序中使用JSF v1.2。对于这个线程(由BalusC回答),这是一个类似的问题,我在几天前标记为回答。

JSF 1.2 Life Cycle understanding: Executing the ValueChangeListener method in InvokeApplication phase

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

以下是下拉列表的代码:

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

更改下拉值;我想从DB中填充一些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和字符串,即空值

WHY

dropdown元素中都存在outputTextform。当表单在下拉值更改时提交时,panelGrid中显示的字段值将设置为默认值,即对于integer,组件#submittedValue将为0并且对于String,它将是null。由于我没有任何转换器/验证器,0的组件#值也将是integernull的{​​{1}}也是String。然后将执行ValueChangeEvent,并根据从DB获取的值将所有值设置为panelGrid内容。然后在阶段4中,db命中在阶段3中设置的所有这些值应根据在转换器/验证器之后设置的组件#值重置为其默认值,因此0应为integer {}}和null String。那么为什么值正确填充而不是默认值?

然而,在概念上再次陷入生命周期事件:(请在我误解的情况下把我所缺少的东西钉在上面。

1 个答案:

答案 0 :(得分:1)

TLDR:字段为只读

虽然panelGrid绑定到loanBean是可变的,但panelGrid仅使用输出组件(javax.faces.component.UIOutput的子类),根据定义,它们是只读的。这些没有处理请求值的方法(即UIInput.setSubmittedValueUIInput.getSubmittedValueUIInput.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