3

我正在为我的应用程序使用 JSF v1.2。这是与此线程(由 BalusC 回答)类似的问题,我在几天前将其标记为已回答。

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

dataTable这次不,只有一个带有 a 和 a 的表单,其中dropdown包含panelgridsome 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>  

关于更改下拉值;我想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 ie 0 和 String ie null 的默认值

为什么

thedropdown和 theoutputText都存在于form元素中。当表单在下拉值更改时提交时,出现在的字段的值将panelGrid设置为默认值,即 for integer,component#submittedValue 将是0并且 forString它会是null。由于我没有任何转换器/验证器,因此 component#Value 也将是0forintegernullfor String。然后ValueChangeEvent将被执行,所有的值都panelGrid根据从数据库中获取的值设置为内容。然后在第 4 阶段,由 db hit 在第 3 阶段设置的所有这些值应根据在转换器/验证器之后设置的 component#value 重置为其默认值,因此它应该0用于integer并且null对于String. 那么为什么正确填充值而不是默认值呢?

再次在概念上停留在生命周期事件上:(请指出我在误解中遗漏的内容。

4

1 回答 1

1

TLDR:这些字段是只读的

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

于 2013-05-06T04:51:29.763 回答