【发布时间】:2013-04-26 16:44:09
【问题描述】:
我正在为我的应用程序使用 JSF v1.2。这是与此线程(由 BalusC 回答)类似的问题,我在几天前将其标记为已回答。
这次没有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());
}
代码运行良好,但不知道为什么:(
我的理解:应该显示 Integer 即 0 和 String 即 null 的默认值
为什么
dropdown 和 outputText 都存在于 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 中选择的项目。我说得对吗?