![](/img/trans.png)
[英]JSF 1.2 Life Cycle understanding: Executing the ValueChangeListener method in InvokeApplication phase
[英]JSF 1.2 Life Cycle understanding: Executing the ValueChangeListener #2
我在我的应用程序中使用JSF v1.2。 对于这个线程(由BalusC回答),这是一个类似的问题,我在几天前标记为回答。
JSF 1.2生命周期理解:在InvokeApplication阶段执行ValueChangeListener方法
这次没有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());
}
代码工作正常,但不知道为什么:(
我的理解:应该显示Integer的默认值,即0和String,即null
为什么
dropdown
和outputText
都出现在form
元素中。 当表单在下拉值更改时提交时, panelGrid
中存在的字段的值将设置为default,即对于integer
,组件#submittedValue将为0
,对于String
,它将为null
。 由于我没有任何转换器/验证器,组件#Value对于integer
也是0
,对于String
也是null
。 然后将执行ValueChangeEvent
并根据从DB获取的值将所有值设置为panelGrid
内容。 然后在阶段4中,db命中在阶段3中设置的所有这些值应根据在转换器/验证器之后设置的组件#值重置为其默认值,因此对于integer
应为0
,对于String
应为null
。 那么为什么值正确填充而不是默认值?
然而,在概念上再次陷入了生命周期事件:(请在我误解的情况下把我所缺少的东西钉在上面。
TLDR:字段是只读的
虽然你的panelGrid
绑定到loanBean
是可变的,但是panelGrid
只使用输出组件( javax.faces.component.UIOutput
子类),根据定义它们是只读的。 这些没有处理请求值的方法(即UIInput.setSubmittedValue
, UIInput.getSubmittedValue
和UIInput.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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.