JSF 1.2生命周期理解:在InvokeApplication阶段执行ValueChangeListener方法
这次没有dataTable
,只有一个带有dropdown
和panelgrid
的表单,其中包含一些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());
}
代码完美运行,但不知道为什么 :(
我的理解:应该显示整数默认值0和字符串默认值null。
为什么?
在form
元素中同时存在dropdown
和outputText
。当下拉列表值发生变化时,提交表单,然后将panelGrid
中的字段值设置为默认值,即对于integer
,组件#submittedValue将为0
,而对于String
,它将为null
。由于我没有任何转换器/验证器,因此integer
的组件#Value也将为0
,而String
将为null
。然后将执行ValueChangeEvent
,并且根据从数据库获取的值将所有值设置为panelGrid
内容。然后在第4阶段,应基于在Convertor/Validator之后设置的component#value将在第3阶段通过db查询设置的这些值重置为其默认值,因此对于integer
,它应该为0
,而对于String
,它应该为null
。那么为什么值被正确填充而不是默认值?
我在生命周期事件的概念上又卡住了:( 请指出我对此的误解。