Java JSF1.2生命周期理解:执行ValueChangeListener#2
我正在为我的应用程序使用JSFv1.2。这是一个类似于这个线程的问题(由BalusC回答),几天前我将其标记为已回答 这次没有Java JSF1.2生命周期理解:执行ValueChangeListener#2,java,jsf,jsf-1.2,Java,Jsf,Jsf 1.2,我正在为我的应用程序使用JSFv1.2。这是一个类似于这个线程的问题(由BalusC回答),几天前我将其标记为已回答 这次没有dataTable,只有一个带有下拉列表和panelgrid的表单,其中包含一些outputText。根据用户选择的下拉列表值,必须填充面板网格中存在的一些输出文本字段 以下是下拉列表的代码: <h:selectOneMenu id="drpDownLoans" value="#{loanBean.loanId }" valueChangeListener="#{
dataTable
,只有一个带有下拉列表和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>
下面是在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的默认值
为什么
下拉列表
和输出文本
都存在于表单
元素中。当表单在下拉值更改时提交时,则面板网格
中存在的字段的值设置为默认值,即对于整数
,组件#submittedValue将为0
,对于>字符串
将为null
。由于我没有任何转换器/验证器,因此对于integer
组件#值也将为0
,对于String
组件
为null
。然后执行ValueChangeEvent
,并根据值将所有值设置为panelGrid
内容然后在第4阶段,在第3阶段由DB hit设置的所有这些值都应根据在转换器/验证器之后设置的分量值重置为其默认值,因此对于整数
和字符串
,值应为0
。那么为什么要正确填充值y而不是默认值
在生命周期事件的概念上再次陷入困境:(请指出我在错误理解中遗漏了什么。TLDR:字段是只读的 当您的
panelGrid
绑定到可变的loanBean
时,panelGrid
仅使用输出组件(javax.faces.component.UIOutput的子类),这些组件定义为只读。这些组件没有处理请求值的方法(即UIInput.setSubmittedValue
、UIInput.getSubmittedValue
和UIInput.setValue
)。事实上,提交表单时,请求不包括来自OutputText
组件的解码值
因此,在ValueChangeListener
过程中,您不需要耍花招-可以安全地更新模型值,而不用担心应用模型值阶段会覆盖
UIInput Javadoc:
调试阶段:据我所知,您的问题与生命周期无关。您希望相应地填充SelectOne菜单中的所选项目。我是否正确?
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());
}