Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JSF1.2生命周期理解:执行ValueChangeListener#2_Java_Jsf_Jsf 1.2 - Fatal编程技术网

Java JSF1.2生命周期理解:执行ValueChangeListener#2

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="#{

我正在为我的应用程序使用JSFv1.2。这是一个类似于这个线程的问题(由BalusC回答),几天前我将其标记为已回答

这次没有
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());
}