繁体   English   中英

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

[英]JSF 1.2 Life Cycle understanding: Executing the ValueChangeListener #2

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

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

这次没有dataTable ,只有一个带有dropdown的表单和一个包含一些outputTextpanelgrid 根据用户选择的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>  

在改变下拉值时; 我想从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());
}

代码工作正常,但不知道为什么:(

我的理解:应该显示Integer的默认值,即0和String,即null

为什么

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM