2013-05-02 84 views
3

我正在为我的应用程序使用JSF v1.2。这是对这个线程的类似问题(由BalusC回答),我标记为几天前回答。JSF 1.2生命周期理解:执行ValueChangeListener#2

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

没有dataTable这个时候,只能用dropdown和含有一些outputText一个panelgrid的形式。基于用户选择的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()); 
} 

的代码可以正常使用,但不知道为什么:(

我的理解:应显示为整数,即0和字符串即空的默认值

WHY

无论是dropdownoutputText存在于form元件。当表单按照下拉值变化提交时,则panelGrid中出现的字段的值被设置为默认值,即,对于integer,组件#submittedValue将是0,并且对于String,它将是null。由于我没有任何转换器/验证器,对于String,对于integernull,组件#值也将为0。然后将执行ValueChangeEvent,并根据从数据库中提取的值将所有值设置为panelGrid内容。然后在阶段4中,基于在转换器/验证器之后设置的组件#值,所有在阶段3中由db命中设置的这些值应该被重置为它们的默认值,因此对于String,它应该是0对于integernull。那为什么这些值正确填充而不是默认值?

又一次概念停留在生命周期的活动:(请PIN-ponit我在我的错误理解是缺少

+0

至于我明白你的问题不是关于生命周期。您要相应地从SelectOneMenu中填充h:panel。我是不是? – erencan 2013-05-10 12:54:00

回答

1

TLDR:该字段是只读的

虽然你panelGrid绑定到易变的loanBeanpanelGrid仅使用根据定义只读的输出组件(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