【问题标题】:JSF 1.2 Life Cycle understanding: Executing the ValueChangeListener #2JSF 1.2 生命周期理解:执行 ValueChangeListener #2
【发布时间】:2013-04-26 16:44:09
【问题描述】:

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

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

这次没有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());
}

代码运行良好,但不知道为什么:(

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

为什么

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

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

【问题讨论】:

  • 据我了解,您的问题与生命周期无关。您想相应地填充 h:panel 从 SelectOneMenu 中选择的项目。我说得对吗?

标签: java jsf jsf-1.2


【解决方案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

【讨论】:

    猜你喜欢
    • 2013-04-22
    • 2011-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-04
    • 1970-01-01
    • 1970-01-01
    • 2013-04-15
    相关资源
    最近更新 更多