Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.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
JSF生命周期&x2013;选择一个菜单_Jsf_Lifecycle - Fatal编程技术网

JSF生命周期&x2013;选择一个菜单

JSF生命周期&x2013;选择一个菜单,jsf,lifecycle,Jsf,Lifecycle,我有一种行为,我不理解selectonemenu。我会试着解释,想知道是否有人知道发生了什么。我将JSF2与glassfish3一起使用。 我的xhtml代码如下: <h:selectOneMenu binding="#{cetBacking1.menuFamilies}" valueChangeListener="#{cetBacking1.listenerFamilia}" onchange="this.form

我有一种行为,我不理解selectonemenu。我会试着解释,想知道是否有人知道发生了什么。我将JSF2与glassfish3一起使用。 我的xhtml代码如下:

<h:selectOneMenu  binding="#{cetBacking1.menuFamilies}"
                  valueChangeListener="#{cetBacking1.listenerFamilia}"
                  onchange="this.form.submit()">
   <f:selectItems value="#{cetBacking1.ompleFamiliesTemplate()}"></f:selectItems>
</h:selectOneMenu>
<h:commandButton value="Test" type="submit" action="#{cetBacking1.test()}">    </h:commandButton>
 INFO: cetBacking1.ompleFamiliesTemplate   !!!!!! 
 INFO: cetBacking1.ompleFamiliesTemplate   !!!!!!
 INFO: cetBacking1.listenerFamilia: 1
 INFO: cetBacking1.listenerFamilia: 1
 INFO: cetBacking1.listenerFamilia: 1
 INFO: cetBacking1.listenerFamilia: 1
 INFO: cetBacking1.ompleFamiliesTemplate   !!!!!!
 INFO: cetBacking1.ompleFamiliesTemplate   !!!!!!
 INFO: cetBacking1.ompleFamiliesTemplate   !!!!!!
 INFO: cetBacking1.listenerFamilia: 2
 INFO: cetBacking1.listenerFamilia: 2 
 INFO: cetBacking1.listenerFamilia: 2
 INFO: cetBacking1.listenerFamilia: 2
 INFO: cetBacking1.listenerFamilia: 2
 INFO: cetBacking1.ompleFamiliesTemplate   !!!!!!
调用bean的{}函数,它调用cetBacking1.ompleFamiliesTemplate,第二个cetBacking1.ompleFamiliesTemplate由f:selectItems调用。它按预期工作。现在我更改SelectOne菜单的值,并在日志中显示:

 INFO: cetBacking1.ompleFamiliesTemplate   !!!!!!
 INFO: cetBacking1.ompleFamiliesTemplate   !!!!!!
 INFO: cetBacking1.listenerFamilia: 2
 INFO: cetBacking1.listenerFamilia: 2
 INFO: cetBacking1.ompleFamiliesTemplate   !!!!!!
对cetBacking1.ompleFamiliesTemplate的最后一次调用我认为是由f:selectItems调用的。但我不知道为什么一开始会调用两次cetBacking1.ompleFamiliesTemplate,然后调用两次listener cetBacking1.listenerFamilia。 但下一个对我来说更令人惊奇。我再次更改SelectOne菜单,并在日志中显示: 信息:cetBacking1.ompleFamiliesTemplate!!!!!! 信息:cetBacking1.ompleFamiliesTemplate!!!!!! 信息:cetBacking1.李斯特家族:3 信息:cetBacking1.李斯特家族:3 信息:cetBacking1.李斯特家族:3 信息:cetBacking1.ompleFamiliesTemplate

与以前一样,cetBacking1.ompleFamiliesTemplate在开始时会被调用两次,但侦听器会被调用三次。每次我更改SelectOne菜单时,侦听器都会被再次调用。如果我将selectOneMenu值更改两次,则日志如下所示:

<h:selectOneMenu  binding="#{cetBacking1.menuFamilies}"
                  valueChangeListener="#{cetBacking1.listenerFamilia}"
                  onchange="this.form.submit()">
   <f:selectItems value="#{cetBacking1.ompleFamiliesTemplate()}"></f:selectItems>
</h:selectOneMenu>
<h:commandButton value="Test" type="submit" action="#{cetBacking1.test()}">    </h:commandButton>
 INFO: cetBacking1.ompleFamiliesTemplate   !!!!!! 
 INFO: cetBacking1.ompleFamiliesTemplate   !!!!!!
 INFO: cetBacking1.listenerFamilia: 1
 INFO: cetBacking1.listenerFamilia: 1
 INFO: cetBacking1.listenerFamilia: 1
 INFO: cetBacking1.listenerFamilia: 1
 INFO: cetBacking1.ompleFamiliesTemplate   !!!!!!
 INFO: cetBacking1.ompleFamiliesTemplate   !!!!!!
 INFO: cetBacking1.ompleFamiliesTemplate   !!!!!!
 INFO: cetBacking1.listenerFamilia: 2
 INFO: cetBacking1.listenerFamilia: 2 
 INFO: cetBacking1.listenerFamilia: 2
 INFO: cetBacking1.listenerFamilia: 2
 INFO: cetBacking1.listenerFamilia: 2
 INFO: cetBacking1.ompleFamiliesTemplate   !!!!!!
问题是为什么在执行侦听器之前,当我更改selectOneMenu值时,会调用两次cetBacking1.ompleFamiliesTemplate。以及为什么监听器在我第一次更改selectOneMenu值时执行两次,然后每次更改该值时执行一次


在JSF中,可以在一个请求中多次调用getter。这里有一个很好的答案:

一个月前,我也有同样的问题。 解决方案是SessionScope和binding不兼容

您必须删除jsf页面中的绑定,一切正常。
要填充SelectCombo,您可以使用
列表
中的项目。

正如Jeremiah所回答的,您的具体问题是您使用了getter方法来处理业务逻辑。这是错误的。如果您使用的是JSF2.x,请不要过多地关注JSF1.x目标书籍/资源。无论您想要实现什么,都可以通过
轻松完成。